Wemos D1 Mini stürzt nach Tastendruck ab.

Hallo Foren Gemeinde,

Ich habe ein ein Arduino Sketch für eine Höhenstandsmessung geschrieben.

Funktionsweise des Sketches:

  • Der Wemos verbindet sich mit dem WLAN Netzwerk.
  • Er sendet alle xx Sekunden den Höhenstand und ein paar andere errechnete Werte an meine Heimautomation.
  • Verbaut ist auch ein 2x16 LCD Display welches über I2C angeschlossen ist.
    → Dieses soll mittels Taster und Interrupt Routine für eine gewisse Zeit angeschaltet werden und mir die errechneten Werte anzeigen.

Mein Problem ist jetzt sobald ich den Taster drücke und das Display angehen sollte stürzt das Board ab und startet neu. Der Serial Monitor gibt dabei folgende Meldung aus:

Exception (9):
epc1=0x40104e81 epc2=0x00000000 epc3=0x00000000 excvaddr=0xffffffff depc=0x00000000

ctx: sys
sp: 3ffffd00 end: 3fffffb0 offset: 01a0

stack>>>
3ffffea0: 00000000 3fff04bc ffffffe0 00000000
3ffffeb0: 4021bd03 3fff04d4 00000010 ffffffff
3ffffec0: 40000f58 00000000 00000020 00000000
3ffffed0: 00000000 00310101 00640102 00000056
3ffffee0: 3ffebaa4 00000108 3ffebaca 3ffeba98
3ffffef0: 3ffebad0 3ffebaa4 3ffebabd 3ffebadb
3fffff00: 00000000 3ffebb75 3ffebb5f 3ffebb2c
3fffff10: 3ffebae1 3ffebafd 00000000 3ffebb8d
3fffff20: 00000000 00000000 00000040 00000000
3fffff30: 3fff0c4c 4021b722 3ffecce0 3fff04bc
3fffff40: 00000000 3ffede88 3ffecce0 3ffeba80
3fffff50: 3ffeba80 00000130 00000000 00000040
3fffff60: 00000000 3ffeba8a 40224f8b 3ffecce0
3fffff70: 3ffeba74 3fffdcc0 3ffe92a0 3ffe92a0
3fffff80: 00000080 3ffecce0 00000000 3fffdcb0
3fffff90: 4022484b 3fffdab0 00000000 00000004
3fffffa0: 3ffe92a0 40000f49 3fffdab0 40000f49
<<<stack<<<

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1384, room 16
tail 8
chksum 0x2d
csum 0x2d
v614f7c32
~ld

Der Taster ist übrigens über eine Widerstand auf Masse gelegt.

Ich hoffe ihr könnt mir helfen. :slight_smile:

An welchem Pin hast Du den Taster angeschlossen?

rst cause:2 heißt Resetpin (Liste)

Hast Du den Exception-Decoder installiert?

Gruß Tommy

Edit: Außerdem solltest Du Deinen Sketch hier zeigen. Stelle den bitte in Codetags (</>-Button oben links im Forumseditor)

Der Taster ist an Pin D7 angeschlossen.

Den Exception-Decoder habe ich nicht installiert.

Lade ihn gleich mal runter. Was kann ich damit genau anstellen ?

Anbei mein Code

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <MQTTClient.h>

#define BACKLIGHT_PIN     13
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  
 

int trigger = 14;         
int echo = 16;             
      
 
long dauer = 0;          
long einbauhoehe = 10;   
long tank_voll = 108;    
volatile long fuellhoehe = 0;      

long tank_laenge = 197;      
volatile long volumen = 0;             

volatile long prozent = 0;            

  //Wlan Zugangsdaten
const char* host = "192....";
const char* ssid = "Router";
const char* password = "PW";

WiFiClient net;
MQTTClient mqtt;

const byte interruptPin = 13;
volatile byte interruptCounter = 0;
int numberOfInterrupts = 0;

void connect();

void setup() { 

  
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), Display, FALLING);

  

Serial.begin(115200);
Serial.println();
Serial.println("Booting...");

WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);

mqtt.begin(host, net);

connect();
Serial.println("Setup completed...");

lcd.begin(16, 2);          
lcd.setBacklightPin(3,POSITIVE);
lcd.setBacklight(LOW);
pinMode(trigger, OUTPUT); 
pinMode(echo, INPUT);     


}

void loop() { 


  if (!mqtt.connected()) {
    connect();
  }

  mqtt.loop();
  delay(5000);


    
digitalWrite(trigger, LOW);
delay(5);
digitalWrite(trigger, HIGH);
delay(10);
digitalWrite(trigger, LOW);

 
dauer = pulseIn(echo, HIGH);                               
fuellhoehe = tank_voll - (dauer/2) / 29.1 + einbauhoehe;    

 
volumen = ((fuellhoehe * fuellhoehe) *3.14) / 4 * tank_laenge /1000;

  
int prozent = map(fuellhoehe, 0,108, 0,100);   // 0 ^ 0%, 108cm ^ 100%.



 
  Serial.print("Sending... ");
  if (!isnan(fuellhoehe) || !isnan(volumen)  || !isnan(prozent)){
    mqtt.publish("/Regenwassertank/volumen", String(volumen));
    mqtt.publish("/Regenwassertank/fuellhoehe", String(fuellhoehe));
    mqtt.publish("/Regenwassertank/prozent", String(prozent));
    
    Serial.print("Volumen: ");
    Serial.print(String(volumen));
    Serial.print("Fuellhoehe: ");
    Serial.println(String(fuellhoehe));
    Serial.print("Prozent: ");
    Serial.print(String(prozent));
  }
}


void connect() {
  while(WiFi.waitForConnectResult() != WL_CONNECTED) {
    WiFi.begin(ssid, password);
    Serial.println("WiFi connection failed. Retry.");
  }

  Serial.print("Wifi connection successful - IP-Address: ");
  Serial.println(WiFi.localIP());

  while (!mqtt.connect(host)) {
    Serial.print(".");
  }

  Serial.println("MQTT connected!");
}

void messageReceived(String topic, String payload, char * bytes, unsigned int length) {
  Serial.print("incoming: ");
  Serial.print(topic);
  Serial.print(" - ");
  Serial.print(payload);
  Serial.println();
}

void Display() {
  
 
lcd.setBacklight(HIGH);
  
   
lcd.setCursor(0, 0);      
lcd.print("Tankinhalt:");

 
lcd.setCursor(0, 1);     
lcd.print(fuellhoehe);
lcd.print(" cm  ");

 
lcd.setCursor(9, 1);  
lcd.print(volumen);
lcd.print(" l  ");

 
lcd.setCursor(11, 0);                        
lcd.print(prozent);
lcd.print("%  ");

  delay(200); 
lcd.setBacklight(LOW); 
lcd.clear();


}

Der Exception-Decoder gibt folgendes an :

Exception 9: LoadStoreAlignmentCause: Load or store to an unaligned address
PC: 0x40104e81
EXCVADDR: 0xffffffff

Interruptroutinen müssen in einem speziellen Speicherbereich stehen:

void ICACHE_RAM_ATTR Display() {...}

Delay in der Interruptroutine ist tödlich. Interruptroutinen müssen kurz und schnell sein. Also nur ein Flag setzen und im Loop die Arbeit erledigen.

Du benötigst aber keinen Interrupt für Deinen Taster, wenn Du sicher stellst, dass Dein Loop schnell genug ist, d.h. lange delays rauswerfen und Zeitsteuerung über millis() machen.
Schau Dir dazu BlinkWithoutDelay und die Nachtwächtererklärung an.

Gruß Tommy

Was soll dies Interruptfunktion?

Du stellst einen Text dar der nach kurzer Zeit wieder gelöscht wird.

Grüße Uwe

Mein einziger Gedanke ist dabei, das ich nur kurz einmal das Display anschalte um die Werte einmal zu sehen. Das Eigentliche verschicken der Werte passiert ja kontinuierlich im Hintergrund per MQTT.

Ich stehe gerade ein wenig auf dem Schlauch...

Also die void Display auslöschen und den Taster dann wie einbinden ?

Ich habe den Sketch noch einmal volkommen überarbeitet.

Jetzt funktioniert alles bestens millis() sei dank 8)

Vielen dank noch einmal für eure Lösungsvorschläge :wink:

Schön und danke für die Rückmeldung.
Für die User des Forums wäre es gut, wenn Du den Endstand des Sketches noch veröffentlichst.

Gruß Tommy

Fritz911:
Mein einziger Gedanke ist dabei, das ich nur kurz einmal das Display anschalte um die Werte einmal zu sehen. Das Eigentliche verschicken der Werte passiert ja kontinuierlich im Hintergrund per MQTT.

Ich stehe gerade ein wenig auf dem Schlauch...

Also die void Display auslöschen und den Taster dann wie einbinden ?

Und Du glaubst in 0,2 S siehst Du was auf dem Display?