Stummschalten eines Alarms

Hallo,

da dies mein erster Beitrag in diesem Forum ist, seid gnädig mit mir :wink:

Ich habe folgendes Problem:

Zwei LEDs zeigen jeweils die Funktion eines Stromkreises an (TEST). An einer zweiten Messstelle ist die Kontrolle angeschlossen. Wenn TEST auf HIGH und CHECK auf HIGH steht ist alles in Ordnung. Wenn TEST auf HIGH, CHECK jedoch auf LOW steht soll ein Alarm angehen. Dieser Alarm soll sich aber über einen Taster stumm schalten lassen ohne den Ablauf der Schleifen zu stören.

Die Frage ist, wie müsste ich den Code ändern, damit trotzdem weiter überwacht wird, der Alarm jedoch bis zur Beseitigung stumm geschaltet werden kann?

#define LED1 2
#define LED2 3 
#define ALARM 4
#define TEST1 5
#define TEST2 6
#define CHECK1 7
#define CHECK2 8
#define DIMMER 1


void setup() {
 pinMode(LED1, OUTPUT);
 pinMode(LED2, OUTPUT);
 pinMode(ALARM, OUTPUT);
 pinMode(CHECK1, INPUT);
 pinMode(CHECK2, INPUT);
 pinMode(TEST1, INPUT);
 pinMode(TEST2, INPUT);


}


void loop() {
 int pwm = analogRead(DIMMER);
 if((digitalRead, TEST1) && (digitalRead, CHECK1))
 {
   digitalWrite(LED1, pwm);
   delay(50);
 }
 
 if((digitalRead, TEST1) && (!digitalRead, CHECK1))
 {
   digitalWrite(LED1, pwm);
   tone(4, 1000);
   delay(1000);
   digitalWrite(LED1, 0);
   noTone(4);
   delay(1000);
 }
 
 if((digitalRead, TEST2) && (digitalRead, CHECK2))
 {
   digitalWrite(LED2, pwm);
   delay(50);
 }
 
 if((digitalRead, TEST2) && (!digitalRead, CHECK2))
 {
   digitalWrite(LED2, pwm);
   tone(4, 1000);
   delay(1000);
   digitalWrite(LED2, 0);
   noTone(4);
   delay(1000);
 }


}

Vielen Dank!

LG
DaJonas

Damit das überhaupt so funktioniert, wie du es dir wünschst, musst du die delays ersetzen, und das geht dann mit der Funktion millis(). Sieh dir dazu das Beispiel "BlinkWithoutDelay" in der IDE an.

Und deinen Sketch setze bitte in Code-Tags, damit dieser für alle besser lesbar ist.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken, oder [ code] davor und [ / code] dahinter ohne Leerzeichen.
Oder
im IDE-Fenster rechte Maustaste und für "Forum kopieren klicken", danach hier einfügen.

Das kannst du in deinem Startbeitrag noch nachträglich machen.

Okay, das mit den Millis habe ich verstanden. Aber wie sorge ich dafür, dass der Alarm abschaltbar ist, sich sonst aber nichts im Programm verändert?

dajonas:
Okay, das mit den Millis habe ich verstanden. Aber wie sorge ich dafür, dass der Alarm abschaltbar ist, sich sonst aber nichts im Programm verändert?

Indem du einen Taster abfragst und mit dem Ergebnis den Ton ausschaltest.
Aber mit den delays im Sketch wird das immer ein Problem bleiben.

Noch ein Ratschlag:
Speichere in einer Variablen ab daß der Taster gedrückt wurde.
Überleg Dir aber auch wie Du den Alarm wieder freigeben willst.
Grüße Uwe

den Alarm kannst du entweder über einen zweiten Taster wieder aktivieren oder dadurch, dass deine Pin Auswertungen eben keine Alarm mehr erhalten.

mal nur für einen Kreis

#define LED1 2
#define LED2 3
#define ALARM 4
#define TEST1 5
#define TEST2 6
#define CHECK1 7
#define CHECK2 8
#define DIMMER 1              // ganz schlecht, das ist Teil der seriellen Schnittstelle

const byte ignorePin1 = 11;   // GPIO mit externem Pulldown Widerstand zum Abschalten der Alarmierung
const byte ignorePin2 = 12;
const byte resetPin1 = A1;    // GPIO mit externem Pulldown Widerstand zum Aktivieren der Alarmierung
const byte resetPin2 = A2;
bool isActive1 = true;        // bei false unterbleibt bei Alarm das gepiepse 
bool isActive2 = true;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(ALARM, OUTPUT);  // wird im Sketch nicht verwendet ???
  pinMode(CHECK1, INPUT);
  pinMode(CHECK2, INPUT);
  pinMode(TEST1, INPUT);
  pinMode(TEST2, INPUT);
}


void loop() {
  int pwm = analogRead(DIMMER);
  if ((digitalRead, TEST1) && (digitalRead, CHECK1))  // Wenn TEST auf HIGH und CHECK auf HIGH steht ist alles in Ordnung.
  {
    digitalWrite(LED1, pwm); 
    delay(50);
    
    isActive1 = true;       // rücksetzen in Normalzustand
    // if (digitalRead(resetPin1) == HIGH) isActive1 = true;  // Alternativ rücksetzen mit separatem Taster 
  }

  if ((digitalRead, TEST1) && (!digitalRead, CHECK1))  // Wenn TEST auf HIGH, CHECK jedoch auf LOW steht soll ein Alarm angehen.
  {
    if (digitalRead(ignorePin1) == HIGH) isActive1 = false;
    if (isActive1)
    {
      digitalWrite(LED1, pwm);
      tone(4, 1000);
      delay(1000);
      digitalWrite(LED1, 0);
      noTone(4);
      delay(1000);
    }
  }

  if ((digitalRead, TEST2) && (digitalRead, CHECK2))
  {
    digitalWrite(LED2, pwm);
    delay(50);
  }

  if ((digitalRead, TEST2) && (!digitalRead, CHECK2))
  {
    digitalWrite(LED2, pwm);
    tone(4, 1000);
    delay(1000);
    digitalWrite(LED2, 0);
    noTone(4);
    delay(1000);
  }
}

Schönheitspreis gewinnt es keinen (alle deinen Bugs sind weiterhin drinnen).

Immer wenn man Variablen mit 1, 2, ... benötigt, soll man überlegen, ob da ein Array nicht besser wäre. Das spart auch Code Duplikate wenn man die Logik in For Schleifen abarbeien lässt.
Aufpassen, der Controller - und somit der Programmierer beginnt mit 0 an zu zählen.

Hat man mehrere Variablen die logisch zusammen gehören, wäre ein struct der nächste Schritt.

Hallo
der Compiler frisst den Code, erzeugt aber eine Menge von Fehlermeldungen.
Wenn ein Arduino NANO, UNO oder MEGA verwendet wird, dann muss die Definition der Pins überarbeitet werden und diese im Sketch mit dem Datentyp const int benannt werden.
Probier mal deinen Sketch nach dem EVA-Prinzip zu strukturieren, das macht für dich das Arbeiten mit dem Sketch wesentlich einfacher oder habe ich die Aufgabenstellung nicht verstanden? :slight_smile:

ich hätt' nicht damit anfangen sollen.
Immer noch hässlich, aber die Warnings (vom TO allerdings) sind weg.

#define LED1 2
#define LED2 3
#define ALARM 4
#define TEST1 5
#define TEST2 6
#define CHECK1 7
#define CHECK2 8
#define DIMMER 1              // ganz schlecht, das ist Teil der seriellen Schnittstelle

const byte ignorePin1 = 11;   // GPIO mit externem Pulldown Widerstand zum Abschalten der Alarmierung
const byte ignorePin2 = 12;
const byte resetPin1 = A1;    // GPIO mit externem Pulldown Widerstand zum Aktivieren der Alarmierung
const byte resetPin2 = A2;
bool isActive1 = true;        // bei false unterbleibt bei Alarm das gepiepse
bool isActive2 = true;

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(ALARM, OUTPUT);  // wird im Sketch nicht verwendet ???
  pinMode(CHECK1, INPUT);
  pinMode(CHECK2, INPUT);
  pinMode(TEST1, INPUT);
  pinMode(TEST2, INPUT);
}


void loop() {
  int pwm = analogRead(DIMMER);
  if (digitalRead(TEST1) && digitalRead(CHECK1))  // Wenn TEST auf HIGH und CHECK auf HIGH steht ist alles in Ordnung.
  {
    digitalWrite(LED1, pwm);
    delay(50);

    isActive1 = true;       // rücksetzen in Normalzustand
    // if (digitalRead(resetPin1) == HIGH) isActive1 = true;  // Alternativ rücksetzen mit separatem Taster
  }

  if (digitalRead(TEST1) && !digitalRead(CHECK1))  // Wenn TEST auf HIGH, CHECK jedoch auf LOW steht soll ein Alarm angehen.
  {
    if (digitalRead(ignorePin1) == HIGH) isActive1 = false;
    if (isActive1)
    {
      digitalWrite(LED1, pwm);
      tone(4, 1000);
      delay(1000);
      digitalWrite(LED1, 0);
      noTone(4);
      delay(1000);
    }
  }

  if (digitalRead(TEST2) && digitalRead(CHECK2))
  {
    digitalWrite(LED2, pwm);
    delay(50);
  }

  if (digitalRead(TEST2) && !digitalRead(CHECK2))
  {
    digitalWrite(LED2, pwm);
    tone(4, 1000);
    delay(1000);
    digitalWrite(LED2, 0);
    noTone(4);
    delay(1000);
  }
}

Hallo,

eigendlich ist das ein klassisches Problem von Störmeldung mit Neuwertwert Auswertung.

eine Störung kommt und bleibt anstehen, mit dem kommen der Störung soll eine Hupe angehen. Die Hupe soll sich mittels Taster quittieren lassen. Kommt jetzt eine neue Störung soll die Hupe erneut angehen.

Man muss die Hupe mit dem kommen einer Störung starten, also für jede Störung eine kommende Flanke auswerten. Diese Flanken kann man verodert zum starten der Hupe verwenden. Mittels Tasterflanke kann die Hupe dann wieder ausgeschaltet werden. Dabei beachten das das Einschalten möglichst vorrangig ist, sonst läuft man Gefahr das gerade dann wenn man quittiert beim gleichzeitigen auftreten einer neuen Störung die Hupe nicht angeht.

Heinz

Dabei beachten das das Einschalten möglichst vorrangig ist, sonst läuft man Gefahr das gerade dann wenn man quittiert beim gleichzeitigen auftreten einer neuen Störung die Hupe nicht angeht.

Tja, was ist schon gleichzeitig und was nicht, in dieser digitalen Welt...
Es hupt, man quittiert, man sieht zwei Störungen, die erste hat die Hupe gestartet, die zweite kam irgendwann danach, evtl. erst "fast" gleichzeitig mit dem Quittieren.
Es hupt, man quittiert, aber es hört nicht auf zu hupen, weil eine zweite Störung "fast" gleichzeitig mit dem Quittieren kam. Kann beides vorkommen, und ob man eine Störung oder zwei quittiert hat, muss man sich als Bediener natürlich selber drum kümmern.

Man könnte fordern, dass eine weitere unquittierte Störung die Hupe für kurze Zeit abschaltet, dann neu startet, damit man den Folge-Alarm auch richtig mitkriegt. Bei vielen Alarmen führt das zum Jukebox-Effekt, dass das gewählte Stück erst spät kommt, weil noch soviel vorher ansteht. Oder dazu, dass es erstmal gar nicht hupt. ...
Man könnte auch fordern, dass jeder Alarm frühestens nach x sec Hupen quittiert werden kann.

Was man jedenfalls beachten muss: nicht den Kunden einladen, sich eine ausgefuchste Strategie auszudenken.
(Alte Steuerungstechniker-Weisheit)

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.