#define PIR_PIN 2
#define RED_LED 3
#define YELLOW_LED 4
#define GREEN_LED 5
#define RESET_BUTTON 6
int pirState = 0; // Стан PIR-датчика
unsigned long count = 0; // Лічильник активацій
unsigned long lastDebounceTime = 0; // Час останнього натискання кнопки
const unsigned long debounceDelay = 200; // Затримка для дребезгу кнопки (200 мс)
bool lastGreenState = false;
bool lastYellowState = false;
bool lastRedState = false;
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(RED_LED, OUTPUT);
pinMode(YELLOW_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(RESET_BUTTON, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("System started");
}
void loop() {
// Зчитування стану PIR-датчика
pirState = digitalRead(PIR_PIN);
if (pirState == HIGH) {
count++;
displayLEDStatus(count, pirState);
delay(500); // Дебаунс сигналу PIR
}
// Перевірка кнопки із захистом від дребезгу
if (digitalRead(RESET_BUTTON) == LOW) {
unsigned long currentTime = millis(); // Поточний час
if (currentTime - lastDebounceTime > debounceDelay) {
count = 0; // Скидання лічильника
Serial.println("Counter reset!");
lastDebounceTime = currentTime; // Оновлення часу натискання
resetLEDs(); // Скидання стану світлодіодів
}
}
// Оновлення стану світлодіодів без виведення у відсутність руху
if (pirState == HIGH) {
displayLEDStatus(count, pirState);
}
}
void displayLEDStatus(unsigned long motionCount, int motionDetected) {
// Логіка керування світлодіодами
bool redOn = false, yellowOn = false, greenOn = false;
if (motionDetected == HIGH) {
digitalWrite(YELLOW_LED, HIGH);
yellowOn = true;
} else {
digitalWrite(YELLOW_LED, LOW);
}
if (motionCount % 2 == 0 && motionCount > 0) {
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
greenOn = true;
} else if (motionCount % 2 != 0) {
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
redOn = true;
} else {
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
}
// Перевірка зміни стану, щоб уникнути дублювання виводу
if (greenOn != lastGreenState || yellowOn != lastYellowState || redOn != lastRedState) {
Serial.print("Motion detected #");
Serial.print(motionCount);
Serial.print(" || Green - ");
Serial.print(greenOn ? "ON" : "OFF");
Serial.print(" || Yellow - ");
Serial.print(yellowOn ? "ON" : "OFF");
Serial.print(" || Red - ");
Serial.println(redOn ? "ON" : "OFF");
// Оновлення попередніх станів
lastGreenState = greenOn;
lastYellowState = yellowOn;
lastRedState = redOn;
}
}
void resetLEDs() {
// Вимкнення всіх світлодіодів
digitalWrite(RED_LED, LOW);
digitalWrite(YELLOW_LED, LOW);
digitalWrite(GREEN_LED, LOW);
// Оновлення станів для уникнення зайвого виводу
lastGreenState = false;
lastYellowState = false;
lastRedState = false;
Serial.println("All LEDs are OFF");
}