Arduino Uno hängt sich auf !

Hallo zusammen, ich habe mich hier jetzt angemeldet und hoffe auf Hilfe, ich bin beruflich Schreiner und hab demnach mit dem ganzen echt nicht viel am Hut ! Hab mir das Programm zur Licht und Temperatursteuerung meines Terrariums großteils aus Einzelprogrammen ausm Netz zusammen gewürfelt.
Und zwei Freunde die Informatik studiert haben, haben mir bisher immer weiter helfen können, wenn Fehler vorhanden waren. Nur jetzt würde das ganze soweit fertig stehen , aber jetzt hängt sich das Ding fast täglich auf meist so um ca. 9 Uhr Vormittag, aber wenn ich da zuhause bin und es neu starte auch mal Nachmittags, der Beobachtung nach immer beim einschalten einer der HQI Lampen . Einzig über Nacht läuft es seit Wochen ohne Probleme. Ein Kumpel meinte ich soll auf eine andere Steuerung umsteigen, weis das Arduino einfach nichts taugt, was ich aber im Netz gelesen habe, liegt sowas eher an der Programmierung . Ab und an mal aufhängen wäre jetzt nicht das Thema , für Überhitzen hab ich nochmal eine externe Schutzschaltung verbaut ! Und anders, ist halt ein schlecht Wetter Tag :wink: .

Wäre toll wenn die Profis hier mal drüber schauen könnten, ob sie einen offensichtlichen Fehler erkennen :

#include <Wire.h>
#include <DS1307RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <math.h>


#define ONE_WIRE_BUS A0 //tempIn Sensor
#define VOLT A1 // Eingang Batteriespannung
#define LEDW 5 // LED warmweiß
#define LEDK 3 // LED Kaltweiß
#define LEDE 6 // LED Kaltweiß
#define SWS 9 //25Watt Spot
#define HWS 8 //70Watt Spot
#define HWF 7 //70Watt Flood
#define WS 4 // 50Watt Waermestrahler

// Konstanten
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Variablen

int sensorCount;
float TempIn = 35;
int wert1;
float wert2;
int VTemp;
int GTemp = 25;
int runSec = 0;
int runMin = 0;


void setup(void){
Serial.begin(9600);
Serial.println("Temperatursensor - DS18B20");
sensors.begin(); //Starten der Kommunikation mit dem Sensor
sensorCount = sensors.getDS18Count(); //Lesen der Anzahl der angeschlossenen Temperatursensoren.

 setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus() != timeSet){
Serial.println("Unable to sync with the RTC");
}
else{
Serial.println("RTC has set the system time");
 }

pinMode (VOLT ,INPUT); // Batteriespannung
pinMode (LEDW, OUTPUT);
pinMode (LEDK, OUTPUT);
pinMode (LEDE, OUTPUT);
pinMode (SWS, OUTPUT ); // 25watt Spot
pinMode (HWS, OUTPUT ); // 70watt Spot
pinMode (HWF, OUTPUT); // 70watt Flood
pinMode (WS, OUTPUT);  // 50Watt Waermestrahler

}

void loop(void){      

  if (sensorCount == 0){
Serial.println("Es wurde kein Temperatursensor gefunden!");
Serial.println("Bitte überprüfe deine Schaltung!");
}
else{
//Es können mehr als 1 Temperatursensor am Datenbus angschlossen werden.
//Anfordern der Temperaturwerte aller angeschlossenen Temperatursensoren.
sensors.requestTemperatures();
//Ausgabe angeschlossenen Temperatursensoren Steckplatz 0
//verwenden der Funktion printValue
printValue(sensors.getTempCByIndex(0), "°C");
  
   
//speichern des Temperatursensoren Steckplatz 0 in Variable TempIn
TempIn  = sensors.getTempCByIndex(0);
   }

//Steuerung des Waermestrahlerlampe

  
 if (runMin <= 0 ){
     digitalWrite (HWS,HIGH);
     digitalWrite (HWF,HIGH);
     digitalWrite (SWS,HIGH); 
 }

  if  (TempIn >= (GTemp+2) ) { // alle Lampen aus!
             digitalWrite (HWS,HIGH);
             digitalWrite (HWF,HIGH);
             digitalWrite (SWS,HIGH);
             runMin = 0 ;
             runSec = 0 ;
                }


// Heizstrahler 24H aktiv !! 

if (TempIn  >= (GTemp-2) ){  
digitalWrite (WS,HIGH); //aus
}

if (TempIn  <= (GTemp-5) ){ 
            digitalWrite (WS,LOW); //ein
             }


// Morgends Tagsteuerung beginnt ! 

if (hour() >= 6 && hour() <=21 ){
 
           
    //  0600 ZEIT  
if (hour() ==  6 ){
analogWrite(LEDW,0 );
analogWrite(LEDK, 10 );
analogWrite(LEDE, 0 );
        
      
}

  // 0700 ZEIT
if (hour() == 7 ){
analogWrite(LEDW,20 );
analogWrite(LEDK,50 );
analogWrite(LEDE, 0 );
     
     if (TempIn <= (GTemp-2) && runMin >= 8 ) { 
      digitalWrite(SWS, LOW ); //Lampe an ! 
}}
   

// 0800 ZEIT
if (hour() == 8 ){
analogWrite(LEDW, 150 );
analogWrite(LEDK, 30 );
analogWrite(LEDE, 30 );

       if (TempIn <= (GTemp-2) && runMin >= 8 ) { 
           digitalWrite(SWS, LOW ); //Lampe an ! 
           }
           if (TempIn <= GTemp && runMin >= 8 )   {
           digitalWrite(HWS, LOW ); //Lampe an ! 
  }}


// 0900 ZEIT
if (hour() == 9 ){
analogWrite(LEDW, 200 );
analogWrite(LEDK, 150 );
analogWrite(LEDE, 50 );
  
      if (TempIn <= GTemp && runMin >= 8 )   { 
           digitalWrite(SWS, LOW ); //Lampe an ! 
           }
           if (TempIn <= GTemp && runMin >= 8 ) {
           digitalWrite(HWS, LOW ); //Lampe an ! 
  }}


// 1000 bis 1600 ZEIT
if (hour() >= 10 && hour() <=16 ){

analogWrite(LEDW, 255 );
analogWrite(LEDK, 255 );
analogWrite(LEDE, 255 );


        

      if (TempIn <= GTemp && runMin >= 8 )   { 
           digitalWrite(SWS, LOW ); //Lampe an ! 
           }
           if (TempIn <= (GTemp-4) && runMin >= 8 ) {
           digitalWrite(HWS, LOW ); //Lampe an ! 
           }
           if (TempIn <= (GTemp-2) && runMin >= 8 ) {
           digitalWrite(HWF, LOW ); //Lampe an !  
                 
   }}
  
// 1700 ZEIT
if (hour() == 17 ){
analogWrite(LEDW, 155 );
analogWrite(LEDK, 155 );
analogWrite(LEDE, 50 );

      if (TempIn <= GTemp && runMin >= 8 ) { 
           digitalWrite(SWS, LOW ); //Lampe an ! 
           }
           if (TempIn <= (GTemp-4) && runMin >= 8 ) {
           digitalWrite(HWS, LOW ); //Lampe an ! 
           }
           if (TempIn <= (GTemp-4) && runMin >= 8 ) {
           digitalWrite(HWF, LOW ); //Lampe an !        
   }}


// 1800 ZEIT
if (hour() == 18 ){
analogWrite(LEDW,150 );
analogWrite(LEDK, 50 );
analogWrite(LEDE, 0 );

     if (TempIn <= (GTemp-2) && runMin >= 8 ) { 
     digitalWrite(SWS, LOW ); //Lampe an ! 
}} 


// 1900 ZEIT
if (hour() == 19 ){
analogWrite(LEDW,100 );
analogWrite(LEDK, 10 );
analogWrite(LEDE, 0 );
 digitalWrite(SWS, HIGH );
     
} 


// 2000 ZEIT
if (hour() == 20 ){
analogWrite(LEDW, 20 );
analogWrite(LEDK, 0 );
analogWrite(LEDE, 0 );
digitalWrite(SWS, HIGH );
digitalWrite(HWS, HIGH );
digitalWrite(HWF, HIGH );
}


// 2100 ZEIT
if (hour() == 21 ){
analogWrite(LEDW, 5 );
analogWrite(LEDK, 0 );
analogWrite(LEDE, 0 );

}}
 
   else { 
                          
                // ZEIT Nachtsteuerung beginnt !
                     if (((hour() >= 22 && hour() <=24 )||(hour() >= 0 && hour() <=5 ))){
                        analogWrite(LEDW, 0 );
                        analogWrite(LEDK, 0 );
                        analogWrite(LEDE, 0 );
                        digitalWrite (HWS,HIGH);
                        digitalWrite (HWF,HIGH);
                        digitalWrite (SWS,HIGH);
  }} 

{
float temp;
wert1=analogRead(A1); //Spannungswert am analogen Eingang 1 auslesen
temp=wert1/4 ; //Wert mathematisch umwandeln um den Spannungswert in Volt zu erhalten
wert1=(int)temp;
wert2=((wert1%100)/3.05 );
VTemp = wert2 - 10;  
GTemp = VTemp + 25;
Serial.print("VOLT=");
Serial.println(wert2); //Endgültigen Spannungswert im seriellen Monitor anzeigen
}

  if(runSec >= 60) 
  {
      ++runMin;
      runSec = 0;        
  }   

Serial.print(runMin);
Serial.print(":");
Serial.print(runSec);
Serial.println(""); 
Serial.print("GTemp:");
Serial.print(GTemp);
Serial.println("");
 // RTC 
  Serial.print(hour());
  Serial.print(":");
  Serial.print(minute());
  Serial.print(":");
  Serial.print(second());
  Serial.print(' ');    
  Serial.print(day());
  Serial.print("/");
  Serial.print(month());
  Serial.print("/");
  Serial.print(year()); 
  Serial.println(); 


delay(1000);
++runSec;
}
  
   
void printValue(float value, String text){
Serial.print("\t\t");
Serial.print(value);
Serial.println(text);


}

Wie hast Du denn die Verschiedenen Lampen angeschlossen?
Welche Lampen sind das denn genau?
Grüße Uwe

turbotom:
... Ein Kumpel meinte ich soll auf eine andere Steuerung umsteigen, weis das Arduino einfach nichts taugt,...

Der Kumpel taugt nichts.

Gruß

Gregor

HQI Lampen

Hatten wir das Thema nicht schon öfters im Zusammenhang Arduino/Terrarium?

Hi

Gibt's Die noch?
Zumindest bekomme ich Keine mehr und tausche so ziemlich Alles, was bei 3 nicht auf den Bäumen ist, gegen LED-Tiefstrahler.

MfG

Die Led´s steuere ich über XY-MOS Platinen , die HQI Vorschaltgeräte über einen 4 Relay Module Platine, diese versorge ich schon extern über Strom, da hatte ich schon das Problem das beim schalten von 3-4 Relays gleichzeitig das Arduino abstürzte/neu startete .

Die HQI Vorschaltgeräte sind OSRAM Powertronic PT 70/220-240 , sind etwa 50cm vom Arduino entfernt , kann das sein das die stören , laufen mit 4,5KV .
Die Lampen brauche ich wegen UV-A UV-B strahlung , das geht nicht mit LED .

Hat denn niemand einen hilfreichen Tipp für mich ? Ich wäre echt sehr dankbar ! Oder sind meine Informationen nicht ausreichend ?

turbotom:
Hat denn niemand einen hilfreichen Tipp für mich ? Ich wäre echt sehr dankbar ! Oder sind meine Informationen nicht ausreichend ?

Kannst du denn das Problem nachvollziehen, also eine der Lampen mal manuell einschalten. Tritt der Fehler dann auch auf ?
Wenn ja, musst du mittels zusätzlicher serieller Ausgaben herausfinden, an welcher Stelle die Störung einwirkt.

Evtl. sind die Lampen ja auch zu dicht am Arduino.

Ich hatte die Lampen Wochen lang über Zeitschaltuhren geschaltet, und nur die LED Steuerung übers Arduino, da hatte ich die Probleme nicht. Der LED Helligkeit nach passiert es wohl meist um etwa 9 Uhr und dabei ist nur die (SWS pin9) an = low . Manchmal brennen aber auch (HWS Pin8) und (SWS pin9) da greift jetzt aber die externe Schutzschaltung und schaltet die Stromversorgung ab , weil es zu heiß wird im Terrarium.

ich würde mal viel mehr Serial Ausgaben einbauen und einen Serial.Monitor mitlaufen lassen wo genau das Programm vermeintlich hängen bleibt.

Angenommen, deine Kumpels haben den Code geschrieben:
Sag ihnen, sie sollen ihn doch bitte mal aufräumen.
So etwas:

if (TempIn <= GTemp && runMin >= 8 )   {
           digitalWrite(SWS, LOW ); //Lampe an !
           }
           if (TempIn <= GTemp && runMin >= 8 ) {
           digitalWrite(HWS, LOW ); //Lampe an !
  }}

hilft leider gar nicht bei der Fehlersuche.

Dann sollte man noch ein bisschen umbauen, dass der Code effizienter läuft (kein Delay z.B.).
Sonst konnte ich auf die Schnelle keinen Fehler entdecken, wenn ich raten müsste, würde ich sagen, dass eine der vielen if-Abfragen deinen Prozessor in eine Endlosschleife schickt.
Hast du evtl. die serielle Ausgabe von einem Aufhänger für uns? Also was der Serial Monitor um die Zeit herum ausspuckt, wo er sich zuletzt aufgehangen hat?

Geschrieben hab ich das großteils selber , diesen Timer das die HQI Lampen nicht gleich wieder einschalten können wenn sie abgeschaltet haben, wurden zb. hat mir ein Kumpel eingefügt .

Hab denn Serial Monitor gestern mal noch erweitert und Übernacht mit laufen lassen, war ein komischer fehler der Heute früh vorhanden war, die TX led war noch am blinken = loop läuft noch (oder?) Aber der Serial Monitor hängte und die SWS Lampe wo laut laut Serial Monitor an sein sollte war nicht an , LED Status war aber aktuell ! Ich lasse das jetzt mal weiter mit laufen bis da der "standart" Fehler auftritt.

Gibt es eine Option die If anfragen zu reduzieren oder die Steuerung einzuschränken ?

Ach da ist er eh schon (einer) der “standart” Fehler, so greift aktuell die externe Schutzschaltung weil es zu heiß wird mit beiden Lampen .

"SWS ein 800HWS ein 800VOLT=15.74
9:27
GTemp:30
8:26:58 9/5/2020
25.94°C
SWS ein 800HWS ein 800VOLT=15.74
9:28
GTemp:30
8:27:0 9/5/2020
26.00°C
SWS ein 800HWS ein 800VOLT=15.74
9:29
GTemp:30
8:27:1 9/5/2020
26.00°C
SWS ein 800HWS ein 800VOLT=16.07
9:30
GTemp:31
8:27:3 9/5/2020
25.94°C
WL einSWS ein 800HWS ein 800VOLT=15.74
9:31
GTemp:30
8:27:5 9/5/2020
25.94°C
SWS ein 800HWS ein 800VOLT=15.74
9:32
GTemp:30
8:27:6 9/5/2020
25.94°C
"

Also beide Lampen waren schon etwa 5min an

Das klingt für mich ganz stark nach einem Fehler in den if-Schleifen: ein oder auch mehrere Fälle lösen keine deiner Schleifen aus, deshalb blinkt der Arduino noch, macht aber nichts mehr.
Sowohl deinen Code verkleinern als auch (wahrscheinlich) dein Problem lösen kannst du, indem du dir Zettel und Stift nimmst, alle Möglichkeiten aufschreibst und was der Arduino dazu machen soll (dein bisheriger Code hilft dir bei letzterem). Dann kriegst du genau so viele if-Abfragen, wie du brauchst und dein Arduino sollte nicht mehr im Nirvana arbeiten.

[ur}http://if-schleife.de/[/url]

Schritt-Kette/fine state machine/State-Maschine/endlicher Automat/...

Alles, was einen eigenen Ablauf bildet, wird eine eigene FSM.
Alles, was nicht ausgeführt werden soll, wird eben NICHT ausgeführt - es wird NICHT gewartet!
Alles, was ausgeführt wird, darf keine Zeit brauchen - zur Not aufteilen

Dafür brauchst Du pro FSM eine Status-Variable, wo Du Dich überhaupt momentan befindest.
Wenn Aufgaben gestückelt werden (z.B. baue ich ein oLED maximal 40ms auf, bevor die Aktion unterbrochen wird, damit loop() flüssig weiter läuft - die Zähl-Variable, wie weit das oLED aufgebaut ist, wird dann natürlich ebenfalls benötigt - ist quasi eine eigene FSM in einer FSM).

Such nach der Nachtwächter-Erklärung

MfG