/*
https://forum.arduino.cc/t/led-counter-in-alarmanlage-funktioniert-nicht/1190968
2023-11-19 by noiasca
sketch might get copied to thread when TO reacts...
*/
#include <LiquidCrystal.h>
const uint8_t Eingang = 8;
const uint8_t buzzerPin = 10;
const uint8_t Licht = A6;
const uint8_t L1 = A3; // pins for the LEDs
const uint8_t L2 = A2;
const uint8_t L3 = A1;
const uint8_t L4 = A0;
const uint8_t rs = 11, en = 12, d4 = 3, d5 = 4, d6 = 5, d7 = 6;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
int A;
int VWert = HIGH;
int VSchranke = 0;
int (Speicher) = 0;
uint8_t status = 0; // store the global state we are in
// I assume you want more LEDs blink, hence let's prepare a reusable class
class Led {
protected:
const uint8_t pin; // the pin for the the LED
uint32_t previousMillis = 0; // time management
uint8_t state = 0; // 0 off, 1 allways on, 2 blink
public:
Led(uint8_t pin) : pin(pin) {}
// to be called in setup
void begin() {
pinMode(pin, OUTPUT);
}
// start blinking
void blink() {
state = 2;
}
// switch off LED
void on() {
state = 1;
digitalWrite(pin, HIGH);
}
// switch off LED
void off() {
state = 0;
digitalWrite(pin, LOW);
}
// call in loop
void update(uint32_t currentMillis = millis()) {
if (state == 2 && currentMillis - previousMillis > 1000) {
previousMillis = currentMillis;
if (digitalRead(pin) == LOW)
digitalWrite(pin, HIGH);
else
digitalWrite(pin, LOW);
}
}
};
Led led1(L1); // create a LED object
void setup() {
pinMode(Eingang, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(Licht, INPUT);
pinMode(L2, OUTPUT);
pinMode(L3, OUTPUT);
pinMode(L4, OUTPUT);
digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
led1.begin(); // start the LED object
Serial.begin(9600);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Booting up...");
lcd.blink();
delay(2000);
lcd.noBlink();
lcd.clear();
lcd.setCursor(0, 1);
lcd.print("*System bereit*");
tone(buzzerPin, 700, 100);
delay(1500);
lcd.clear();
Serial.println(F("start"));
changeLed();
}
void changeLed() {
switch (status) {
case 0:
led1.blink();
digitalWrite(L2, LOW);
digitalWrite(L3, LOW);
digitalWrite(L4, LOW);
break;
case 1:
led1.off();
digitalWrite(L2, HIGH);
break;
case 2:
digitalWrite(L3, HIGH);
break;
case 3:
digitalWrite(L4, HIGH);
break;
}
}
void loop() {
static uint8_t lastButtonState = HIGH; // must survive loop, hence static
uint8_t buttonState = digitalRead(Eingang);
if (buttonState != lastButtonState) {
if (buttonState == LOW) {
if (status < 3) status++;
changeLed();
Serial.print(F("status=")); Serial.println(status);
}
delay(50); // debounce
}
lastButtonState = buttonState;
led1.update(); // trigger LED object in loop
}
/*
void loopAlt() {
int Wert = digitalRead(Eingang);
int Schranke = analogRead(Licht);
Serial.println(Schranke);
if (Wert == LOW && VWert != LOW) {
// Alarm ausgelöst
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("!!!ALARM!!!");
lcd.setCursor(0, 1);
lcd.print("Bedrohungslage");
siren();
Speicher = Speicher + 1;
} else if (Wert == HIGH && VWert != HIGH) {
// Alarm deaktiviert
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Bereich sicher");
noTone(buzzerPin);
}
if (Schranke < 1 && VSchranke >= 1) {
// Alarm ausgelöst
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("!!!ALARM!!!");
lcd.setCursor(0, 1);
lcd.print("Bedrohungslage");
siren();
Speicher = Speicher + 1;
} else if (Schranke >= 1 && VSchranke < 1) {
// Alarm deaktiviert
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Bereich sicher");
noTone(buzzerPin);
}
VWert = Wert;
VSchranke = Schranke;
if (Speicher == 0)
blink();
if (Speicher == 1)
digitalWrite(L2, HIGH);
if (Speicher == 2)
digitalWrite(L2, HIGH);
digitalWrite(L3, HIGH);
if (Speicher == 3)
digitalWrite(L2, HIGH);
digitalWrite(L3, HIGH);
digitalWrite(L4, HIGH);
if (Speicher >= 4)
digitalWrite(L1, HIGH);
digitalWrite(L2, HIGH);
digitalWrite(L3, HIGH);
digitalWrite(L4, HIGH);
}
void blink() {
if (Speicher = 0)
digitalWrite(L1, HIGH);
delay(1000);
digitalWrite(L1, LOW);
delay(1000);
}
void siren() {
for (int i = 10; i < 800; i += 90) {
tone(buzzerPin, i);
delay(130);
}
}
*/