VoltUino

فولتوينو مدونة تقنية وتعليمية

آخر الأخبار

جاري التحميل ...

Elevator System using Arduino in Proteus (مصعد كهربائي)

 تصميم مصعد كهربائي وعمل محاكاة في البروتس

Elevator System



Content :

1.         flow chart of the Arduino based four floors elevator.

2.         The Block Diagram of the Elevator Control System.

3.         Used electronic component and circuit schematic in proteus.

4.         Arduino Code.




رابط تحميل ملف الاردوينو وملف البروتس 

كود برنامج الاردوينو 

/* 
   prepared by Eng. M. Mohamedein Maghraby
   visit youtube channel:
   https://www.youtube.com/MohamedeinMaghraby
*/

#include <Keypad.h> 
#include <Wire.h> 
//include the Liquid Crystal I2C libaray version:1.1
#include <LiquidCrystal_I2C.h>

////define kepad  parameters
const byte ROWS = 4; //keypad rows number
const byte COLS = 3; //keypad columns number
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {3, 2, 1, 0}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {6, 5, 4}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
////end of kepad definition

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

char CurrentFloor ; // inicate the current state of the elevator 1 means 1st Floor
char RequestedFloor; // the requested floor that the elevator need to go to. 0 means no request.

//sensors (limit switchs) at every door to insure that the specified floor 
//is accessed by the elevator.
byte Sensor1=7; // limit switch for presence of elevator at the 1st Floor
byte Sensor2=8; // limit switch for presence of elevator at the 2nd Floor 
byte Sensor3=9; // limit switch for presence of elevator at the 3rd Floor 
byte Sensor4=10; // limit switch for presence of elevator at the 4th Floor 

byte MovingUpLED = A1; // indicator led for moving down using anlaog pin in digatal mode
byte MovingDownLED = A0; // indicator led for moving up using anlaog pin in digatal mode

// declare the Motor pins
byte MotorPin1 = 12; 
byte MotorPin2 = 13;
byte MotorSpeed = 11; //use PWM pin (11) to set motor speed

//password for 4th floor authentication
char password[] = {'1', '2' , '3', '4'}; 

void setup() 
{
  // initialize the lcd
  lcd.init();   
  lcd.backlight();
  
  // initialize the motor pins as output  
  pinMode(MotorPin1, OUTPUT); 
  pinMode(MotorPin2, OUTPUT); 
  pinMode(MotorSpeed, OUTPUT); 

  // assign the Floor accessing sensors as input
  pinMode(Sensor1,INPUT);
  pinMode(Sensor2,INPUT);
  pinMode(Sensor3,INPUT);
  pinMode(Sensor4,INPUT);
  
  // assign the indicators' leds as output.
  pinMode(MovingUpLED, OUTPUT); 
  pinMode(MovingDownLED, OUTPUT); 
  
  //initialize motor statue  
  digitalWrite(MotorPin1, LOW);  
  digitalWrite(MotorPin2, LOW);
  digitalWrite(MotorSpeed, 0);

  //turn off motion led indicator for no motion  
  digitalWrite(MovingUpLED, LOW);  
  digitalWrite(MovingDownLED, LOW);
  
  CurrentFloor = '1'; 
  RequestedFloor=-1;
}

void loop()
{
 
  CurrentFloor = checkCurrentFloor();
  // display a message on the LCD to indecate the current Floor of the elevator
  printCurrentFloor();
 
  //listen to floor requests.
  RequestedFloor = keypad.getKey();
  
  // check if a valid key presssed 
  if ((RequestedFloor =='1' || RequestedFloor =='2' || RequestedFloor =='3'|| RequestedFloor =='4' ))
      {
        manipulateRequest();  // excute the function to manipulate request.      
      }
}
////////////////////// End of Void Loop


//////////////////////////
/////aiding functions
//////////////////////////////

//fuction used to move the elevator based on the requested floor.
void manipulateRequest()
{
      //authenticate the usere if requesting the 4th floor
      if(RequestedFloor == '4') 
         if (!checkPassword()) // reset the request and end if the password is wrong
              {
                RequestedFloor = -1; // reset requests  
                return ; // end function excution.
              }
              
      if( RequestedFloor > CurrentFloor ) // if requesting upper floor
        { 
          while(RequestedFloor > CurrentFloor) // don't break untill reaching the destination
          {
            up(); // move up as long as the currentfloor < requested floor          
            
            digitalWrite(MovingUpLED, HIGH); // light the moving up green LED indicator             
           
            //update the reached current floor by checking the sensors while moving.
            CurrentFloor = checkCurrentFloor();            
            // display the status of the reached current Floor 
            printCurrentFloor();
            
            ////// floor request interrupt while moving up
            char NewReqFloor = keypad.getKey(); // get the interrupting floor request          
            // if the interrupting floor request is valid 
            if ( NewReqFloor > CurrentFloor && NewReqFloor < RequestedFloor )              
             RequestedFloor = NewReqFloor; //if valid then change the destination. 
          }
        }   
      
      else if( RequestedFloor < CurrentFloor ) // if requesting down floor
       {
          while( RequestedFloor < CurrentFloor ) // don't break untill reaching the destination
          {
            down(); // move down as long as the CurrentFloor > Requested floor            
            
            digitalWrite(MovingDownLED, HIGH); // Light the moving down RED LED indicator            
            
            //update the reached current floor by checking the sensors while moving.
            CurrentFloor = checkCurrentFloor();           
            // display the status of the reached current Floor 
            printCurrentFloor();
            
            ////// floor request interrupt while moving up
            char NewReqFloor = keypad.getKey(); // get the interrupting floor request          
            //byte NewReqFloor = (byte)String(rf).toInt(); // convert char to byte 
            // if the interrupting floor request is valid 
            if ( NewReqFloor < CurrentFloor && NewReqFloor > RequestedFloor )              
             RequestedFloor = NewReqFloor; //if valid then change the destination. 

          }
        }  
      
      ///////////// End of the Floor request
      stop(); // stop moving
      digitalWrite(MovingUpLED, LOW);  
      digitalWrite(MovingDownLED, LOW); 
      RequestedFloor = -1; // reset requests  
}


//moving up the elvator (forward motor direction)
void up()
{
  digitalWrite(MotorPin1, HIGH);
  digitalWrite(MotorPin2, LOW); 
  analogWrite(MotorSpeed, 125); // run on half speed
}

//moving down the elvator (backward motor direction)
void down()
{
  digitalWrite(MotorPin1, LOW);
  digitalWrite(MotorPin2, HIGH); 
  analogWrite(MotorSpeed, 125); // run on half speed
}
void stop()
{
  digitalWrite(MotorPin1, LOW);
  digitalWrite(MotorPin2, LOW); 
  analogWrite(MotorSpeed, 0); 
}

//check for the reached currentFloor by checking the limit switchs
//in every floor and return the currnt value
char checkCurrentFloor()
{
    if( digitalRead(Sensor1)) 
        return '1';
    else if( digitalRead(Sensor2)) 
        return '2';
    else if( digitalRead(Sensor3)) 
        return '3';
    else if( digitalRead(Sensor4)) 
        return '4';
    else 
         return CurrentFloor; // latch last state
}


//perform authetication and return true if authenticated
bool checkPassword()
{
  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Enter password!");
  
  byte counter = 0; 
  char pass[4]; // temp password array to store the entered password
  
  while(counter < 4) // listen for the kepad
  { 
    char key = keypad.getKey();
    if(key)
    {      
      pass[counter] = key; // store the temp input password digit.
      
      lcd.setCursor(counter,1);
      lcd.print(key); // show the entered digit two the user on the LCD
      delay(300);
      
      lcd.setCursor(counter,1);
      lcd.print('*'); // hide the entered digit after a while with "*".
      
      counter++;      
    }   
  }
  
   for (int i=0; i<sizeof(pass); i++) 
   if (pass[i] != password[i]) // if one element voilate equality exit.
   {
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("Wrong Password");
     lcd.setCursor(0,1);
     lcd.print("rerequest floor"); 
     delay(500);
     lcd.clear();
     
     return false; 
   }
   
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Authenticated");
   delay(500);
   lcd.clear();
   return true; //return true if all the element are equal.
}

//lcd display aiding function
void printCurrentFloor()
{
    lcd.setCursor(3,0);
    lcd.print("You are on");
    
    lcd.setCursor(2,1);
  
    if(CurrentFloor == '1')
      lcd.print("the " + String(CurrentFloor) + "st Floor");
    if(CurrentFloor == '2')
      lcd.print("the " + String(CurrentFloor) + "nd Floor");
    if(CurrentFloor == '3')
      lcd.print("the " + String(CurrentFloor) + "rd Floor");
    if(CurrentFloor > '3')
      lcd.print("the " + String(CurrentFloor) + "th Floor");
}




عن الكاتب

Eng. M. Mohamedein Maghraby

التعليقات


اتصل بنا

إذا أعجبك محتوى مدونتنا نتمنى البقاء على تواصل دائم ، فقط قم بإدخال بريدك الإلكتروني للإشتراك في بريد المدونة السريع ليصلك جديد المدونة أولاً بأول ، كما يمكنك إرسال رساله بالضغط على الزر المجاور ...

جميع الحقوق محفوظة

VoltUino