Hallo liebe Forengemeinde,
ich habe einen Sketch gebaut, der meine Außenbeleuchtung steuern soll.
Dieses funktioniert auch soweit, bis auf dass mein Sketch immer mal wider hängen bleibt.
Ich habe leider keinen festen Zeitrahmen, wann der Sketch hängt. Mal passiert es nach einem Tag mal auch erst nach 14 Tagen.
Anbei mein Programm:
//Voreinstellungen festlegen.
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,2,1,0,4,5,6,7); //Display wird über BUS-Adresse angesprochen.
int Display = 10; //Display 5V Spannungsversorgung ist auf Pin 6 angeschlossen.
//Eingänge
int SchalterPin = 2; // Pin an dem der Schalter angeschlossen ist.
int Bewegungsmelder_1 = 8; // Pin an dem der Bewegungsmelder_1 angeschlossen ist.
//int Bewegungsmelder_2 = 9; // Pin an dem der Bewegungsmelder_2 angeschlossen ist.
int DaemmerungsschalterPin = A0; // Pin an dem der Dämmerungsschalter angeschlossen ist.
//Ausgänge
int LED_Haus = 5; //Pin an denen die Lampen angeschlossen sind (PWM Signal).
int LED_Wall = 6; //Pins an denen die Lampen angeschlossen sind (PWM Signal).
int LED = 13; // Indikator für Besucher_Schaltung aktiv.
//Zeiten
int dimm1 = 45; // Zeit, die der Dimmer braucht um die Beleuchtung "EIN" oder "AUS" zu schalten.
int dimm2 = 8; // Zeit, die der Dimmer bei eingeschalteten "dimm1" braucht um zu Dimmen.
int dimm3 = 2; // Zeit, die der Dimmer braucht um komplett "EIN" oder "AUS" zu schalten.
//Dämmerungseinstellungen
int ein = 700; // Schaltet die Beleuchtung kleiner gleich "Wert 50" "EIN" // Wert 0 - 1023
int aus = 900; // Schaltet die Beleuchtung größer gleich "Wert 250" "AUS" // Wert 0 - 1023
//Variablen
int Bewegungsstatus = 0; // Wird eine Bewegung erkannt wird es in der Variable gespeichert.
int state = 0; // Zustand des Dimmers (Beleuchtung hell=1 /stark gedimmt=0)
int freigabe = 0; // Zustand des Dimmers (Beleuchtung stark gedimmt=1 /aus=0)
int an_aus = 0; // Zustand des Dimmers (Beleuchtung hoch gedimmt=1 /aus=0)
//Online Zeit des Systems
int tage, stunde, minute, sekunde;
void setup () {
pinMode(SchalterPin, INPUT);
pinMode(Bewegungsmelder_1, INPUT);
// pinMode(Bewegungsmelder_2, INPUT);
pinMode(LED, OUTPUT);
pinMode(LED_Haus, OUTPUT);
pinMode(LED_Wall, OUTPUT);
////////////////////SERIAL_MONITOR_NUR_FÜR_TEST///////////////////
// Serial.begin(9600); // öffne seriellen Port auf 9600 bps:
// Serial.println("Status");
////////////////////////DISPLAY_NUR_FÜR_TEST//////////////////////
lcd.begin(20, 4); // 4 x 20 Display ist angeschlossen.
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(HIGH);
pinMode(Display, OUTPUT); //wird als Ausgang definiert für Display 5V Spannungsversorgung.
digitalWrite(Display, HIGH);
}
void loop() {
int TasterState = digitalRead(SchalterPin); // lese Taster Status
int Bewegungsmelder_1State = digitalRead(Bewegungsmelder_1); // lese Bewegungsmelder_1 Status
// int Bewegungsmelder_2State = digitalRead(Bewegungsmelder_2); // lese Bewegungsmelder_1 Status
int FreigabeState = analogRead(DaemmerungsschalterPin); // lese Analogwert des Sensors
//////////////////////////////////////////////////////////////////
////////////////////////BESUCHER_SCHALTUNG////////////////////////
//////////////////////////////////////////////////////////////////
//Der Lichtschalter wird beleuchtet, sobald die Besucher_Schaltung aktiv geschaltet wird.
if (TasterState == HIGH) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
//Licht einschalten auf kleinste Stufe
while(FreigabeState <= ein && TasterState == HIGH && state == 0 && freigabe == 0 && an_aus == 0) { // Bedingungen
for(int i = 0; i < 20; i++) {
analogWrite(LED_Haus, i);
analogWrite(LED_Wall, i);
delay(dimm1);
}
freigabe = 1;
}
//wenn alle Lampen gedimmt sind Schalter "EIN" und Bewegungsmelder aktiv , dann alle Lampen hoch dimmen.
while(TasterState == HIGH && (Bewegungsmelder_1State == HIGH) && state == 0 && (freigabe == 1 || an_aus == 2)) { // Bedingungen
for(int i = 20; i < 255; i++) {
analogWrite(LED_Haus, i);
analogWrite(LED_Wall, i);
delay(dimm2);
}
state = 1;
}
//wenn alle Lampen an sind und beide Bewegungsmelder "AUS", dann alle Lampen runter dimmen.
while((Bewegungsmelder_1State == LOW) && state == 1 && freigabe == 1) { // Bedingungen
for(int i = 255; i >= 20; i--) {
analogWrite(LED_Haus, i);
analogWrite(LED_Wall, i);
delay(dimm2);
}
state = 0;
}
//Licht komplett ausschalten.
while((FreigabeState >= aus || TasterState == LOW)&& state == 0 && freigabe == 1) { // Bedingungen
for(int i = 20; i >= 00; i--) {
analogWrite(LED_Haus, i);
analogWrite(LED_Wall, i);
delay(dimm1);
}
freigabe = 0;
}
////////////////////SERIAL_MONITOR_NUR_FÜR_TEST///////////////////
// Serial.print(freigabe);
// Serial.println(" - Freigabe");
// Serial.print(state);
// Serial.println(" - State");
// Serial.print(an_aus);
// Serial.println(" - An_Aus");
// Serial.print(FreigabeState);
// Serial.println(" - Dämmerung");
// Serial.println("-------------");
// delay(1000);
//////////////////////////////////////////////////////////////////
//////////////////////ENDE_BESUCHER_SCHALTUNG/////////////////////
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
/////////////////////////NORMAL_SCHALTUNG/////////////////////////
//////////////////////////////////////////////////////////////////
//Licht einschalten --> hoch dimmen.
while(FreigabeState <= ein && (an_aus == 0 || an_aus == 3) && freigabe == 0 && (Bewegungsmelder_1State == HIGH)) { // Bedingungen
for(int i = 0; i < 255; i++) {
analogWrite(LED_Haus, i);
analogWrite(LED_Wall, i);
delay(dimm3);
}
an_aus = 1;
}
//wenn alle Lampen an sind und Bewegungsmelder "AUS", dann alle Lampen runter dimmen.
while(an_aus == 1 && freigabe == 0 && TasterState == HIGH &&(Bewegungsmelder_1State == LOW)) { // Bedingungen
for(int i = 255; i >= 20; i--) {
analogWrite(LED_Haus, i);
analogWrite(LED_Wall, i);
delay(dimm3);
}
an_aus = 2;
}
//runter dimmen --> Licht komplett ausschalten.
while(an_aus == 2 && freigabe == 0 && TasterState == LOW &&(Bewegungsmelder_1State == LOW)) { // Bedingungen
for(int i = 20; i >= 00; i--) {
analogWrite(LED_Haus, i);
analogWrite(LED_Wall, i);
delay(dimm2);
}
an_aus = 3;
}
//Licht ausschalten --> runter dimmen.
while(an_aus == 1 && freigabe == 0 &&(Bewegungsmelder_1State == LOW)) { // Bedingungen
for(int i = 255; i >= 0; i--) {
analogWrite(LED_Haus, i);
analogWrite(LED_Wall, i);
delay(dimm2);
}
an_aus = 0;
}
//////////////////////////////////////////////////////////////////
//////////////////////ENDE_NORMAL_SCHALTUNG///////////////////////
//////////////////////////////////////////////////////////////////
}
Ich hoffe ihr könnt mir bei meinem Problem helfen.