Liebe alle,
ich habe (zunächst stolz) mein erstes Arduino-Projekt zu Ende gebracht: Eine Beleuchtung eines Kleiderschranks mit 2 Türen.
Folgendes Grobkonzept wollte ich umsetzen:
- Schranktür geht auf (==Schalter schließt) -> Licht geht an (mit fading)
- Schranktür geht zu -> Licht geht aus (mit fading)
- Schranktür bleibt offen stehen -> Licht geht nach 12min automatisch aus
Das klappt soweit auch gut - für eine Weile. Nach ca. 1-2 Tagen hängt sich das ganze irgendwie auf: Mal bleibt das Licht an oder aus und nichts reagiert mehr (Schalterbetätigung hat keinen Effekt mehr). Ein Reset des Arduino Nano hilft - für 1-2 Tage
Ich kenne mich mit Programmierung nicht sonderlich aus, könnte mir aber vorstellen, dass irgendeine Zahl überläuft oder so?!?! Nur hab ich keinen Schimmer welche oder wo. Hatte gelesen, dass man mit millis nach 48 Tagen evtl. Probleme kriegen kann - aber doch nicht nach 1 Tag?!
Unten mein Sketch. Bitte verzeiht meine deletantische Programmierei. Ich bin mir bewusst, dass man das sehr viel eleganter lösen kann - nur ich vermochte es nicht
Schalter 1 und 2 sind im Wesentlichen Copy-Paste.
Schon mal 1000 Dank an alle, die sich das hier anschauen!!!!!!
Cheers,
karatebietz
//-----------------------------------------------------
//Schaltkreise 1 und 2 sind identisch und unterscheiden sich nur durch Zahl 1 bzw. 2
//-----------------------------------------------------
#define Transistor1 3 //Transistor für Schaltkreis 1 an PIN 3 angeschlossen (=PWM-Pin)
#define Transistor2 5
#define Schalter1 10 //Schalter für Schaltkreis 1 an Pin 10
#define Schalter2 8
boolean SwitchWasClosed1 = true; //registriere, ob Schalter schon länger offen ist
boolean SwitchWasClosed2 = true;
unsigned long startMillis1; //Startzeit für neue Periode
unsigned long startMillis2;
unsigned long startFadeDownMillis1; //Startzeit für Fadingeffekt (Nur bei Licht-Aus)
unsigned long startFadeDownMillis2;
byte brightness1 = 0; //Anfangshelligkeit
byte brightness2 = 0;
//Diese Parameter sind für beide Schaltkreise gleich und bleiben konstant
const unsigned long fadingPeriod = 15; //Verzögerungszeit für Fading - je groesser, desto langsamer
const unsigned long maxPeriod = 720000; //Maximale Leuchtdauer (in ms) -> 12 min
byte maxBrightness = 250; // maximale Helligkeit (255=max)
void setup() {
// put your setup code here, to run once:
pinMode(Transistor1, OUTPUT);
pinMode(Transistor2, OUTPUT);
pinMode(Schalter1, INPUT_PULLUP);
pinMode(Schalter2, INPUT_PULLUP);
startMillis1 = millis(); //initial Startzeit;
startMillis2 = millis();
startFadeDownMillis1 = millis(); //initiale Startzeit für downfading (damit es überhaupt losgeht)
startFadeDownMillis2 = millis();
}
void loop() {
// put your main code here, to run repeatedly:
schalter1(); //Durchführung/Überwachung von Schalter 1
schalter2(); //Durchführung/Überwachung von Schalter 2
}
//___________________________Schalter 1___________________________
void schalter1() {
if (digitalRead(Schalter1) == LOW) //Zusatz if-Bedingung wird benötigt um Timer neu zu setzen + Zustand zwischen fading an und fading aus zu unterscheiden (sonst Licht-An-Licht-Aus-Loop)
{
if(brightness1 > 5) //wenn Licht vorher an war, fading Licht aus (sonst tue nichts)
{
fadeDown1();
}
if(brightness1 <= 5) //Wenn Licht dunkel genug, schalte ganz aus und setze Variablen auf default zurück
{
SwitchWasClosed1 = true; // Schalter war zu --> "fading an" Schleife wird als nächstes durchlaufen
digitalWrite(Transistor1, LOW); //Setze Transistor auf definierten Wert "0" zurück
brightness1 = 0; //setze Anfangsbrightness wieder auf 0
}
}
else //Wenn Schalter geschlossen wird, mache Licht an
{
if(brightness1 <= maxBrightness and SwitchWasClosed1 == true and millis() - startMillis1 >= fadingPeriod) //wenn erfüllt: noch keine mximale Helligkeit + Schalter gerade geöffnet worden + Zeit für nächsten Fading-Schritt
{
analogWrite(Transistor1, brightness1); //setze Helligkeit
brightness1++; //erhöhe Helligkeit (bis Maximum erreicht ist)
startMillis1 = millis(); //setze aktuelle Zeit als neue Startzeit (um Fading zu erzielen)
}
if(millis() - startMillis1 >= maxPeriod) //wenn die maximale Wartezeit vorüber ist (Tür ist zu lange offen geblieben), wieder Licht aus (mit fading)
{
SwitchWasClosed1 = false; //Sage, dass Schalter offen stehen geblieben ist -> lasse Licht aus (sonst loop im fading)
fadeDown1();
if(brightness1 <= 5) //Wenn minimale Helligkeit erreicht, muss Transistor auf LOW gezogen werden, sonst glimmen die LED weiter
{
digitalWrite(Transistor1, LOW);
}
}
}
}
void fadeDown1() //Funktion zum Ausdimmen der LED an Schalter 1
{
if(millis() - startFadeDownMillis1 >= fadingPeriod and brightness1 > 5)
{
analogWrite(Transistor1, brightness1); //setze Helligkeit
brightness1--; //erhöhe Helligkeit bis Maximum erreicht
startFadeDownMillis1 = millis(); //setze aktuelle Zeit als neue Startzeit fuer Downfading
}
}
//___________________________Schalter 2___________________________
void schalter2() {
if (digitalRead(Schalter2) == LOW) //Zusatz if-Bedingung wird benötigt um Timer neu zu setzen + Zustand zwischen fading an und fading aus zu unterscheiden (sonst Licht-An-Licht-Aus-Loop)
{
if(brightness2 > 5) //wenn Licht vorher an war, fading (sonst tue nichts)
{
fadeDown2();
}
if(brightness2 <= 5) //Wenn Licht dunkel, schalte ganz aus und setze Variablen auf default zurück
{
SwitchWasClosed2 = true; // Schalter war zu --> "fading an" Schleife wird als nächstes durchlaufen
digitalWrite(Transistor2, LOW); //Setze Transistor auf definierten Wert "0" zurück
brightness2 = 0; //setze Anfangsbrightness wieder auf 0
}
}
else //Wenn Schalter geöffnet wird, mache Licht an
{
if(brightness2 <= maxBrightness and SwitchWasClosed2 == true and millis() - startMillis2 >= fadingPeriod) //wenn erfüllt: noch keine mximale Helligkeit + Schalter grade geöffnet worden + Zeit für nächsten Fading-Schritt
{
analogWrite(Transistor2, brightness2); //setze Helligkeit
brightness2++; //erhöhe Helligkeit bis Maximum erreicht
startMillis2 = millis(); //setze aktuelle Zeit als neue Startzeit
}
if(millis() - startMillis2 >= maxPeriod) //wenn die maximale Wartezeit vorüber ist, wieder Licht aus (mit fading)
{
SwitchWasClosed2 = false; //Sage, dass Schalter offen stehen geblieben ist -> lasse Licht aus (sonst loop im fading)
fadeDown2();
if(brightness2 <= 5) //Wenn minimale Helligkeit erreicht, muss Transistor auf LOW gezogen werden, sonst glimmen die LED weiter
{
digitalWrite(Transistor2, LOW);
}
}
}
}
void fadeDown2() //Funktion zum Ausdimmen der LED
{
if(millis() - startFadeDownMillis2 >= fadingPeriod and brightness2 > 5)
{
analogWrite(Transistor2, brightness2); //setze Helligkeit
brightness2--; //erhöhe Helligkeit bis Maximum erreicht
startFadeDownMillis2 = millis(); //setze aktuelle Zeit als neue Startzeit fuer Downfading
}
}