Go Down

Topic: Stummschalten eines Alarms (Read 126 times) previous topic - next topic

dajonas

Feb 23, 2021, 10:47 pm Last Edit: Feb 23, 2021, 11:19 pm by dajonas
Hallo,

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

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?


Code: [Select]
#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

HotSystems

#1
Feb 23, 2021, 11:01 pm Last Edit: Feb 23, 2021, 11:08 pm by HotSystems
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.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

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?

HotSystems

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.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

uwefed

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

noiasca

#5
Feb 24, 2021, 03:04 am Last Edit: Feb 24, 2021, 08:17 am by noiasca
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

Code: [Select]

#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.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

paulpaulson

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? :)

In der Theorie gibt es keinen Unterschied zwischen Theorie und Praxis. In der Praxis gibt es einen!

noiasca

#7
Feb 24, 2021, 08:22 am Last Edit: Feb 24, 2021, 08:23 am by noiasca
ich hätt' nicht damit anfangen sollen.
Immer noch hässlich, aber die Warnings (vom TO allerdings)  sind weg.


Code: [Select]

#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);
  }
}
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Rentner

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

Go Up