// Pin configuration
const int relayAct1 = 2;
const int relayAct2 = 3;
const int relayIDT_Counter3 = 4;
const int relayLedGreen4 = 8;
const int relayLedBlue5 = 9;
const int relayLedRed6 = 10;
const int inputSensor = 6;
const int inputTasterT2 = 7;
// Global variables
unsigned long startTimeAct2;
unsigned long startTimeAct1;
unsigned long startTimeIDT;
unsigned long startTimeRelay1;
unsigned long startTimeRelay2;
unsigned long lastSensorReportTime = 0;
const unsigned long sensorReportInterval = 500;
boolean firstRun = true; // Flag to track the first run
// Function prototypes
void initializePins();
void activateRelay(int relayPin);
void deactivateRelay(int relayPin);
void activateLED(int ledPin);
void deactivateLED(int ledPin);
void handleInitialAct2();
void handleSensorActivation();
void handleButtonPress();
void handleRelay1Activation();
void handleRelay2Activation();
void handleIDTActivation();
void resetSystem();
void setup() {
initializePins();
if (firstRun) {
handleInitialAct2(); // Start relayAct2 for 11 seconds only on first run
}
}
void loop() {
if (firstRun && millis() - startTimeAct2 >= 11000) {
deactivateRelay(relayAct2);
activateLED(relayLedGreen4);
firstRun = false; // Mark that the first run is complete
}
if (!firstRun) {
handleSensorActivation();
}
}
// Function definitions
void initializePins() {
pinMode(relayAct1, OUTPUT);
pinMode(relayAct2, OUTPUT);
pinMode(relayIDT_Counter3, OUTPUT);
pinMode(relayLedGreen4, OUTPUT);
pinMode(relayLedBlue5, OUTPUT);
pinMode(relayLedRed6, OUTPUT);
pinMode(inputSensor, INPUT_PULLUP);
pinMode(inputTasterT2, INPUT_PULLUP);
digitalWrite(relayAct1, LOW);
digitalWrite(relayAct2, LOW);
digitalWrite(relayIDT_Counter3, LOW);
digitalWrite(relayLedGreen4, LOW);
digitalWrite(relayLedBlue5, LOW);
digitalWrite(relayLedRed6, LOW);
}
void activateRelay(int relayPin) {
digitalWrite(relayPin, HIGH);
}
void deactivateRelay(int relayPin) {
digitalWrite(relayPin, LOW);
}
void activateLED(int ledPin) {
digitalWrite(ledPin, HIGH);
}
void deactivateLED(int ledPin) {
digitalWrite(ledPin, LOW);
}
void handleInitialAct2() {
activateRelay(relayAct2);
startTimeAct2 = millis();
}
void handleSensorActivation() {
if (digitalRead(inputSensor) == LOW) { // Sensor is active
activateLED(relayLedBlue5);
handleButtonPress();
} else { // Sensor is inactive
deactivateLED(relayLedBlue5);
}
}
void handleButtonPress() {
while (digitalRead(inputTasterT2) == HIGH) {
// Wait for button press
if (digitalRead(inputSensor) == HIGH) { // Sensor became inactive
deactivateLED(relayLedBlue5);
return; // Exit the function to re-check sensor state
}
}
deactivateLED(relayLedGreen4);
activateLED(relayLedRed6);
handleRelay1Activation();
}
void handleRelay1Activation() {
activateRelay(relayAct1);
startTimeRelay1 = millis();
while (millis() - startTimeRelay1 < 12000) {
if (digitalRead(inputSensor) == HIGH) {
deactivateLED(relayLedBlue5);
} else {
activateLED(relayLedBlue5);
}
}
deactivateRelay(relayAct1);
handleRelay2Activation();
}
void handleRelay2Activation() {
activateRelay(relayAct2);
startTimeRelay2 = millis();
while (millis() - startTimeRelay2 < 12000) {
if (digitalRead(inputSensor) == HIGH) {
deactivateLED(relayLedBlue5);
} else {
activateLED(relayLedBlue5);
}
}
deactivateRelay(relayAct2);
handleIDTActivation();
}
void handleIDTActivation() {
activateRelay(relayIDT_Counter3);
startTimeIDT = millis();
while (millis() - startTimeIDT < 1000) {}
deactivateRelay(relayIDT_Counter3);
deactivateLED(relayLedRed6);
while (digitalRead(inputSensor) == LOW) {} // Wait for sensor to become inactive
deactivateLED(relayLedBlue5);
activateLED(relayLedGreen4);
resetSystem();
}
void resetSystem() {
// Do not reset firstRun here, as we want relayAct2 to start only on the first run
handleSensorActivation(); // Go back to waiting for sensor activation
}