const int reversepin = 10; const int ignitionpin = 11; const int mupin = 12; const int mdpin = 9; const int wpin = 8; const int diepin = 7; int ReverseState = 0; int IgnitionState = 1; // Ignition will be on when arduino starts int ReversePrevState = 0; int IgnitionPrevState = 1; // Ignition will be on when arduino starts const int TimeWindows = 1250; // x4 iterations const int TimeMirrorsUp = 195; // (less than TimeMirrorsDown to compensate servos mismatch - up servos are faster) x4 iterations const int TimeMirrorsDown = 250; // x4 iterations unsigned long MirrorsTime = 0; unsigned long MirrorsTimeStart = 0; const int DieDelay = 5000; // x4 iterations int MirrIteration = 0; void setup() { // Serial.begin(9600); pinMode(mupin, OUTPUT); pinMode(mdpin, OUTPUT); pinMode(wpin, OUTPUT); pinMode(diepin, OUTPUT); pinMode(reversepin, INPUT); pinMode(ignitionpin, INPUT); //Initialise digitalWrite(mupin, LOW); digitalWrite(mdpin, LOW); digitalWrite(wpin, LOW); digitalWrite(diepin, HIGH); } void loop() { // delay(5000); IgnitionState = digitalRead(ignitionpin); ReverseState = digitalRead(reversepin); if (ReverseState != ReversePrevState) { if (ReverseState == HIGH) { mirrorsDOWN(); } else { mirrorsUP(); } } if ((IgnitionState == LOW) && (IgnitionState != IgnitionPrevState)) { turnOff(); } // Serial.print("IgnitionState:"); // Serial.println(IgnitionState); // Serial.print("ReverseState:"); // Serial.println(ReverseState); delay(100); IgnitionPrevState = IgnitionState; ReversePrevState = ReverseState; } void turnOff() { // if(ReverseState == HIGH) { // mirrorsUP(); // ReverseState = LOW; // ReversePrevState = ReverseState; // } windowsUP(); } void windowsUP() { digitalWrite(wpin, HIGH); for (int i = 0; i < 4; i++) { delay(TimeWindows); if (digitalRead(ignitionpin)) { break; } } digitalWrite(wpin, LOW); waitanddie(); } void mirrorsUP() { digitalWrite(mupin, HIGH); for (; MirrIteration >= 0; MirrIteration--) { if (MirrorsTime > TimeMirrorsUp) { delay(TimeMirrorsUp); MirrorsTime = MirrorsTime - TimeMirrorsUp; } else { delay(MirrorsTime); break; } if (digitalRead(reversepin)) { if(MirrIteration > 0) { MirrIteration--; } break; } } digitalWrite(mupin, LOW); MirrorsTime = 0; } void mirrorsDOWN() { digitalWrite(mdpin, HIGH); MirrorsTimeStart = millis(); for (MirrIteration = 0; MirrIteration < 4; MirrIteration++) { delay(TimeMirrorsDown); if (!digitalRead(reversepin)) { if (MirrIteration < 3) MirrIteration++; break; } } digitalWrite(mdpin, LOW); MirrorsTime = millis() - MirrorsTimeStart; } void waitanddie() { for (int i = 0; i < 4; i++) { delay(DieDelay); if (digitalRead(ignitionpin)) { break; } if (i == 3) { // User did not turn the key again so, die! die(); } } } void die() { digitalWrite(diepin, LOW); }