Sketch stürzt immer wider ab

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.

Was heißt, der Sketch bleibt hängen ?
Wie äusserst sich das ?
Hast du Pullup oder Pulldown-Widerstände an den Eingangspins ?

Naja der Sketch läuft super, doch sbleibt er in unregelmäßigen abständen hängen.
Zum Beispiel bleibt das Ich auf einmal an oder Der Bewegungsmelder erkennt keine Bewegung mehr.

Ich hatte auch schon testweise ein Display angeschlossen um beobachten zu können, ob der Sketch nach einer bestimmten Zeit hängen bleibt. Leider ohne aufschlussreiche Informationen.

Der Schalter hat einen Pullup Widerstand der Bewegungsmelder nicht.
Bei dem Bewegungsmelder handelt es sich um das HC-SR501 PIR Modul.

Hi

Sicher, daß das Programm sich aufhängt und nicht z.B. die Spannungsversorgung den Arduino zu schaffen macht?
In Deinem Sketch sehe zumindest ich Nichts direkt, was einen Absturz 'fördern' würde.
Du benutzt keine Strings (war mein erster Verdacht) - allerdings benutzt Du auch das eingebundene LCD nicht - die Include-Zeilen können, meiner Meinung nach, komplett raus.
... dann muß natürlich auch die Initialisierung des LCD im setup() raus nebst Hintergrundbeleuchtung.
Mehr sehe ich vom LCD nicht.

Ohne Includes und mit auskommentierten LCD-Zeugs

Der Sketch verwendet 2204 Bytes (7%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 15 Bytes (0%) des dynamischen Speichers, 2033 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Also wirklich Nichts, wo man sich Gedanken machen müsste, daß Einem der Speicher ausgeht.
Kompiliert auf einen Nano
(mir fehlt mindestens die LCD.h, weshalb ich nicht mit Dieser kompilieren kann - da aber eh nicht benutzt, sollte Diese kaum ins Gewicht fallen)

MfG

Ich musste für den Post die Zeilen mit dem Display entfernten da >9000 Zeichen im Codeeditor nicht akzeptiert werden.

Die Spannungsversorgung des Arduino's erfolgt über ein 12V 1A Netzteil.
Ich denke das sollte auch dicke ausreichen.

Ich hoffe ihr könnt mir bei meinem Problem helfen.

Ich kann dir wohl nicht helfen...

Es sei denn, du könntest diese Ansage, als Hilfe verstehen:
Ich würde sicherlich alle Schleifen und delay() entsorgen.

Spannungsversorgung ist ein Argument.
Wie versorgst du den Aufbau ?

Die Delays entsorgen und mittels millis ersetzen bekomme ich wohl noch hin.
Wie mache ich das aber mit den Schleifen ?

Ich versorge meinen Arduino UNO über die Klinke, die sich auf dem Board befindet.

Der Lastteil für die Lampen werden über ein extra Netzteil versorgt.

Hi

Versorgst Du über die 5V vom Arduino noch andere Komponenten?
Wobei Du Die dann wohl immer versorgst und nicht erst zufällig in ein paar Tagen oder erst in 14 Tagen.

Wenn es Dir NUR darum geht, daß der Arduino nicht einfriert - bzw. wenn Er einfriert, daß wir Ihn wieder aufgetaut bekommen - WatchDogTimer.
ACHTUNG: Zeit nicht zu kurz stellen, da nach dem WDT-Reset der WatchDog immer noch aktiv ist und so in den ersten zwei Sekunden, Die der Bootloader auf den PC wartet, einen neuen Reset auslösen kann.

MfG

Naja ich versorge nur den Bewegungsmelder, den Fotowidrrstand und 2x Leistungselektronik (AOI4184) Dualmosfet, die die Beleuchtung steuert.

Die Leitungslänge bis zum Bewegungsmelder und Fotowiderstand beträgt ca 15 Meter.

Mit dem Watch Dog Timer habe ich bisher noch nicht gearbeitet.

Fritz911:
Wie mache ich das aber mit den Schleifen ?

Du hast mit loop() schon eine Schleife. Du musst dir dann nur zwischen den Durchläufen den aktuellen Zustand merken. Stichworte: Zustandsmaschine, Endlicher Automat, (Finite) State Machine

Fritz911:
Ich musste für den Post die Zeilen mit dem Display entfernten da >9000 Zeichen im Codeeditor nicht akzeptiert werden.

Die Spannungsversorgung des Arduino's erfolgt über ein 12V 1A Netzteil.
Ich denke das sollte auch dicke ausreichen.

Der Fehler tritt auf in den Eingeschrumpelten Sketchauszug, den Du uns gegeben hast oder nur in dem großen Sketch?

Du kannst den Sketch auch als Anhang am Post anhängen "Attachments and other options" unter dem Editorfenster.

Der Spannungsstabilisator kann bei 12V Versorgung nur ca 150mA bringen ohne daß er zu heiß wird und abschaltet. Versuch mal den Arduino über USB zu versorgen oder die Hintergrundbeleuchtung des Displays abzuschalten /abzuklemmen.

Grüße Uwe

Das liegt vermutlich oder sogar sicher an der Spannungsversorgung.
Wenn dein Uno ein Clone, also kein Originaler ist, dann wird der Spannungsregler auf dem Uno schon heiß, auch ohne zusätzliche Verbraucher. Der schaltet vermutlich zwischendurch mal ab.

Der Fehler tritt sowohl ohne die Displayzeilen wie auch mit Einbindung des Displays auf.

Es handelt sich hierbei um einen Uno Clone.
@ HotSystems meinst du eine Einspeisung über die USB Schnittstelle könnte auf lange Sicht das Problem lösen ?

Du kannst ein 5 Volt Netzteil an USB anschließen, oder das 12 Volt Netzteil und einen Stepdown-Regler auf 5 Volt verwenden und die 5 Volt direkt auf den 5 Volt-Pin legen.

Tip doch mal mit den Finger auf den Spannungsregler, der sollte schon spürbar heiß sein.

Fritz911:
@ HotSystems meinst du eine Einspeisung über die USB Schnittstelle könnte auf lange Sicht das Problem lösen ?

Weiß nicht aber zur Fehlersuche ist das sicher eine Möglichkeit.

Grüße Uwe

Der Spannungsregler ist nicht einmal Handwarm.

Wie betreibt ihr denn eure Boards ?
Über die USB Schnittstelle, über die Klinke oder über den 5V Pin ?

Fritz911:
Der Spannungsregler ist nicht einmal Handwarm.

Wie betreibt ihr denn eure Boards ?
Über die USB Schnittstelle, über die Klinke oder über den 5V Pin ?

Ok, dann liegt das Problem wo anders.

Ich betreibe die meisten Projekte mit 5V am 5V-Pin.
Oft mit einem zusätzlichen Stepdown-Regler.

Ja nur wo ? :confused:

Muss ich eigentlich für den Bewegungsmelder auch einen Pullup Widerstand setzen ?

Fritz911:
Der Spannungsregler ist nicht einmal Handwarm.

Das glaube ich nicht. Nicht wenn Du den Arduino mit 12V versorgst.
grüße Uwe