Hallo zusammen,
Ich möchte für mein Aquarium einen Wasseralarm realisieren. Dieser soll bei detektiertem Wasser im Takt anfangen zu Piepsen und eine LED soll rot blinken.
Der akustische Alarm soll temporär per Tastendruck quittiert werden können. Sollte nach beispielsweise 60 Sekunden immer noch Wasser am Sensor anliegen, soll dieser wieder anfangen zu piepsen.
Wird kein Wasser mehr erkannt, ist der Akustische Alarm still und die LED leuchtet nun Grün konstant.
Mein Sketch funktioniert bis auf ein "Detail":
Wenn die Taste gedrückt wird, wird dieser erkannt. Die Zeile "Alarm quittiert" wird für die bestimmte Zeit aufgerufen, nur der akustische Alarm piepst weiter mit dem rot blinkenden LED. Sollte aber nur das LED für diese bestimmte Zeit blinken.
Ich vermute der Fehler liegt irgendwo in den Wiederholungen, dass sich der Befehl des Piezo-aktivieren und deaktivieren überschneiden. Ich stehe aber auf dem Schlauch und komme auf keinen grünen Zweig. Bitte beachtet, dass ich seit rund einem Monat mich mit Arduino befasse und somit Fehler im Sketch, in der Darstellung und in meinem Verständnis nicht auszuschliessen sind.
/*
***ribaribi***
Projekt: Wasseralarm
Datum: 20210718
Beschreibung: Bei erfassen von Wasser, Blinkt und Piepst ein Alarm im Takt.
Das Piepsen kann man für eine bestimmte Zeit Quittieren. (z.B 60s). Ein LED blinkt weiter.
Ist nach dieser Zeit îmmernoch Wasser da sein, fänkt das Piepsen wieder an.
Ist kein Wasser mehr dedektiert, wird kein Alarm ausgegeben und die LED leuchtet grün.
*/
int Wassersensor = A6; //Feuchtigkeitssensor
int Alarm = 14; //Piezo-Speaker
int LEDRot = 26; //RGB LED
int LEDGruen = 28; //RGB LED
int LEDBlau = 30; //RGB LED (Blau derzeit nicht verwendet)
int Taste2_PIN = 40; //Quittiertaste
int Taste2;
int Quittiert;
//Verzögerung
const unsigned long Alarmverzoegerung = 30 * 1000L; // Unterbruch des Alarms in ms
unsigned long Quittiermoment;
unsigned long Restzeit;
void setup()
{
Serial.begin(9600);
pinMode (Alarm, OUTPUT);
pinMode (LEDRot, OUTPUT);
pinMode (LEDGruen, OUTPUT);
pinMode (LEDBlau, OUTPUT);
pinMode(Taste2_PIN, INPUT_PULLUP);
digitalWrite (LEDRot, HIGH); //Alarm (Wasser erkannt)
digitalWrite (LEDGruen, LOW); //Situation OK
digitalWrite (LEDBlau, HIGH); //Nicht verwendet
}
void loop() {
Taste2 = digitalRead(Taste2_PIN);
Wassersensor = analogRead(A6);
Serial.print("Feuchtigkeits-Messwert:");
Serial.println(Wassersensor);
delay(500);
//Alarm
if (Wassersensor > 100 ) //Ist der Sensorwert grösser als "100", dann...
{
digitalWrite(Alarm, HIGH); //...soll der Piezo-Speaker piepsen
digitalWrite(LEDRot, LOW); //und die rote LED soll aufleuchten.
delay(500);
digitalWrite(Alarm, LOW); //...wieder leise sein.
digitalWrite(LEDRot, HIGH); //rote LED wieder löschen
digitalWrite(LEDGruen, HIGH); //grüne LED bleibt dunkel.
delay (500);
}
else
{
digitalWrite(LEDGruen, LOW); //grüne LED leuchtet konstant
digitalWrite(Alarm, LOW); //Alarm ist still.
}
//Verzögerung
if (Taste2 == LOW) //Wenn Quittiertaste gedrückt
{
Quittiermoment = millis(); //Zeitpunkt des Tastendrucks wird gemerkt
Serial.println("Taste gedrückt"); //Zur Kontrolle
}
if (millis() - Quittiermoment < Alarmverzoegerung) //Abfallverzögerung des Tasters
{
digitalWrite(Alarm, LOW); //...soll er leise sein.
Restzeit = (Alarmverzoegerung - (millis() - Quittiermoment)) / 1000;
Serial.println("Alarm quittiert"); //Zur Kontrolle
}
else
{
Restzeit = 0;
}
}
Hier noch aus dem Seriell Monitor:
Feuchtigkeits-Messwert:373
Taste gedrückt // Hier wurde der Tastendruck erkannt
Alarm quittiert // Der nächste Schritt ist auch eingetreten, Pieps aber weiter
Feuchtigkeits-Messwert:373
Alarm quittiert // Wiederholt sich so oft bis die eingestellte Zeit durch ist.
Feuchtigkeits-Messwert:0 //Sensor aus dem Wasser gezogen
Hier ein Bild der RGB-LED, Feuchtigkeitssensor und der Piezo-Speaker: