Ich beschäftige mich gerade mit ESP-NOW in Verbindung mit zwei ESP32 mit OLED - mein neues Spielzeug
.
ESP-NOW funktioniert wie erwartet (=gut), allerdings ist mir ein "interessantes" Pänomen aufgefallen:
Wenn das Update des OLED in der Callback-Function für die ESP-NOW-Nachricht aufgerufen wird, kommt es zu eigenartigen Störungen auf dem OLED (zu sehen ist die Zahl 18):


Hier der Sketch (eigentlich nur ein einfacher Beispiel-Sketch):
// Hier gibt es Störungen
#include <esp_now.h>
#include <WiFi.h>
//OLED:
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, 16, 15, 4); // resetPin, sclPin, sdaPin
// Structure example to receive data. Must match the sender structure.
typedef struct struct_message {
char a[32];
int b;
float c;
String d;
bool e;
} struct_message;
struct_message myData;
bool newData = false;
// callback function that will be executed when data is received
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("Int: ");
Serial.println(myData.b);
newData = true;
ausgabeOled(); // <<<------ hier gibt es "Störungen" am OLED
}
void ausgabeOled() {
u8g2.clearBuffer();
char myBuffer[5];
sprintf(myBuffer, "%2d", myData.b); // 2stellig
u8g2.drawStr(10, 10, myBuffer );
u8g2.sendBuffer();
newData = false;
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA); // Set device as a Wi-Fi Station
if (esp_now_init() != ESP_OK) { // Init ESP-NOW
Serial.println("Error initializing ESP-NOW");
}
esp_now_register_recv_cb(OnDataRecv); // Register for recv CB to get recv packet info
// OLED:
u8g2.begin();
u8g2.setFont(u8g2_font_fub49_tn);
u8g2.setFontRefHeightExtendedText();
u8g2.setDrawColor(1);
u8g2.setFontPosTop();
u8g2.setFontDirection(0);
}
void loop() {
if (newData) {
// ausgabeOled(); // <<<------ hier gibt es keine Störungen am OLED
}
}
Wenn ich hingegen das OLED-Update in Loop aufrufe gibt es diese Störungen nicht und die Darstellung am OLED ist sauber:

Hier der Sketch. Er unterscheidet sich von dem oben nur nur durch die beiden mit <<<------ gekennzeichneten Zeilen, die mal auskommentiert sind und mal nicht:
// Hier gibt es keine Störungen
#include <esp_now.h>
#include <WiFi.h>
//OLED:
#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, 16, 15, 4); // resetPin, sclPin, sdaPin
// Structure example to receive data. Must match the sender structure.
typedef struct struct_message {
char a[32];
int b;
float c;
String d;
bool e;
} struct_message;
struct_message myData;
bool newData = false;
// callback function that will be executed when data is received
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Bytes received: ");
Serial.println(len);
Serial.print("Int: ");
Serial.println(myData.b);
newData = true;
// ausgabeOled(); // <<<------ hier gibt es "Störungen" am OLED
}
void ausgabeOled() {
u8g2.clearBuffer();
char myBuffer[5];
sprintf(myBuffer, "%2d", myData.b); // 2stellig
u8g2.drawStr(10, 10, myBuffer );
u8g2.sendBuffer();
newData = false;
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA); // Set device as a Wi-Fi Station
if (esp_now_init() != ESP_OK) { // Init ESP-NOW
Serial.println("Error initializing ESP-NOW");
}
esp_now_register_recv_cb(OnDataRecv); // Register for recv CB to get recv packet info
// OLED:
u8g2.begin();
u8g2.setFont(u8g2_font_fub49_tn);
u8g2.setFontRefHeightExtendedText();
u8g2.setDrawColor(1);
u8g2.setFontPosTop();
u8g2.setFontDirection(0);
}
void loop() {
if (newData) {
ausgabeOled(); // <<<------ hier gibt es keine Störungen am OLED
}
}
Diese Störungen sind nicht wirklich ein großes Problem, weil ich ja eine Lösung gefunden habe, aber interessieren würde mich schon, wieso es zu diesen Störungen kommt.
Hat jemand eine Idee?
Edit:
Bei dem ESP32-Board handelt es sich übrigens um ein "Heltec WiFi Kit 32", hier ein paar Links:
https://github.com/HelTecAutomation/HeltecDocs/tree/master/en/source/esp32%2Barduino
https://heltec-automation-docs.readthedocs.io/en/latest/esp32+arduino/index.html
Ich glaube aber eher weniger, dass das Phänomen speziell mit diesem Board zu tun hat.
Ich habe es auch mit einem anderen ESP-32 Board mit OLED ausprobiert (WEMOS LOLIN32) - da hängt das Display aber an anderen Pins - mit dem selben Resultat.


