#include <TM1637Display.h>
#include <EEPROM.h>
// 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 triggerPin = 12; // HC-SR04 Trigger pin
const int echoPin = 13; // HC-SR04 Echo pin
const int inputTasterT2 = 7;
const int clkPin = 5; // TM1637 CLK pin
const int dioPin = 11; // TM1637 DIO pin
// 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
int counter = 0; // Counter starting from 0
TM1637Display display(clkPin, dioPin);
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 reportSensorState();
void updateDisplay();
void saveCounterToEEPROM();
void loadCounterFromEEPROM();
float getDistance();
void setup() {
initializePins();
display.setBrightness(0x0f); // Set display brightness
loadCounterFromEEPROM(); // Load the last counter value from EEPROM
updateDisplay(); // Update the display with the loaded counter value
if (firstRun) {
handleInitialAct2(); // Start relayAct2 for 5 seconds only on first run
}
}
void loop() {
if (firstRun && millis() - startTimeAct2 >= 5000) { // Changed from 11000 to 5000
deactivateRelay(relayAct2);
activateLED(relayLedGreen4);
firstRun = false; // Mark that the first run is complete
}
if (!firstRun) {
handleSensorActivation();
reportSensorState();
}
}
// Function definitions
void initializePins() {
pinMode(relayAct1, OUTPUT);
pinMode(relayAct2, OUTPUT);
pinMode(relayIDT_Counter3, OUTPUT);
pinMode(relayLedGreen4, OUTPUT);
pinMode(relayLedBlue5, OUTPUT);
pinMode(relayLedRed6, OUTPUT);
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
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() {
float distance = getDistance();
if (distance > 0 && distance < 3) { // Sensor is active if distance is less than 3 cm
activateLED(relayLedBlue5);
handleButtonPress();
} else { // Sensor is inactive
deactivateLED(relayLedBlue5);
}
}
void handleButtonPress() {
while (digitalRead(inputTasterT2) == HIGH) {
// Wait for button press
if (getDistance() >= 3) { // 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 < 5000) { // Changed from 12000 to 5000
if (getDistance() >= 3) {
deactivateLED(relayLedBlue5);
} else {
activateLED(relayLedBlue5);
}
}
deactivateRelay(relayAct1);
handleRelay2Activation();
}
void handleRelay2Activation() {
activateRelay(relayAct2);
startTimeRelay2 = millis();
while (millis() - startTimeRelay2 < 5000) { // Changed from 12000 to 5000
if (getDistance() >= 3) {
deactivateLED(relayLedBlue5);
} else {
activateLED(relayLedBlue5);
}
}
deactivateRelay(relayAct2);
handleIDTActivation();
}
void handleIDTActivation() {
counter++; // Increment the counter before activating relayIDT
updateDisplay(); // Update the display with the new counter value
saveCounterToEEPROM(); // Save the counter value to EEPROM
activateRelay(relayIDT_Counter3);
startTimeIDT = millis();
while (millis() - startTimeIDT < 1000) {}
deactivateRelay(relayIDT_Counter3);
deactivateLED(relayLedRed6);
while (getDistance() < 3) {} // 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
}
void reportSensorState() {
if (millis() - lastSensorReportTime >= sensorReportInterval) {
lastSensorReportTime = millis();
Serial.print("Sensor state: ");
Serial.println(getDistance() < 3 ? "Active" : "Inactive");
}
}
void updateDisplay() {
display.showNumberDec(counter);
}
void saveCounterToEEPROM() {
EEPROM.put(0, counter);
}
void loadCounterFromEEPROM() {
EEPROM.get(0, counter);
if (counter < 0) {
counter = 0; // Ensure the counter starts from 0 if the EEPROM value is invalid
}
}
float getDistance() {
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2; // Calculate the distance in cm
return distance;
}