Hallo,
habe vor kurzem ein kleines Anfängerprojekt beendet.
Hauptfunktion:
Per Taster A und B soll eine LED "x" Minuten eingeschaltet werden können.
Ein Druck auf Taster B verlängert die Leuchtdauer der LED um X Minuten, wenn das Licht von Taster A eingeschaltet wurde (LED geht kurz aus und bleibt im Anschluss daran an).
Ein weiterer Druck auf Taster A, während Licht von Taster A eingeschaltet wurde, schaltet die LED aus.
Sekundärfunktionalität:
- Pro Taster individuell einstellbare Leuchtdauer
- Unendliche Prozessorlaufzeit
- Watchdog Timer (zur Sicherheit)
Mein Problem ist nun, dass sich die LED ohne das jmd. einen Taster gedrückt hätte ab und an von alleine einschaltet (ca. alle 2-3 Tage).
Trotz mehrfacher Durchsicht des Codes kann ich keine Fehler entdecken. Da ich mich jedoch noch immer zu den blutigen Anfängern zähle, möchte ich Programmierfehler in keinster Weise ausschließen.
Über sachdienliche Hinweise bin ich also sehr dankbar. Gerne auch Hinweise auf grundsätzliche Fehler- immer drauf.
Gruß Chris
#include <Bounce.h>
#include <avr/wdt.h> // Watchdog Timer Library
/* Taster gegen Masse. */
int button_z = 2;
int button_c = 3;
int led = 4;
int urzustand_button_z;
int val_button_z;
unsigned long button_z_zaehler = 0;
Bounce button_z_Bouncer = Bounce(button_z,10 ); // 10 ms Bouncing für "button_z"
boolean druck_z = 0;
int urzustand_button_c;
int val_button_c;
unsigned long button_c_zaehler = 0;
Bounce button_c_Bouncer = Bounce(button_c,10 ); // 10 ms Bouncing für "button_c"
boolean druck_c = 0;
unsigned long druckzeitpunkt = 0;
int ledpause = 340;
unsigned long leuchtdauer_z = 300000;
unsigned long leuchtdauer_c = 300000;
int fall = 1; // 1 // Falldeklaration
/**************************************************************************************************************************************************************************************************************************************************************/
void setup()
{
wdt_enable(WDTO_2S); // Watchdog Timer Initialisierung
pinMode(button_z, INPUT_PULLUP);
pinMode(button_c, INPUT_PULLUP);
urzustand_button_z = HIGH;
urzustand_button_c = HIGH;
pinMode(led, OUTPUT);
digitalWrite(led,LOW);
delay(100);
Serial.begin(9600);
Serial.println("Schaltung betriebsbereit");
}
/**************************************************************************************************************************************************************************************************************************************************************/
void loop()
{
wdt_reset(); // Watchdog Timer "Rückmeldung"
int rollovers = millisRollover(); // millis()-Überlaufbremse
switch(fall)
{
case 1:
button_z_Bouncer.update();
val_button_z = button_z_Bouncer.read();
if (val_button_z != urzustand_button_z)
{
if (val_button_z == LOW)
{
digitalWrite(led,HIGH);
druckzeitpunkt=millis();
Serial.println("Taster Z wurde gedrückt- LED eingeschaltet");
fall=2;
}
}
urzustand_button_z = val_button_z;
button_c_Bouncer.update();
val_button_c = button_c_Bouncer.read();
if (val_button_c != urzustand_button_c)
{
if (val_button_c == LOW)
{
digitalWrite(led,HIGH);
druckzeitpunkt=millis();
Serial.println("Taster C wurde gedrückt- LED eingeschaltet");
fall=3;
}
}
urzustand_button_c = val_button_c;
break;
case 2:
button_z_Bouncer.update();
val_button_z = button_z_Bouncer.read();
if (val_button_z != urzustand_button_z)
{
if (val_button_z == LOW)
{
digitalWrite(led,LOW);
Serial.println("Taster Z wurde erneut gedrückt- LED wurde wieder ausgeschaltet.");
fall=1;
}
}
urzustand_button_z = val_button_z;
button_c_Bouncer.update();
val_button_c = button_c_Bouncer.read();
if (val_button_c != urzustand_button_c)
{
if (val_button_c == LOW)
{
digitalWrite(led,LOW);
druckzeitpunkt=millis();
digitalWrite(led,LOW);
Serial.println("Taster C wurde gedrückt- LED wurde kurz ausgeschaltet..");
delay(ledpause);
digitalWrite(led,HIGH);
Serial.println("LED eingeschaltet");
fall=3;
}
}
urzustand_button_c = val_button_c;
if(millis() - druckzeitpunkt > leuchtdauer_z)
{
digitalWrite(led,LOW);
Serial.println("LED wurde aufgrund Ueberschreitung der Leuchtdauer z ausgeschaltet");
fall=1;
break;
}
break;
case 3:
button_z_Bouncer.update();
val_button_z = button_z_Bouncer.read();
if (val_button_z != urzustand_button_z)
{
if (val_button_z == LOW)
{
digitalWrite(led,LOW);
druckzeitpunkt=millis();
digitalWrite(led,LOW);
Serial.println("Taster Z wurde gedrückt- LED wurde kurz ausgeschaltet..");
delay(ledpause);
digitalWrite(led,HIGH);
Serial.println("LED eingeschaltet");
fall=2;
}
}
urzustand_button_z = val_button_z;
button_c_Bouncer.update();
val_button_c = button_c_Bouncer.read();
if (val_button_c != urzustand_button_c)
{
if (val_button_c == LOW)
{
digitalWrite(led,LOW);
Serial.println("Taster C wurde erneut gedrückt- LED wird wieder ausgeschaltet.");
fall=1;
}
}
urzustand_button_c = val_button_c;
if(millis() - druckzeitpunkt > leuchtdauer_c)
{
digitalWrite(led,LOW);
Serial.println("LED wurde aufgrund Ueberschreitung der Leuchtdauer c ausgeschaltet");
fall=1;
break;
}
break;
}
}
int millisRollover()
{
static int numRollovers=0; // variable that permanently holds the number of rollovers since startup
static boolean readyToRoll = false; // tracks whether we've made it halfway to rollover
unsigned long now = millis(); // the time right now
unsigned long halfwayMillis = 2147483647; // this is halfway to the max millis value (17179868 for earlier versions of Arduino)
if (now > halfwayMillis) { // as long as the value is greater than halfway to the max
readyToRoll = true; // you are ready to roll over
}
if (readyToRoll == true && now < halfwayMillis) {
// if we've previously made it to halfway
// and the current millis() value is now _less_ than the halfway mark
// then we have rolled over
numRollovers++; // add one to the count the number of rollovers
readyToRoll = false; // we're no longer past halfway
}
return numRollovers;
}