Servuz,
ich baue gerade einen Ersatz-Controller für eine Kühlbox, da der alte 
(ChinaMüll) Controller abgeraucht ist. Ich verwende einen Wemos D1 Mini, 
ein 128x64 SSD1306 OLED Display und einen Rotary Encoder über I2C.
Das ganze soll relativ simpel sein, man schaltet das Gerät an, es zeigt 
die aktuelle Temperatur auf dem Display an. Man drückt den Rotary 
Encoder Button und ist nun im Einstellungs-Modus, durch Drehen stellt 
man die Ziel-Temperatur ein, durch erneutes Drücken des Buttons wird 
diese bestätigt. Den Berechnungsteil mit Widerstand/Temperatur messen 
und Steuern des Kompressors etc hab ich noch ausgelassen geht mir 
erstmal nur um die Bedienelemente. Soweit funktioniert jetzt alles ABER 
wenn ich den Button drücke, dann einen Wert einstelle und dann einfach 
warte und nichts mache, triggert der Watchdog und macht nen Reset. Das 
selbe wenn ich den Button drücke und dann gar keinen Wert einstelle und 
einfach nur warte. So nach 2-3 Sekunden hängt sich da was auf und ich 
hab keine Ahnung wieso. Bin dann doch eher Elektroniker als 
Programmierer und hoffe mir kann jemand weiterhelfen.
Ich verwende die Library ESPRotary und für das Display die Adafruit 
SSD1306/GFX Libraries.
Hier hab ich mal ein kurzes Video von dem Problem zum besseren 
Verständnis:
https://streamable.com/76rj2y 
Und hier natürlich mein Code:
 1 #include <Wire.h>
 2 #include <Adafruit_GFX.h>
 3 #include <Adafruit_SSD1306.h>
 4 #include "ESPRotary.h"
 5 
 6 #define ROTARY_PIN1 12
 7 #define ROTARY_PIN2 14
 8 #define CLICKS_PER_STEP 4
 9 #define MIN_POS         -20
 10 #define MAX_POS         20
 11 #define START_POS       0
 12 #define INCREMENT       1
 13 #define SCREEN_WIDTH 128
 14 #define SCREEN_HEIGHT 64
 15 #define OLED_RESET -1
 16 #define LOGO_WIDTH 128
 17 #define LOGO_HEIGHT 64
 18 
 19 ESPRotary r;
 20 
 21 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 22 
 23 const unsigned char logo_bmp [] PROGMEM = {
 24   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 25   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 26   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 27   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 28   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 29   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 30   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 31   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 32   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 33   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 34   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 35   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 36   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 37   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 38   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 39   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 40   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 41   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 42   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 43   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 44   0x7f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x0f, 0xc0, 0x7c, 0x00, 0x00, 0x00, 
 45   0x7f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x0f, 0xc0, 0x7c, 0x00, 0x00, 0x00, 
 46   0x7f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x0f, 0x80, 0xfc, 0x00, 0x00, 0x00, 
 47   0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x1f, 0x80, 0xf8, 0x00, 0x00, 0x00, 
 48   0x7f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x1f, 0x01, 0xf8, 0x00, 0x00, 0x00, 
 49   0x00, 0x0f, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x00, 
 50   0x00, 0x1f, 0xff, 0xff, 0xf8, 0x0f, 0xff, 0x81, 0xf0, 0xfe, 0x3f, 0x1f, 0xff, 0x07, 0xff, 0xe0, 
 51   0x00, 0x1f, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0x83, 0xf1, 0xfc, 0x3e, 0x1f, 0xff, 0x1f, 0xff, 0xc0, 
 52   0x00, 0x1f, 0x07, 0xff, 0xf0, 0x7f, 0xff, 0x83, 0xe3, 0xf8, 0x7e, 0x3f, 0xfe, 0x3f, 0xff, 0xc0, 
 53   0x00, 0x3f, 0x0f, 0xff, 0xf0, 0x7f, 0xff, 0x03, 0xe7, 0xf0, 0x7e, 0x3f, 0xfe, 0x3f, 0xff, 0xc0, 
 54   0x00, 0x3e, 0x0f, 0xff, 0xf0, 0xff, 0xff, 0x07, 0xef, 0xe0, 0x7c, 0x07, 0xe0, 0x3f, 0xff, 0x80, 
 55   0x00, 0x3e, 0x0f, 0x83, 0xe0, 0xf8, 0x3f, 0x07, 0xff, 0xc0, 0xfc, 0x07, 0xc0, 0x7e, 0x1f, 0x80, 
 56   0x00, 0x7e, 0x1f, 0x87, 0xe0, 0xf8, 0x3e, 0x07, 0xff, 0x80, 0xfc, 0x07, 0xc0, 0x7c, 0x1f, 0x80, 
 57   0x00, 0x7c, 0x1f, 0x07, 0xc1, 0xf8, 0x7e, 0x0f, 0xff, 0x00, 0xf8, 0x0f, 0xc0, 0xfc, 0x1f, 0x00, 
 58   0x00, 0xfc, 0x1f, 0x07, 0xc1, 0xf0, 0x7e, 0x0f, 0xbe, 0x01, 0xf8, 0x0f, 0x80, 0xfc, 0x3f, 0x00, 
 59   0x00, 0xfc, 0x3f, 0x0f, 0xc3, 0xf0, 0x7c, 0x1f, 0xbf, 0x01, 0xf0, 0x1f, 0x80, 0xf8, 0x3f, 0x00, 
 60   0x00, 0xf8, 0x3e, 0x0f, 0x83, 0xf0, 0xfc, 0x1f, 0x9f, 0x01, 0xf0, 0x1f, 0x81, 0xf8, 0x3e, 0x00, 
 61   0x01, 0xf8, 0x7e, 0x1f, 0x83, 0xe0, 0xf8, 0x1f, 0x1f, 0x03, 0xf0, 0x1f, 0x01, 0xf8, 0x7e, 0x00, 
 62   0x01, 0xf0, 0x7c, 0x1f, 0x87, 0xe0, 0xf8, 0x3f, 0x1f, 0x03, 0xe0, 0x3f, 0x01, 0xf0, 0x7c, 0x00, 
 63   0x01, 0xf0, 0x7c, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 
 64   0x03, 0xf0, 0xfc, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 
 65   0x03, 0xe0, 0xf8, 0x3f, 0xf7, 0xfd, 0xff, 0x7e, 0x0f, 0xf3, 0xff, 0xbf, 0xfb, 0xfe, 0x7f, 0xfe, 
 66   0x07, 0xe1, 0xf8, 0x3f, 0xe3, 0xf8, 0xfe, 0x7c, 0x0f, 0xe3, 0xff, 0x1f, 0xf1, 0xfc, 0x7f, 0xfe, 
 67   0x07, 0xe1, 0xf8, 0x7f, 0xc1, 0xf0, 0x7c, 0x7c, 0x0f, 0xc0, 0xfe, 0x0f, 0xe0, 0xf8, 0x1f, 0xfe, 
 68   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 69   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 70   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 71   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 72   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 73   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 74   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 75   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 76   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 77   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 78   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 79   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 80   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 81   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 82   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 83   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 84   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 85   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 86   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 87   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 88 };
 89 
 90 void setup() {
 91   Serial.begin(9600);
 92   delay(50);
 93 
 94   pinMode(13, INPUT);
 95 
 96   r.begin(ROTARY_PIN1, ROTARY_PIN2, CLICKS_PER_STEP, MIN_POS, MAX_POS, START_POS, INCREMENT);
 97   r.setChangedHandler(rotate);
 98 
 99   if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
 100     Serial.println(F("SSD1306 allocation failed"));
 101     for(;;);
 102   }
 103   
 104   startup();
 105   display.setTextSize(4);
 106   display.setTextColor(SSD1306_WHITE);
 107 }
 108 
 109 void loop() {
 110   showTemp();
 111   if (digitalRead(13) == LOW) {
 112     setTemp();
 113   }
 114 }
 115 
 116 void setTemp(void) {
 117   delay(500);
 118   display.setTextSize(4);
 119   display.setTextColor(SSD1306_WHITE);
 120   display.clearDisplay();
 121   display.fillRect(0, 60, 128, 10, SSD1306_WHITE);
 122   display.display();
 123   do {
 124       r.loop();
 125   } while (digitalRead(13) != LOW);
 126   delay(500);
 127 }
 128 
 129 void showTemp(void) {
 130   display.clearDisplay();
 131   display.setCursor(0, 10);
 132   int tempval = analogRead(A0);
 133   long temp = map (tempval, 0, 1023, -20, 20);
 134   display.print(temp);
 135   display.print((char)247);
 136   display.print("C");
 137   display.display();
 138 }
 139 
 140 void startup(void) {
 141   display.clearDisplay();
 142   display.drawBitmap(
 143     (display.width()  - LOGO_WIDTH ) / 2,
 144     (display.height() - LOGO_HEIGHT) / 2,
 145     logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
 146   display.display();
 147   delay(1500);
 148   String str = "Modell 650";
 149   display.clearDisplay();
 150   display.setTextColor(SSD1306_WHITE);
 151   display.setTextSize(2);
 152   display.setCursor(128-(str.length())/2, 10);
 153   display.print(F("Modell 650"));
 154   display.display();
 155   delay(1500);
 156 }
 157 
 158 void rotate(ESPRotary& r) {
 159   int pos = r.getPosition();
 160   Serial.println(pos);
 161   display.clearDisplay();
 162   display.fillRect(0, 60, 128, 10, SSD1306_WHITE);
 163   display.setCursor(0, 10);
 164   display.print(pos);
 165   display.print((char)247);
 166   display.print("C");
 167   display.display();
 168 }
 
 
   
  
  
 
      
      
  
  
    
      von
      
        Stefan F.  (Gast)
      
      
       
    
    
      11.09.2022 15:18  
    
    
     
  
   
  
  
      Espressif empfiehlt maximal 20ms, sonst riskierst du einen Ausfall der 
WLAN Schnittstelle. Deine Warteschleife dauert so lange, dass der 
Watchdog einen Neustart auslöst.
Diesen und weitere gemeine Hinweise findest du auf 
http://stefanfrings.de/esp8266/index.html#fallstricke 
 1 do  
2 { 
3     r . loop (); 
 4 }  
5 while  ( digitalRead ( 13 )  !=  LOW ); 
Dein Programm ist falsch strukturiert. Eigentlich soll es solche 
Warteschleifen nicht geben. Die loop soll bei jedem Durchlauf nur kurz 
etwas machen und dann die Kontrolle zurück an das Betriebssystem 
übergeben (indem sie sich beendet).
Deine langen delay() Aufrufe sind schon schlecht. An dieser Stelle 
rettet dich allerdings das Arduino Framework, weil es innerhalb der 
delay Funktion aktiv Kontrolle an das Betriebssystem abgibt indem es 
yield() aufruft. Das könntest du in deiner Warteschleife auch tun. 
Allerdings treibt man damit den Verbrauch von Stapelspeicher (der eh 
relativ klein ist) in die Höhe und handelt sich ab und zu mal andere 
unerwartete Seiteneffekte ein.
Lies meinen Artikel über Zustandsautomaten, denn da lernst du, wie du 
deine Aufgabe ganz ohne Warteschleifen umsetzen kannst.
http://stefanfrings.de/multithreading_arduino/index.html  
   
  
  
 
      
      
  
  
  
   
  
  
      Hey danke für deine ausführliche Antwort, versteh das Problem jetzt 
auch, da hat wirklich ne Fliege geklemmt. Hab den Code umgeschrieben, 
damit er im main loop bleibt und dort über Variablen checkt ob er sich 
im "Settings Modus" befindet. Jetzt funktioniert alles wunderbar. :) 
   
  
  
 
    
    
         
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.