Programm bricht immer ab

Hallo an alle hier, ich bin neu im Forum habe aber mit der Arduinoprogrammierung schon meine ersten Gehversuche hinter mir.
Nun habe ich einen Code geschrieben, der eine Trockenkammer für PLA Filament steuern soll. Das Programm läuft gut, bleibt aber nacheinigen Minuten einfach stehen. Wenn man die Stromversorgung kurz unterbricht beginnt es wieder für einige Minuten. Das ist unabhängig ob die Stromversorgung über USB oder Netzteil stattfindet und auch unabhängig ob der Serielle Monitor mitläuft oder nicht.
Auch ob das Relais welches den Lufttrockner ein und abschaltet angeschlossen ist hat keinen Einfluß.
Woran kann das liegen?

Es könnte daran liegen, daß Du einen Fehler gemacht hast.

Wenn Du speziellere Hilfe haben möchtest, mußt Du uns mehr Informationen wie das Programm, Deinen Schaltplan und ein Foto Deines Aufbaus zur Verfügung stellen.

Hallo
das widerspricht sich. Das kann mehrere Ursachen haben meine Glaskugel vermutet eine Zahlen-Überlauf oder irgendwo wird der Speicher überschrieben.
Du solltest zunächst mal alle Zahlenwerte auf gültige Deklarierung prüfen. Hast Du Arrays verwendet ? Zeichenketten ? String-Objekte.
Bau Dir an sinnvollen Stellen Serial.print mit ein damit Du feststellen kannst wann/wo es passiert.
Wenn der code nicht zu lang ist kannst Du Ihn auch gerne hier reinstellen, da werden sich schon Leute finden die mal drübersehen. Aber bitte nicht einfach reinkopieren. Codetags verwenden oder über die IDE mit "für Forum kopieren"
Heinz

Vieles wurde dir schon mitgeteilt, es kann aber auch an deiner Spannungsversorgung liegen. Also ein Schaltbild wäre schon wichtig.

Moin
Seit wann braucht man für PLA-Filament eine zeitgesteuerte Trockenkammer ?

Die beschriebene Zeit Steuerung scheint eher unbeabsichtigt zu sein.

Ohne Sketch, und Info welchen Arduino verwendet werden bzw der Beschaltung können wir Dir nicht helfen.
Grüße Uwe

Hallo Samy,

das ist gaaanz einfach:
du gehst im deinem Programm in die Zeile 2547 und ergänzt dort die
switch-case-anweisung mit if (lazy) {continue;}

und dann verbindest du noch Pin 231 mit Reset und schon läuft dein Sketch ewig.

merkste was?

Du :"Mein Programm hat gar keine 2547 Zeilen! "
Ich: woher soll ich das wissen du hast deinen Sketch nicht gepostet.

Du "Und wo finde ich den Pin 231?"
Ich: na du zählst einfach durch.
Du: "So viele IO-pins hat mein Microcontroller nicht".
Ich: Woher soll ich das wissen du hast nicht gesagt das du
das Programm "deep-thought" im Modus 43 auf den blabla-quatschi-controller geflasht hast.

Hier hat keiner Lust dir jetzt ein 10 seitiges Tutorial zu schreiben an was das alles liegen könnte.
Und du hast keine Lust 200 verschiedene Möglichkeiten auszuprobieren.

Jetzt gibt es zwei Möglichkeiten:

  1. Du gehst zu einem echten Wahrsager der kann dir schon beim reinkommen sagen an was es liegt.

  2. Du stellst alle Informationen zur Verfügung die weiter oben schon angefragt wurden.
    und dann geht es zielstrebig in Richtung Lösung
    vgs

Ich werde versuchen den Code einzustellen und euch alle notwendigen Infos zu liefern, bis dahin schon mal danke und einen guten Start in die nächste Woche

Es gibt noch eine 3. Möglichkeit: Du legst Dir eine Kristallkugel zu, Nein, meine verleihe ich nicht.
:wink: :wink: :wink: :innocent:

Hab schon evig keine blöden Witze mit der Kristallkugel gemacht.
Grüße Uwe

Aber ist doch schon mal super, dass der TO es versuchen möchte, uns mehr Informationen zu liefern.
Da frage ich mich, wer möchte denn hier Hilfe haben ?

/*************************************************** 
 Luftfeuchtigkeitsabhängige Steuerung mit regelbarem Schwellenwert
 /******************************************************
  Pin 5 = Kontrolldiode Trocknung ein
  Pin 4 = Kontrolldiode Trocknung aus
  Pin 7 = Ausgang Relaissteuerung
  Analog 3 = Potentiometer Schwellenwertsteuerung
  A1 und A2 =I2C
 *******************************************************/
#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
 
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1
Adafruit_SH1106 display(OLED_RESET);
 

bool enableHeater = false;
uint8_t loopCnt = 0;

Adafruit_SHT31 sht31 = Adafruit_SHT31();
float Trocknungsgrad = 0;
int F=12; //Faktor zur Umrechnung Analogwert zu %
void setup() {
   display.begin(SH1106_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  Serial.begin(9600);
pinMode (5, OUTPUT);
pinMode (6, OUTPUT);
pinMode (7, OUTPUT);
pinMode (A3,INPUT);
  while (!Serial)
    delay(10);     // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("SHT31 test");
  if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate i2c addr
    Serial.println("Couldn't find SHT31");
    while (1) delay(1);
  }

  Serial.print("Heater Enabled State: ");
  if (sht31.isHeaterEnabled())
    Serial.println("ENABLED");
  else
    Serial.println("DISABLED");
}


void loop() {
  Trocknungsgrad = analogRead(A3);
  display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(1,5);
display.print("Filamenttrocknung ab\n");
display.print("   ");
display.print( Trocknungsgrad/F );
display.print (" % \nLuftfeuchtigkeit\n");

//display.display();
  
  float t = sht31.readTemperature();
  float h = sht31.readHumidity();

  if (! isnan(t)) {  // check if 'is not a number'
    Serial.print("Temp *C = "); Serial.print(t); Serial.print("\t\t");
  } else { 
    Serial.println("Failed to read temperature");
   
  }
   
  if (! isnan(h)) {  // check if 'is not a number'
    Serial.print("Hum. % = "); Serial.println(h);
    if (h < Trocknungsgrad/F)
         Serial.print("Trocknung aus");
        display.print("Aktuelle\nLuftfeuchtigkeit\n    ");
         display.print (h);
         display.print(" %");
                 display.display();
      if (h < Trocknungsgrad/F)
      digitalWrite (5,LOW); 
      if (h < Trocknungsgrad/F)
      digitalWrite (7,LOW); 
     if (h <Trocknungsgrad)
      digitalWrite (4,HIGH); 
      if (h>=Trocknungsgrad/F)
      Serial.print("Trocknung ein");
      if (h>=Trocknungsgrad/F)
      digitalWrite (5,HIGH); 
      if (h>=Trocknungsgrad/F)
      digitalWrite (7,HIGH); 
     if (h>=Trocknungsgrad/F)
      digitalWrite (4,LOW); 
       
  } else { 
    Serial.println("Failed to read humidity");
  }
  
 Serial.print(  Trocknungsgrad/F );
  delay(1000);

  // Toggle heater enabled state every 30 seconds
  // An ~3.0 degC temperature increase can be noted when heater is enabled
  if (++loopCnt == 30) {
    enableHeater = !enableHeater;
    sht31.heater(enableHeater);
    Serial.print("Heater Enabled State: ");
    if (sht31.isHeaterEnabled())
      Serial.println("ENABLED");
    else
      Serial.println("DISABLED");

    loopCnt = 0;
   
  }
}

Das ist der Code.
Aufgabe:

    • Auslesen der Luftfeuchtigkeit des Sensors SHT 31,wlcher über I2C am Board hängt.
    • Vergleich des mit dem am Eingang A03 angeschlossenen Potentiometers voreingestellten Schwellenwertes.
    • Bei Überschreiten des Schwellenwertes einschalten der Kontrolldiode an Pin 5 und des Relais an Pin 7.
      4.- Unterhalbdes Schwellenwertes Kontrolldiode an Pin 4 Einschalten.
      5.- Ausgabe der Werte am seriellen Monitor und am O LED Display

Hallo,
ich würde das jetzt erst mal vereinfachen und die Berechnung "Trocknungsgrad/F" nur einmal machen und dazu eine neu float Variable einführen. Zudem ist Trocknungsgrad ein float und F ein int. Dann kannst Du auch die if Abfragen zusammen fassen.

hier ist auch irgendwie der Wurm drin vermute fehlende Klammern {... }

if (h < Trocknungsgrad/F)
         Serial.print("Trocknung aus");
        display.print("Aktuelle\nLuftfeuchtigkeit\n    ");
         display.print (h);
         display.print(" %");
                 display.display();

Heinz

Was sagt die IDE wieviel RAM Du brauchst?

Ich würde mal das F() Makro benutzen um bei der Ausgabe von Text RAM zu sparen:
Statt:

Serial.println("SHT31 test");

schreibst Du:

Serial.println(F("SHT31 test"));

Grüße Uwe

Danke für Eire Tips. Das Programm läuft jetzt fehlerfrei.