LED Counter in Alarmanlage funktioniert nicht

Hallo zusammen,
ich hab eine kleine Alarmanlage gebaut. Ein Magnet ist an einer Tür befestigt, am Rahmen ist ein Sensor, der das magnetische Feld bemerkt. Ändert sich dieses, wird alarm ausgelöst,solange, bis die Tür wieder zu ist. Dabei gibt es eine Sirene und auf einem LCD wird eine Nachricht geschrieben.

Jetzt zum Problem: Ich habe 4 Lampen integriert. Die erste soll blinken, wenn kein Alarm ausgelöst wurde. Wenn die Tür geöffnet und geschlossen, also Alarm ausgelöst wurde, soll diese nicht mehr blinken und die zweite soll leuchten. Beim nächsten Mal die weite und dritte etc. Wichtig ist, dass sie anbleiben, auch wenn der alarm vorbei ist, quasi als Speicherfunktion.
Das Problem ist, dass sofort alle 3 Lampen leuchten, quasi so, als wäre direkt 3 mal Alarm ausgelöst worden. Hab jetzt vieles probiert, auch mit Chat GPT und bin zu keiner Lösung gekommen, deshalb hoffe ich, dass mir hier jemand helfen kann. Ignoriert einfach den Part mit Licht und Schranke, dass ist für eine Lichtschranke gewesen, welche im System integriert ist, aber aktuell keine Verwendung hat.

Vielen Dank


int Eingang = 8;
int buzzerPin = 10;
int Licht = A6;
int L1 = A3;
int L2 = A2;
int L3 = A1;
int L4 = A0;

const int 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;

void setup() {
  pinMode(Eingang, INPUT);
  pinMode(buzzerPin, OUTPUT);
  pinMode(Licht, INPUT);
  pinMode(L1, OUTPUT);
  pinMode(L2, OUTPUT);
  pinMode(L3, OUTPUT);
  pinMode(L4, OUTPUT);
  digitalWrite(L1, LOW);
  digitalWrite(L2, LOW);
  digitalWrite(L3, LOW);
  digitalWrite(L4, LOW);

  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();







}

void loop() {
  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);
  }
}

tippe oder füge den Code hier ein

tippe oder füge den Code hier ein

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

um welche "Sensoren" handelt es sich?
Wenn dass Reed Schalter sind - wie hast du diese angeschlossen?
Verwendest du irgendwelche Pullup / Pulldown Widerstände?
Hängt dieser Sensor an

int Eingang = 8;

?

Am einfachsten:
Zeichne einen exakten Schaltplan
Am besten auch Bilder posten die zeigen was du da aktuell hast.

Hallo andreasnano

Formatiere mal das Programm mit ctrl+T im IDE.

So wie das aussieht fehlen da ein paar {} Klammern.

Die if-Anweisungen in der Speicherauswertung für die Led´s lassen sich prima durch eine Switch/Case Anweisung umsetzen.

Servus, an dem Sensor liegt es nicht, da der code ohne die implementierung von dem "Speicher" gut funktioniert hat. Aber trotzdem:

Keine Pull-Widerstände, ja, das Signal geht über Pin 8 und ich weiß leider nicht, wie es heißt, aber es ist ein Magnetfeldsensor. Stammt aus diesem Kit hier: https://www.amazon.de/Elegoo-aufger%C3%BCsteter-Sensormodul-Bausatz-Anleitung/dp/B01M30ZWQR/ref=sr_1_3?crid=3MOSZILKK2XIQ&keywords=sensor+kit+arduino&qid=1700406378&sprefix=sensor+kit+ar%2Caps%2C178&sr=8-3 Da nennt er sich Metal Touch

Okay danke, mach ich mal. Switch-Case, wäre das dann :

switch (Speicher)
    case 1 
    digitalWrite(L1, HIGH);

Hab das noch nie vorher benutzt

CTRL + T hat dafür gesorgt, dass die Lampen immernoch sofort aufleuchten und die grüne Lampe nach kurzer Zeit dazukommt...

Das wird nix:

Du löschst damit den Speicher.
Immer und immer wieder.

Dann sind da allein fürs blinken 2 delay() drin, die Dich für 2 Sekunden blind machen.

Ich versuch mal zu verstehen, was Du willst.
Du hast 4 led und einen Pieper.
Die erste LED soll als Bereitschaftsanzeige blinken.

Mit jedem ausgelöstem Alarm soll eine LED an gemacht werden -> es bis maximal alle drei an sind mitgezählt.

Was ich nicht rausbekommen habe:
Wann soll die erste LED nicht mehr blinken?
Wann udn wie willst Du die AlarmLED's aus machen?

@andreasnano

ich hab mal das blinken bei LED 1 weggelassen - sie leuchtet nur.
Was soll geschehen, wenn die 4te LED an ist? Aktuell mach ich da einen wrap around auf LED1

Soll das so in dieser Art ablaufen?

/*
  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
}

es sind im Wesentlichen nur die zwei Beispiele:

  • State Change Detection
  • Blink Without Delay

Welches Arduino Modell benutzt Du?

int Schranke = analogRead(Licht); 
...
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);
  }

Ich nehme mal an daß Du einen NANO V3.0 benutzt.

  1. Das Pin A6 ist kein digitaler Ein/Ausgang sondern nur ein analoger Eingang.
  2. analoge Eingänge müssen nicht mit pinMode() initialisiert werden.
  3. eine analoge Messung ergibt selten eine stabile Null. Darum ist ein Vergleichen mit kleiner 1 bzw größer gleich 1 nicht sinnvoll.

Benutze einen digitalen Eingang.

Für etwas so wichtiges und notwendigerweise zuverlässig funktionierendes Projekt wie eine Alarmanlage solltes Du schon etwas besser programmieren (lernen).

Grüße Uwe

Bin da noch kein Experte und die Alarmanlage soll auch keinen tatsächlichen Schutz gegen Kriminelle bieten

die erste LED soll nicht mehr blinken, sobald der Alarm einmal ausgelöst wurde.

Naja der Plan ist, dass sie erst wieder ausgehen, wenn der Strom weg ist, also wenn der Arduino neustartet.

Ich probiere das ganze jetzt mal ohne das blink() wenn das natürlich den Speicher löscht, ist das natürlich doof

Wenn die 4te LED an ist, soll sie einfach anbleiben, es wird nur nicht mehr mitgezählt… die Beispiele schau ich mir mal an, danke dir.

Edit: Ja, quasi schon. Nur das die vorherigen LEDs weiterhin leuchten sollen. Also wenn null aus und 1 an wäre dann so:

1 0 0 0
0 0 0 0
1 0 0 0
(Alarm wird ausgelöst)
0 1 0 0
(alarm wird nochmal ausgelöst)
0 1 1 0
(Nochmal)
0 1 1 1
(Nochmal)
0 1 1 1

naja, dann musst du halt nur den status++ verändern und eben die LEDs nicht LOW schalten.

Aktualisier noch mal den wokwi link ... habs grad umgebaut.

hab jetzt mal ohne blink () getestet. Jetzt ist es so, dass die grüne Lampe nach 4mal Alarm beginnt zu leuchten

Vielen dank. Kannst du mir sagen, warum mein Code nicht funktioniert?

Was hat Dich gehindert zu lesen, was ich geschrieben habe?

Ich habe dir doch schon geantwortet, habe das blink() entfernt aber es ist immernoch der gleiche Fehler, ich habe natürlich gelesen was du geschrieben hast

Las es gut sein für heute.
Ich hab deinen Code auf der Maschine.