I thought the problem is on my side...
The whole sketch:
//---assign pins--------------------------------------------------
// order buttons
const int CommandButton_0 = 2;
const int CommandButton_1 = 3;
const int CommandButton_2 = 4;
// position switches
const int FloorSwitch_0 = 5;
const int FloorSwitch_1 = 6;
const int FloorSwitch_2 = 7;
// door opener
const int DoorButton_0 = 8;
const int DoorButton_1 = 9;
const int DoorButton_2 = 10;
// savety
const int Door = 11;
const int DoorOpener_0 = A2;
const int DoorOpener_1 = A3;
const int DoorOpener_2 = A4;
// motor
const int Motor_up = A0;
const int Motor_down = A1;
// other
const int Light = A5;
// light things
const long LightTime = 10000;
unsigned long TimerStart = 0;
// --------------------------------------------------
// --------------------------------------------------
// positions
const int Floor_0 = 0;
const int Floor_1 = 1;
const int Floor_2 = 2;
const int Floor_Nowhere = 999;
// movement
boolean IsMovingUp = false;
boolean IsMovingDown = false;
boolean IsMoving = false;
// where we are and where to go
int TargetStation = Floor_Nowhere;
int CurrentStation = Floor_Nowhere;
// --------------------------------------------------
void setup() {
Serial.begin(9600);
pinMode(FloorSwitch_0, INPUT);
pinMode(FloorSwitch_1, INPUT);
pinMode(FloorSwitch_2, INPUT);
pinMode(CommandButton_0, INPUT);
pinMode(CommandButton_1, INPUT);
pinMode(CommandButton_2, INPUT);
pinMode(Door, INPUT);
pinMode(DoorOpener_0, OUTPUT);
pinMode(DoorOpener_1, OUTPUT);
pinMode(DoorOpener_2, OUTPUT);
pinMode(DoorButton_0, INPUT);
pinMode(DoorButton_1, INPUT);
pinMode(DoorButton_2, INPUT);
pinMode(Motor_up, OUTPUT);
pinMode(Motor_down, OUTPUT);
pinMode(Light, OUTPUT);
MoveStop();
digitalWrite(Light, HIGH);
digitalWrite(DoorOpener_0, HIGH);
digitalWrite(DoorOpener_1, HIGH);
digitalWrite(DoorOpener_2, HIGH);
//digitalWrite(FloorSwitch_2,HIGH);
}
void loop() {
CurrentStationRead(); // where are we?
TargetRead(); // read command
DoorClosed(); // are the doors closed?
TimerCheck(); // time to switch off the light?
DoorOpen();//door buttons
if (TargetStation == Floor_0 )
{
switch (CurrentStation) {
case Floor_0:
MoveOver(69);
MoveStop();
break;
case Floor_1:
MoveDown();
break;
case Floor_2:
MoveDown();
break;
case Floor_Nowhere:
MoveDown();
break;
}
}
if (TargetStation == Floor_1 )
{
switch (CurrentStation) {
case Floor_0: // ist unten
MoveUp();
break;
case Floor_1:// ist schon da
if (IsMovingDown == true) MoveOver(74);
if (IsMovingUp == true) MoveOver(69);
MoveStop();
break;
case Floor_2: // ist oben
MoveDown();
break;
case Floor_Nowhere:
/*
on reset, when position is unknown, we can't move to Floor_1
this is impossible as we must know where we are
if (MovingUp == true) MoveUp();
if (MovingDown == true) MoveDown();
if (IsMoving == false) MoveUp();
*/
break;
}
}
if (TargetStation == Floor_2 )
{
switch (CurrentStation) {
case Floor_0:
MoveUp();
break;
case Floor_1:
MoveUp();
break;
case Floor_2:
MoveOver(74);
MoveStop();
break;
case Floor_Nowhere:
MoveUp();
break;
}
}
// ---END-----------------------------------------------
}
//--------------------------------------------------
void MoveStop() {
digitalWrite(Motor_up, HIGH);
digitalWrite(Motor_down, HIGH);
TargetStation = Floor_Nowhere;
IsMovingUp = false;
IsMovingDown = false;
IsMoving = false;
}
//--------------------------------------------------
//--------------------------------------------------
void MoveUp() {
digitalWrite(Motor_up, LOW);
IsMovingUp = true;
IsMoving = true;
}
//--------------------------------------------------
//--------------------------------------------------
void MoveDown() {
digitalWrite(Motor_down, LOW);
IsMovingDown = true;
IsMoving = true;
}
//--------------------------------------------------
//--------------------------------------------------
void DoorClosed() {
if (digitalRead(Door) == LOW) //door is open
{
TargetStation = Floor_Nowhere;
digitalWrite(Motor_up, HIGH);
digitalWrite(Motor_down, HIGH);
IsMovingUp = false;
IsMovingDown = false;
IsMoving = false;
TimerSet();
}
}
//--------------------------------------------------
//--------------------------------------------------
void TargetRead() {
if (IsMoving == false)
{
if (digitalRead(CommandButton_0) == HIGH) TargetStation = Floor_0;
if (digitalRead(CommandButton_1) == HIGH) TargetStation = Floor_1;
if (digitalRead(CommandButton_2) == HIGH) TargetStation = Floor_2;
delay(50);
if (TargetStation < Floor_Nowhere)
{
Serial.print("Commanded Target: ");
Serial.println(TargetStation);
}
}
}
//--------------------------------------------------
//--------------------------------------------------
void CurrentStationRead() {
CurrentStation = Floor_Nowhere;
if (digitalRead(FloorSwitch_0) == HIGH) CurrentStation = Floor_0;
if (digitalRead(FloorSwitch_1) == HIGH) CurrentStation = Floor_1;
if (digitalRead(FloorSwitch_2) == HIGH) CurrentStation = Floor_2;
}
//--------------------------------------------------
//--------------------------------------------------
void MoveOver(short mm) {
short msec_per_mm = 3.036;
delay(mm * msec_per_mm);
}
//--------------------------------------------------
//--------------------------------------------------
void TimerSet() {
TimerStart = millis();
digitalWrite(Light, LOW);
}
//--------------------------------------------------
//--------------------------------------------------
void TimerCheck() {
unsigned long Now = millis();
if (IsMoving == true) TimerSet();
if (Now - TimerStart >= LightTime) digitalWrite(Light, HIGH);
}
//--------------------------------------------------
//--------------------------------------------------
void DoorOpen() {
if (IsMoving == true)
{
digitalWrite(DoorOpener_0, HIGH);
digitalWrite(DoorOpener_1, HIGH);
digitalWrite(DoorOpener_2, HIGH);
return;
}
switch (CurrentStation) {
case Floor_0:
if (digitalRead(DoorButton_0) == HIGH) //door button is pressed
{
digitalWrite(DoorOpener_0, LOW);
TimerSet();
}
else
{
digitalWrite(DoorOpener_0, HIGH);
}
break;
case Floor_1:
if (digitalRead(DoorButton_1) == HIGH) //door button is pressed
{
digitalWrite(DoorOpener_1, LOW);
TimerSet();
}
else
{
digitalWrite(DoorOpener_1, HIGH);
}
break;
case Floor_2:
if (digitalRead(DoorButton_2) == HIGH) //door button is pressed
{
digitalWrite(DoorOpener_2, LOW);
TimerSet();
}
else
{
digitalWrite(DoorOpener_2, HIGH);
}
break;
case Floor_Nowhere:
digitalWrite(DoorOpener_0, HIGH);
digitalWrite(DoorOpener_1, HIGH);
digitalWrite(DoorOpener_2, HIGH);
break;
}
}
//--------------------------------------------------