const int PIN_PANIC_BUTTON = 2; // Input Panic Button (low trigger)
const int PIN_DOOR1 = 3; // Input Door 1 (low trigger)
const int PIN_DOOR2 = 4; // Input Door 2 (low trigger)
const int PIN_ACC = 5; // Input ACC (high trigger)
const int PIN_IMMOBILIZER = 6; // Input Immobilizer (low trigger)
const int PIN_RELOCK_ACTUATOR = 7; // Input Relock Actuator (low trigger)
const int PIN_ACTIVATE_ELOCK = 8; // Input Activate E-Lock (low trigger)
const int PIN_RELEASE_ELOCK = 9; // Input Release E-Lock (low trigger)
const int PIN_ACTIVATE_ACTUATOR = 10; // Input Activate Actuator (high trigger)
const int PIN_DEACTIVATE_ACTUATOR = 11; // Input Deactivate Actuator (high trigger)
const int PIN_PANIC_OUTPUT = 12; // Output Panic Button
const int PIN_DOOR1_OUTPUT = 13; // Output Door 1
const int PIN_DOOR2_OUTPUT = 14; // Output Door 2 (A0)
const int PIN_HORN = 15; // Output Horn (A1)
const int PIN_RELAY_IMMOBILIZER = 16; // Output Relay Immobilizer (A2)
const int PIN_HAZARD_LIGHT = 17; // Output Hazard Light (A3)
const int PIN_ACTIVATE_ELOCK_OUT = 18; // Output Activate E-Lock (A4)
const int PIN_RELEASE_ELOCK_OUT = 19; // Output Release E-Lock (A5)
const int PIN_ACTIVATE_ACTUATOR_OUT = 0; // Output Activate Actuator
const int PIN_DEACTIVATE_ACTUATOR_OUT = 1; // Output Deactivate Actuator
bool prevImmobilizer = HIGH;
bool prevActivateActuator = LOW;
bool prevDeactivateActuator = LOW;
bool prevRelockActuator = HIGH;
bool prevActivateELock = HIGH;
bool prevReleaseELock = HIGH;
bool activateActuatorActive = false;
unsigned long activateActuatorStartTime = 0;
bool deactivateActuatorActive = false;
unsigned long deactivateActuatorStartTime = 0;
bool activateELockActive = false;
unsigned long activateELockStartTime = 0;
bool releaseELockActive = false;
unsigned long releaseELockStartTime = 0;
unsigned long lastBlinkTime = 0;
bool blinkState = false;
bool immobilizerRelayActive = false;
unsigned long immobilizerRelayStartTime = 0;
void setup() {
pinMode(PIN_PANIC_BUTTON, INPUT_PULLUP);
pinMode(PIN_DOOR1, INPUT_PULLUP);
pinMode(PIN_DOOR2, INPUT_PULLUP);
pinMode(PIN_IMMOBILIZER, INPUT_PULLUP);
pinMode(PIN_ACTIVATE_ELOCK, INPUT_PULLUP);
pinMode(PIN_RELEASE_ELOCK, INPUT_PULLUP);
pinMode(PIN_RELOCK_ACTUATOR, INPUT_PULLUP);
pinMode(PIN_ACC, INPUT);
pinMode(PIN_ACTIVATE_ACTUATOR, INPUT);
pinMode(PIN_DEACTIVATE_ACTUATOR, INPUT);
pinMode(PIN_PANIC_OUTPUT, OUTPUT);
pinMode(PIN_DOOR1_OUTPUT, OUTPUT);
pinMode(PIN_DOOR2_OUTPUT, OUTPUT);
pinMode(PIN_HORN, OUTPUT);
pinMode(PIN_RELAY_IMMOBILIZER, OUTPUT);
pinMode(PIN_HAZARD_LIGHT, OUTPUT);
pinMode(PIN_ACTIVATE_ACTUATOR_OUT, OUTPUT);
pinMode(PIN_DEACTIVATE_ACTUATOR_OUT, OUTPUT);
pinMode(PIN_ACTIVATE_ELOCK_OUT, OUTPUT);
pinMode(PIN_RELEASE_ELOCK_OUT, OUTPUT);
digitalWrite(PIN_PANIC_OUTPUT, LOW);
digitalWrite(PIN_DOOR1_OUTPUT, LOW);
digitalWrite(PIN_DOOR2_OUTPUT, LOW);
digitalWrite(PIN_HORN, LOW);
digitalWrite(PIN_RELAY_IMMOBILIZER, LOW);
digitalWrite(PIN_HAZARD_LIGHT, LOW);
digitalWrite(PIN_ACTIVATE_ACTUATOR_OUT, LOW);
digitalWrite(PIN_DEACTIVATE_ACTUATOR_OUT, LOW);
digitalWrite(PIN_ACTIVATE_ELOCK_OUT, LOW);
digitalWrite(PIN_RELEASE_ELOCK_OUT, LOW);
}
void loop() {
bool currentImmobilizer = digitalRead(PIN_IMMOBILIZER);
bool currentACC = digitalRead(PIN_ACC);
bool currentPanicButton = digitalRead(PIN_PANIC_BUTTON);
bool currentDoor1 = digitalRead(PIN_DOOR1);
bool currentDoor2 = digitalRead(PIN_DOOR2);
bool currentActivateActuator = digitalRead(PIN_ACTIVATE_ACTUATOR);
bool currentDeactivateActuator = digitalRead(PIN_DEACTIVATE_ACTUATOR);
bool currentRelockActuator = digitalRead(PIN_RELOCK_ACTUATOR);
bool currentActivateELock = digitalRead(PIN_ACTIVATE_ELOCK);
bool currentReleaseELock = digitalRead(PIN_RELEASE_ELOCK);
bool immobilizerActive = (currentImmobilizer == LOW);
bool accActive = (currentACC == HIGH);
if (millis() - lastBlinkTime >= 500) {
blinkState = !blinkState;
lastBlinkTime = millis();
}
digitalWrite(PIN_HAZARD_LIGHT, immobilizerActive ? blinkState : LOW);
digitalWrite(PIN_HORN, (immobilizerActive && accActive) ? blinkState : LOW);
digitalWrite(PIN_PANIC_OUTPUT, (currentPanicButton == LOW) ? HIGH : LOW);
digitalWrite(PIN_DOOR1_OUTPUT, (currentDoor1 == LOW) ? HIGH : LOW);
digitalWrite(PIN_DOOR2_OUTPUT, (currentDoor2 == LOW) ? HIGH : LOW);
if (!immobilizerRelayActive && accActive && currentImmobilizer == LOW) {
immobilizerRelayActive = true;
immobilizerRelayStartTime = millis();
}
if (immobilizerRelayActive) {
if (millis() - immobilizerRelayStartTime >= 5000) {
digitalWrite(PIN_RELAY_IMMOBILIZER, HIGH);
}
if (currentImmobilizer == HIGH) {
digitalWrite(PIN_RELAY_IMMOBILIZER, LOW);
immobilizerRelayActive = false;
}
} else {
digitalWrite(PIN_RELAY_IMMOBILIZER, LOW);
}
bool immobilizerFalling = (prevImmobilizer == HIGH && currentImmobilizer == LOW);
bool immobilizerRising = (prevImmobilizer == LOW && currentImmobilizer == HIGH);
bool activateActuatorRising = (prevActivateActuator == LOW && currentActivateActuator == HIGH);
bool deactivateActuatorRising = (prevDeactivateActuator == LOW && currentDeactivateActuator == HIGH);
bool relockActuatorFalling = (prevRelockActuator == HIGH && currentRelockActuator == LOW);
bool activateELockFalling = (prevActivateELock == HIGH && currentActivateELock == LOW);
bool releaseELockFalling = (prevReleaseELock == HIGH && currentReleaseELock == LOW);
if (!activateActuatorActive) {
if (immobilizerFalling ||
(currentImmobilizer == HIGH && activateActuatorRising) ||
(currentImmobilizer == LOW && relockActuatorFalling)) {
deactivateActuatorActive = false;
delay(15);
activateActuatorActive = true;
activateActuatorStartTime = millis();
}
}
if (!deactivateActuatorActive) {
if (immobilizerRising ||
(currentImmobilizer == HIGH && deactivateActuatorRising)) {
activateActuatorActive = false;
deactivateActuatorActive = true;
delay(15);
deactivateActuatorStartTime = millis();
}
}
if (!activateELockActive && activateELockFalling) {
releaseELockActive = false;
delay(10);
activateELockActive = true;
activateELockStartTime = millis();
}
if (!releaseELockActive && releaseELockFalling) {
activateELockActive = false;
delay(10);
releaseELockActive = true;
releaseELockStartTime = millis();
}
if (activateActuatorActive) {
if (millis() - activateActuatorStartTime < 1500) {
digitalWrite(PIN_ACTIVATE_ACTUATOR_OUT, HIGH);
} else {
digitalWrite(PIN_ACTIVATE_ACTUATOR_OUT, LOW);
activateActuatorActive = false;
}
} else {
digitalWrite(PIN_ACTIVATE_ACTUATOR_OUT, LOW);
}
if (deactivateActuatorActive) {
if (millis() - deactivateActuatorStartTime < 1500) {
digitalWrite(PIN_DEACTIVATE_ACTUATOR_OUT, HIGH);
} else {
digitalWrite(PIN_DEACTIVATE_ACTUATOR_OUT, LOW);
deactivateActuatorActive = false;
}
} else {
digitalWrite(PIN_DEACTIVATE_ACTUATOR_OUT, LOW);
}
if (activateELockActive) {
if (millis() - activateELockStartTime < 10000) {
digitalWrite(PIN_ACTIVATE_ELOCK_OUT, HIGH);
} else {
digitalWrite(PIN_ACTIVATE_ELOCK_OUT, LOW);
activateELockActive = false;
}
} else {
digitalWrite(PIN_ACTIVATE_ELOCK_OUT, LOW);
}
if (releaseELockActive) {
if (millis() - releaseELockStartTime < 10000) {
digitalWrite(PIN_RELEASE_ELOCK_OUT, HIGH);
} else {
digitalWrite(PIN_RELEASE_ELOCK_OUT, LOW);
releaseELockActive = false;
}
} else {
digitalWrite(PIN_RELEASE_ELOCK_OUT, LOW);
}
prevImmobilizer = currentImmobilizer;
prevActivateActuator = currentActivateActuator;
prevDeactivateActuator = currentDeactivateActuator;
prevRelockActuator = currentRelockActuator;
prevActivateELock = currentActivateELock;
prevReleaseELock = currentReleaseELock;
}