Go Down

Topic: ESPnodeMCU führt Code manchmal nur teilweise aus (Read 122 times) previous topic - next topic

stoni99

Ich habe in meinem ESPnodeMCU mit einem OLED über I2C ein kleines Programm zu laufen.

Am OLED lasse ich mir zu Kontrolle einige Anzeigen mit der Ausführungszeit eintragen - als scroll-Protokoll sozusagen. Da ich zu meinem OLED etwas umständlichen Zugang habe, lasse ich mir zusätzlich diese Daten per html-Antwort auf mein Smartphone schicken.

Nun kommt es vor dass manchmal am OLED irgend ein Wert nicht angezeigt wird - merkwürdiger Weise erscheint der Wert aber per html-Rückmeldung richtig auf meinem Smartphone.


Seht ihr einen Fehler oder habt eine Idee?

Der ganze Code ist zu groß - ich habe mal den betreffenden Abschnitt reingestellt:

Code: [Select]

// Unterprogramme ---------------------------------------------------------------------------------------


// Anzeige am OLED & HTML-Seite scrollen-------------------------
void Scroll(String ScrollString)  {     //Unterprogramm um Display zu hochrückend zu beschreiben
  // OLED Anzeige
  Zeile1 = Zeile2;
  Zeile2 = Zeile3;
  Zeile3 = Zeile4;
  Zeile4 = Zeile5;
  Zeile5 = Zeile6;
  Zeile6 = Zeile7;
  Zeile7 = Zeile8;
  Zeile8 = (ScrollString);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println(Zeile1);
  display.println(Zeile2);
  display.println(Zeile3);
  display.println(Zeile4);
  display.println(Zeile5);
  display.println(Zeile6);
  display.println(Zeile7);
  display.println(Zeile8);
  display.display();
  // HTML-Anzeige
  HTMLZeile1 = HTMLZeile2;
  HTMLZeile2 = HTMLZeile3;
  HTMLZeile3 = HTMLZeile4;
  HTMLZeile4 = HTMLZeile5;
  HTMLZeile5 = HTMLZeile6;
  HTMLZeile6 = HTMLZeile7;
  HTMLZeile7 = HTMLZeile8;
  HTMLZeile8 = HTMLZeile9;
  HTMLZeile9 = HTMLZeile10;
  HTMLZeile10 = HTMLZeile11;
  HTMLZeile11 = HTMLZeile12;
  HTMLZeile12 = HTMLZeile13;
  HTMLZeile13 = HTMLZeile14;
  HTMLZeile14 = HTMLZeile15;
  HTMLZeile15 = HTMLZeile16;
  HTMLZeile16 = HTMLZeile17;
  HTMLZeile17 = HTMLZeile18;
  HTMLZeile18 = HTMLZeile19;
  HTMLZeile19 = HTMLZeile20;
  HTMLZeile20 = HTMLZeile21;
  HTMLZeile21 = HTMLZeile22;
  HTMLZeile22 = HTMLZeile23;
  HTMLZeile23 = HTMLZeile24;
  HTMLZeile24 = HTMLZeile25;
  HTMLZeile25 = HTMLZeile26;
  HTMLZeile26 = HTMLZeile27;
  HTMLZeile27 = HTMLZeile28;
  HTMLZeile28 = HTMLZeile29;
  HTMLZeile29 = HTMLZeile30;
  HTMLZeile30 = String(hour()) + ":" + String(minute()) + ":" + String(second()) + " --> " + (ScrollString);
}


stoni99

Hat wohl keiner eine Idee.

Aber einen groben Fehler hab ich wohl auch nicht übersehen...

An einer Stelle kann ich es jetzt direkt nachvollziehen.

Wifi schaltet über Nacht aus und startet früh neu.

Im OLED steht dann noch:

...
WIFI connectet
Server started

Das darauffolgende "myIpString" (IP Adresse) wird im OLED nicht mehr angezeigt.
Wähle ich mich per Smartphone in den ESP ein gibt er mir aber die richtige Protokollierung.

...
WIFI connectet
Server started
19.168.10...


Starte ich den ESP neu und er wählt sich neu in WIFI ein zeigt er auch auf dem OLED die richtige Protokollierung.

Hat noch jemand einen Tip für mich?  :smiley-mr-green:


Code: [Select]

// WiFi starten & anmelden -------------------------
void WiFiStart()                              // Unterprogramm um WiFi am Router anzumelden
{
  // Connect to WiFi network
  Scroll("Call to " + String(ssid));                      //Unterprogramm aufrufen um String in Display zu schreiben
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
 
  Scroll("WiFi connected       ");                      //Unterprogramm aufrufen um String in Display zu schreiben
   
  // Start the server
  server.begin();
  Scroll("Server started       ");                      //Unterprogramm aufrufen um String in Display zu schreiben

  // Print the IP address
  IPAddress myIp = WiFi.localIP();
  sprintf(myIpString, "%d.%d.%d.%d", myIp[0], myIp[1], myIp[2], myIp[3]);   //IP muss in String umgewandelt werden
  Scroll(myIpString);                                   //Unterprogramm aufrufen um String in Display zu schreiben
  initAlarmzeiten();                                    // Unterprogramm aufrufen um Sprengerzeiten neu einzustellen
}

xbow42

#2
Mar 16, 2017, 01:38 pm Last Edit: Mar 16, 2017, 01:57 pm by xbow42
du schreibst garnicht welches OLED und welche OLED-Library du verwendet hast.

Kann die Library den auch eine Textausgabe an einer bestimmen Position?
ich benutze diese ESP8266_Oled_Driver_for_SSD1306_display damit geht z.B.
display.drawString(x, y, "ein Text");

Library u8g2 und die von Adafruit kann sowas auch.
Ich findes es immer besser genau zu wissen, an welcher Stelle man die Ausgabe zur erwarten hat. ;)

vielleicht probierst du mal eine von den libs aus.

wie und wo sind deine Variablen Zeile1-8 deklariert?
Timingproblem scheint es ja nicht zu sein wenn deine HTML-Ausgaben ankommen oder doch!?
wie oft(Intervallzeit) wird denn Scroll(string) in der loop() aufgerufen?

die Glaskugel ist ganzschön trübe...


Optimierungsbedarf?
Arrray für 7 Strings  meineZeilen[7]
Index Variable oder Zeiger aus das Element was in OLED-Zeile1 angezeigt werden soll meineZPos
in der Scroll()
{
   Schleife( kritzel alle 7 Stings vom meineZeilen[meineZPos++] (falls am Array ende angekommen fange vorne im Array wieder an (meineZPos=0)) auf das OLED);
  kritzel "neuer String" in zeile 8 auf OLED;
  überschreibe im Array meineZeilen[] den ältesten Eintag mit "neuer String";
  setze den Index auf den jetzt ältesten Eintag;
  //HTML
  gebe HTML-Kram aus
}





stoni99

Ich nutze die Adafruit 128x64 OLED I2C und deren Lib.
Text an einer bestimmten Position geht auch.

Deklarierung ganz normal im Kopf.

Code: [Select]

String Zeile1 = "...";          //OLED Voreinstellung
String Zeile2 = "...";
String Zeile3 = "...";
String Zeile4 = "Sprengersteuerung";
String Zeile5 = "mit ESP8266 nodeMCU";
String Zeile6 = "und 866MHz Sendemodul";
String Zeile7 = "von Homematic";
String Zeile8 = "...";


Der Scroll-String wird variabel aus dem Programm aufgerufen - immer wenn etwas passiert oder sich ändert. Eben "Protokoll".

Ja, sicher das mit dem Array könnte man verbessern. Hat aber eigentlich nichts mit dem Fehler zu tun!?

Go Up