If Else Statement sorgt für WDT Reset

Seitdem ich 3 if else Blöcke drin habe macht mein Wemos D1 R1 nur noch WDT Reset.
Kommentiere ich diese aus, dann funktioniert es wieder.

Bisschen rausgelesen habe ich, das alles zu schnell läuft und deswegen paar delays eingebaut.

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2

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

const char* ssid = "";
const char* password = "";
WiFiUDP Client;
int ws1 = 1;
int ws2 = 2;
int betrieb = 6;
int ws1st=0;
int ws2st=0;
int betriebst=0;

void setup()
{
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");
  
sensors.begin();
  
pinMode(ws1, INPUT_PULLUP);
pinMode(ws2, INPUT_PULLUP);  
pinMode(betrieb, INPUT_PULLUP);
Serial.println(" 5 Sek Pause");
  delay(5000);
}
void SendString(byte InstrNr, int MWert) {
 
Client.beginPacket("192.168.0.63",6001);
Client.print("#");
Client.print(InstrNr);
Client.print("M");
Client.print(MWert);
Client.print("<");
Client.endPacket();
}


void loop()
{
SendString(8,30);
Serial.println(" Send Frequencystring");
delay(500);
sensors.requestTemperatures();
SendString(1,sensors.getTempCByIndex(0));
SendString(2,sensors.getTempCByIndex(1));
SendString(3,sensors.getTempCByIndex(2));
SendString(4,sensors.getTempCByIndex(3));
Serial.println(" Send Tempstring");
delay(1000);

ws1st=digitalRead(ws1);
 if (ws1st == HIGH) {
   SendString(5,000);}
   else {
   SendString(5,201);
 }

 ws2st=digitalRead(ws2);
 if (ws2st == HIGH) {
   SendString(6,000);}
   else {
   SendString(6,201);
 }

betriebst=digitalRead(betrieb);
 if (betriebst == HIGH) {
   SendString(7,000);}
   else {
   SendString(7,201);
 }
delay(500);

}

Hi

Der WDT schlägt zu, wenn's eben zu lange dauert - da sollte delay() eigentlich nicht der Weg sein.
Denke aber, daß während des delay() der WDR aufgerufen wird und somit der Wachhund regelmäßig zurück gepfiffen wird.

Nebenfrage: Was bezweckst Du mit der Zahl 000 ?
Ok, Das ergibt auch Null, aber nicht so, wie Du Dir Das gedacht hast.
Zumindest hast Du nicht 020 benutzt - Das wären nämlich nur 8 16 ( 2x 8 ), statt 20 (führende Null=Oktal).

Wodurch der WDT resettet wird (WDR), sollte sich irgendwo in den Tiefen der Dokumentation finden lassen.

MfG

postmaster-ino:
Nebenfrage: Was bezweckst DU mit der Zahl 000 ?

Das Telegramm ist so formatiert. Die einzelnen Stellen stehen für eine Funktion.

Protokoll: #kMfdm< wobei:
k = Kanal-Nummer (1...999)
f = Farbe (0=Grau, 1=Gelb, 2= Grün, 3=Rot)
d = Design (0=Rund, 1=Rechteck, 2= Pfeil oben,
3=Pfeil unten, 4=Pfeil rechts, 5=Pfeil links)
m = Mode (0=Statisch, 1=Blinkend)

Hi

Habe Mal das DU in ein Du geändert :slight_smile:
Du möchtest damit "000", also drei Stellen übergeben?
Dann solltest Du Das auch so in der Sende-Funktion machen.
Den Wert kannst Du ja weiterhin als Zahl übergeben (kostet zwei Byte Speicherplatz) - als string (kleines s) wären Das Drei - vll. doch eine Idee, Das in string zu ändern, mit einem Byte (allerdings pro Aufruf) mehr wirst Du das Aufweiten der Zahl in drei Ziffern nicht hinbekommen.

Noch ist mir der Aufbau etwas suspekt - muß mir aber nicht in den Kopf gehen, muß nur bei Dir funktionieren!
Deine 000 ist für den Arduino nur eine Null, zwar in Oktal, aber eine Null.
Probiere, zum Spaß, 092 - wird einen Error hervorbringen, weil Es die 9 im oktalem Zahlensystem nicht gibt.

MfG

Das ist ja nur für eine LED in der Visualisierung. Ansonsten gebe ich Werte darüber.

as Standard SerialComInstruments Protokoll
Die COM-Schnittstelle ist fest eingestellt auf 8 Data Bits, 1 Stop Bit und No Parity.
Es findet keine Hardware- oder Software Flusskontrolle statt. Protokoll:
#kMm< # - Identifier Messwertübertragung Start
k - Kanal Nummer (1 bis 3 stellig)
M - Identifier Messwert Start
m - Messwert
< - Identifier Ende
Mit realen Werten dann z.B. so :
#41M15.345< in Klartext: schicke an Kanal Nr. 41 den Wert 15,345
Dieser Datensatz muss vom Mikrocontroller als String an den PC gesendet werden.
CRLF (Carriage Return und Linefeed) Zeichen sind als Abschluss nicht notwendig.
Eine bestimmte Reihenfolge braucht beim Senden der Datensätze nicht eingehalten
werden. Es können z.B. 10 Datensätze gleichzeitig, einzeln oder beliebig gemischt
versendet werden

Aber jetzt mal was anderes, wenn ich das Pinmode auskommentiere läuft wieder alles. Es stürzt zumindestens nichts ab.

EDIT:

Das Problem ist gelöst. Aufgrund des Pinmappings, muss man D1 D2 etc. benutzen und kann nicht wie bei einem Arduino Board einfach 1 2 3 usw. schreiben.

und kann nicht wie bei einem Arduino Board einfach 1 2 3 usw. schreiben.

Doch kannst du!
Nur sind das andere Pins!

Siehe hier

postmaster-ino:
Zumindest hast Du nicht 020 benutzt - Das wären nämlich nur 8, statt 20 (führende Null=Oktal).

Das solltest du nochmal nachrechnen und dann ändern. :wink:

Oh ... so kanns gehen :wink:
Wird direkt angepasst ... man wird nicht jünger.

Danke für's 'drüber gucken'!

MfG