Lift with Arduino

Hi! It's my first message here so, hello everybondy :)

I have a school project: A 4 floors Lift.

I would like to know how could i store all the differents calls, make the motor turn and receive all the data from my sensors IN THE SAME TIME :)

I have 7 Magnetics sensors: 1 per floor, and 1 between 2 floors to slow the hoist.

Could you help me? Thank you :)

Once you understand the control algorithm you want to use, you can think about implementing that in code. But you need to understand the algorithm first.

Imagine that you are a lift operator. Each sensor you listed operates an indicator lamp that you can see - you have switches to make the lift go up or down and open/close the doors. Also assume that your short term memory is useless - you have to write everything down to remember it. How would you go about operating the lift?

Hi PeterH,

thank you for your answer.

So about my lift:

  • 4 floors
  • 7 magnetics sensors (4 to stop the lift when arrived to the floor and 3 between to slow it before the stop)
  • 4 contacts switches to verify if the doors are closed
  • 4 contact switches to verify that the Lock is activated
  • 10 buttons to call the lift (1 at level 1 (you can just go up) + 1 at level 4 (you can just go down) + 2 buttons at level 2 + 2 button at level 3 + 4 button inside the hoist

I don't understand what you mean with "Also assume that your short term memory is useless". I would like to store if someone call the lift when the lift is already in use.

Thank you :)

Neorobot: I don't understand what you mean with "Also assume that your short term memory is useless". I would like to store if someone call the lift if te lift is already in use.

I want you to write down the things you would need to remember in order to operate the lift, to force you to think about what things you need to remember. These will eventually become variables in your sketch.

For example, if somebody pushes a 'call' button and then releases it, you probably want to remember that it has been pressed, because their need for a lift doesn't stop when they let go of the button.

Hi, i have an idea on how it will work but it's hard to translate that in program.

So, when I turn on the arduino, i would like a kind of Initialisation. So the lift checks that it's in the bottom of the structure (floor 0 ).

And, from that "point", it's waiting for a call. For example, the lift is at level 0, it's called at floor 2, it speeds up, and when it arrives at level 1,5 it speeds down and stops at floor 2.

Now, I imagine that the lift is moving, i have absolutely no idea how i can "rember" a push on a button WHILE the motor is turning.

thank you :)

EDIT: I also have to respect the priority. If the guy at floor 1 want to go at Floor 3 and that a guy in floor 2 also want to go to floor 3, so the lift has to stop at floor 2 before going to 3. So I suppose I will have a VAR for the direction :)

A little pic of the structure :)

it’s hard to translate that in programming.

That’s exactly the point Peter is making, and is why he’s encouraging you to get the procedure clear in your head before you go anywhere near the IDE to start writing the program. Design first, construct second…

Thank you for you answer!

So I would think like that:

1) Initialisation at the Start of the arduino (Lift at level 0) (make the motor turning down while the lift is not at floor 0) 2) Waiting a call - if just one call -> go to the correct floor - if there is another call -> verify if this guy want to go up or go down - if one guy is inside the lift and going in one direction (up for example) and that someone call the lift to go in the same direction, so the lift will stop to take this guy.

if one guy is inside the lift and going in one direction but that a guy is calling the lift to go down, so the guy inside has the priority.

Neorobot:
Hi, i have an idea on how it will work but it’s hard to translate that in programming.

So, when I turn on the arduino, i would like a kind of Initialisation. So the lift verify that it’s in the bottom of the structure (floor 0 ).

What if it’s not at floor 0 when you turn it on?

And, from that “point”, it’s waiting for a call. For example, the lift is at level 0, it’s called at floor 2, it speeds up, and when it arrives at level 1,5 it speeds down and stops at floor 2.

now, i imagine that the lift is moving, i have absolutely no idea how i can “rember” a push on a button WHILE the motor is turning.

Set the motor running
Start checking
Check the buttons and position switches (save the results in variables)
Has lift reached the point where it needs to slow down?
If it hasn’t, go to start checking
If it has, slow the motor.
Has lift reached the floor?
If it hasn’t, go to start checking
If it has, stop the motor, open the doors
Now see what buttons have been pressed and act on those.

EDIT: I also have to respect the priority. If the guy at floor 1 want to go at Floor 3 and that a guy in floor 2 also want to go to floor 3, so the lift has to stop at floor 2 before going to 3. So I suppose I will have a VAR for the direction of travel :slight_smile:

And one for each position switch and one for each push button and one for each set of doors (to know whether they are open or shut).

Other things to think about are, if the lift is on, say, level 3, is empty and no buttons have been pressed, does it stay there or does it return to level 0? Do the doors stay open or do they close when the lift is inactive?

Hi Henry,

What if it's not at floor 0 when you turn it on?

When the arduino is powered on, if the lift is already at floor 0, it doesn't move and if it's not at floor 0, the motor will turn while it's not at floor 0 (detected with a magnetic sensor).

And one for each position switch and one for each push button and one for each set of doors (to know whether they are open or shut).

I will receive the "state" of the doors in I2C, so il will receive a number from my PCF8574, translate that in binary and i will know the doors that are opened (0), closed(1), Unlocked(0), Locked(1)

Other things to think about are, if the lift is on, say, level 3, is empty and no buttons have been pressed, does it stay there or does it return to level 0? Do the doors stay open or do they close when the lift is inactive?

In a first time, i would like the lift to stay at the level where it stopped (no return if empty) :)

A thing that i dont understand is how, for exemple, to make tho motor speed down while I check the button. because you wrote that like "steps" but how to do that in the same time? How can i decrease the speed (PWM) in a loop WHILE I check the buttons?

thank you very much ;)

How can i decrease the speed (PWM) in a loop WHILE I check the buttons?

Have a look at the blink without delay example in the IDE for clues.

For the blink without delay, a decrement is used. So if I'm right, I have to decrement the speed of the motor at each cycle of the main loop and not create a special decrement loop ?

I have to decrement the speed of the motor at each cycle of the main loop

No, because you don't know how long the main loop takes to execute. You need to decrease the speed of the motor at known intervals.

For the blink without delay, a decrement is used.

It is?

I have misunderstand ! It's ok now, and actually there's no decrement in that part of code.

Could you just give me more details about saving all the "calls", do I have to use an array?

thanks for your help!

I'd probably forget the calls for now, and concentrate on moving the car between any floor, without using delay. But yes, arrays will be useful.

Ok, I will start with that for the moment and I think you'll see me again soon :D

Thank you!

I'm back :)

For the moment all is ok but i need your help about tabs.

I would like to put all my VAR in a different tab than the main tab but there editor says me that it can't find this var.

could you help me?

thank you

I would like to put all my VAR in a different tab than the main tab

You mean you want to put global variables in a tab other than your main sketch? Why?

I would like to put all my "#DEFINE " in a tab because i have a lot of them

And if it's not possible for the define, at least all my functions

If you want to put #defines and type definitions in a separate file, put them in a header (.h) file and #include that into your sketch file.

If you want to put variable definitions in a separate file, put the definitions in a source (.cpp) file and put the corresponding declarations in a header (.h) file and #include the header file in your sketch file. By convention, the name of the header file should be the same as the source file, just with the extension changed.

Ok, I’ll try that !

Thank you PeterH :wink: