ESP32 mit ESP8266 verbinden über ESPnow

Hallo, ich versuche meinen ESP32 und meine ESP8266(3 Stück) über ESPnow zu verbinden. Dazu will ich einen Broadcast nutzen und ich habe mich im Internet dazu informiert.
Nach einiger Zeit hab ich einen Code gefunden der meinen Ideen fast entspricht und ich habe diesen Code umgewandelt das er das erfüllen soll was ich möchte. Da ich aber den Code für den ESP32 umgewandelt habe, musste ich für denn ESP8266 nochmals umschreiben aufgrund von den anderen Libraries. Um die Fehlermeldungen zu beseitigen habe ich einige für mich unbrauchbar aussehende Codezeilen entfernt.
Jetzt kann ich es auf den ESP8266 laden aber ich bekomme keine Daten vom ESP32 auf den ESP8266.
Ich habe einfach keinen plan mehr und sitze da schon seit Wochen dran.
Ich bin nicht vom Fach und ein Anfänger was diese Sache angeht.
Kann mir vielleicht jemand helfen oder hat jemand einen Tipp wie ich es besser machen kann.

Funktion vom Code:

Jedes Board soll eine Zahl haben (1-4).
Am Anfang wird durch den ESP32 eine Zufallszahl(1-4) bestimmt im Loop.
Dann soll die Zahl mit allen Boards geteilt werden.
Dann sollen die Boards die Zahl in eine Variable abspeichern.
Dann wird im Loop abgefragt ob die Zahl die Zahl vom Board ist und ob ein Bestimmter Pin HIGH ist.
Wenn das erfüllt ist soll die nächste Zahl geteilt werden durch das Zufallsprinzip im Loop.

Es geht aber nicht um den Loop sondern ehr um die Versendung über ESPnow zwischen den Geräten.
Habe ich dort Zeilen gelöscht ohne die es nicht funktioniert ?
Gibt es andere Zeilenstücke die ich in den Code des ESP8266 schreiben kann das es funktioniert ?
Danke schonmal im voraus.

Hier der Code :

#include <esp_now.h>
#include <WiFi.h>
#define CHANNEL 1


// Vibrationssensor
#define checkPin 2
uint8_t Zufallszahl;


// Universal MAC Address
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// Aktuelle Zahl über Broadcast
int incomingLED_status;

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message
{
  int but_status;
} struct_message;

// Create a struct_message called myData
struct_message myData;

struct_message incomingReadings;
// Create peer interface
esp_now_peer_info_t peerInfo;

// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
  Serial.print("Bytes received: ");
  Serial.println(len);
  Serial.println(incomingReadings.but_status);

}

void setup() {
  // Init Serial Monitor
  Serial.begin(115200);
  pinMode(checkPin, INPUT);

  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  WiFi.begin();

  // Wait for WiFi connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
  }

  // Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // Send Callback Function
  esp_now_register_send_cb(OnDataSent);

  // Receive Callback Function
  esp_now_register_recv_cb(OnDataRecv);

  // Register peer
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;

  // Add peer
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed to add peer");
    return;
  }
}

void loop()
{
  //if(currentNumber == boardNumber){
  // Überprüfe den Status des Pins 2
  if (digitalRead(checkPin) == HIGH) {
    // Generiere eine neue Zufallszahl
    // Sende die aktualisierte Broadcast-Nachricht
    myData.but_status = Zufallszahl;
    Serial.println(Zufallszahl);

    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

      // Gib die aktuelle Zahl in der seriellen Konsole aus

 
  delay(1000);
  }
 // }

 
   Zufallszahl = 1;
    //if(currentNumber == boardNumber){
  // Überprüfe den Status des Pins 2
  if (digitalRead(checkPin) == HIGH) {
    // Generiere eine neue Zufallszahl
    // Sende die aktualisierte Broadcast-Nachricht
    myData.but_status = Zufallszahl;
    Serial.println(Zufallszahl);

    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

      // Gib die aktuelle Zahl in der seriellen Konsole aus

 
  delay(1000);
  }
 // }
   
   Zufallszahl = 2;
    //if(currentNumber == boardNumber){
  // Überprüfe den Status des Pins 2
  if (digitalRead(checkPin) == HIGH) {
    // Generiere eine neue Zufallszahl
    // Sende die aktualisierte Broadcast-Nachricht
    myData.but_status = Zufallszahl;
    Serial.println(Zufallszahl);

    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

      // Gib die aktuelle Zahl in der seriellen Konsole aus


  delay(1000);
  }
 // }
   
   Zufallszahl = 3;
    //if(currentNumber == boardNumber){
  // Überprüfe den Status des Pins 2
  if (digitalRead(checkPin) == HIGH) {
    // Generiere eine neue Zufallszahl
    // Sende die aktualisierte Broadcast-Nachricht
    myData.but_status = Zufallszahl;
    Serial.println(Zufallszahl);
    
    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

      // Gib die aktuelle Zahl in der seriellen Konsole aus

  delay(1000);
  }
 // }
   
   Zufallszahl = 4;
   
}







#include <espnow.h>
#include <ESP8266WiFi.h>


// Vibrationssensor
#define checkPin 5
uint8_t Zufallszahl;


// Universal MAC Address
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// Aktuelle Zahl über Broadcast
int incomingLED_status;

// Structure example to send data
// Must match the receiver structure
typedef struct struct_message
{
  int but_status;
} struct_message;

// Create a struct_message called myData
struct_message myData;

struct_message incomingReadings;




// callback when data is sent
void OnDataSent( uint8_t *mac_addr, uint8_t status) {
  Serial.print("\r\nLast Packet Send Status:\t");
  Serial.print(".");
}
void OnDataRecv( uint8_t * mac,  uint8_t *incomingData, uint8_t len) {
  memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
  Serial.print("Bytes received: ");
  Serial.println(incomingReadings.but_status);

}

void setup() {
  // Init Serial Monitor
  Serial.begin(9600);
  pinMode(checkPin, INPUT);



  // Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA);
  
  WiFi.begin();

  // Send Callback Function
  esp_now_register_send_cb(OnDataSent);
 
  // Receive Callback Function
  esp_now_register_recv_cb(OnDataRecv);
 
}

void loop()
{
  Zufallszahl = 4;
  Serial.print(".");
esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

delay(1000);

  //if(currentNumber == boardNumber){
  // Überprüfe den Status des Pins 2
  if (digitalRead(checkPin) == HIGH) {
    // Generiere eine neue Zufallszahl
    // Sende die aktualisierte Broadcast-Nachricht
    myData.but_status = Zufallszahl;
    Serial.println(Zufallszahl);

    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

      // Gib die aktuelle Zahl in der seriellen Konsole aus

 
  delay(1000);
  }
 // }

 
   Zufallszahl = 1;
    //if(currentNumber == boardNumber){
  // Überprüfe den Status des Pins 2
  if (digitalRead(checkPin) == HIGH) {
    // Generiere eine neue Zufallszahl
    // Sende die aktualisierte Broadcast-Nachricht
    myData.but_status = Zufallszahl;
    Serial.println(Zufallszahl);

    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

      // Gib die aktuelle Zahl in der seriellen Konsole aus

 
  delay(1000);
  }
 // }
   
   Zufallszahl = 2;
    //if(currentNumber == boardNumber){
  // Überprüfe den Status des Pins 2
  if (digitalRead(checkPin) == HIGH) {
    // Generiere eine neue Zufallszahl
    // Sende die aktualisierte Broadcast-Nachricht
    myData.but_status = Zufallszahl;
    Serial.println(Zufallszahl);

    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

      // Gib die aktuelle Zahl in der seriellen Konsole aus


  delay(1000);
  }
 // }
   
   Zufallszahl = 3;
    //if(currentNumber == boardNumber){
  // Überprüfe den Status des Pins 2
  if (digitalRead(checkPin) == HIGH) {
    // Generiere eine neue Zufallszahl
    // Sende die aktualisierte Broadcast-Nachricht
    myData.but_status = Zufallszahl;
    Serial.println(Zufallszahl);
    
    esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));

      // Gib die aktuelle Zahl in der seriellen Konsole aus

  delay(1000);
  }
 // }
   
   
   
}


Nicht wundern, im Loop sind ein paar Sachen auskommentiert weil ich erstmal nur die empfangenen Sachen über ESPnow im Seriellen Monitor anzeigen lassen wollte.

Ja, du solltest einfach anfangen und einen funktionierende Sketch aus der Library verwenden. Diesen kannst du Stück für Stück mit deinen gewünschten Funktionen erweitern. Wichtig dabei, immer wieder zwischendurch testen.
Dann klappt das auch.

1 Like

Hallo und danke für die Antwort.
Am Anfange hatte ich den funktionierenden Code für den ESP32 nur habe ich Probleme beim übersetzen auf den ESP8266.
Ich weiß nicht was und wie ich manche Zeilen austauschen soll oder was ich raus löschen kann. Den Loop habe ich überprüft und er Funktioniert wie er soll nur halt die ESPNow Befehle (Das senden der Zufallszahlen) funktioniert nicht.
Es kann aber auch sein das beim Empfangen ein Fehler ist oder das etwas mit dem CHANNEL falsch ist.
Wie gesagt bin ich ein Anfänger und habe in dem Bereich keinen Plan aber ich brauche die Funktion halt für ein Projekt.
Den Weg den du beschrieben hast ist in der Regel richtig aber ich denke wenn ich nochmal von neu anfange werde ich bei dem gleichen Ergebniss herauskommen.

Wenn Du jeweils (ESP32 und ESP8266) auf den Beispielen der Lib aufbaust, diese erst mal so, wie sie sind zum Laufen bringst und danach schrittweise mit Änderungen anfängst (immer wieder testen) sollte das nicht passieren.
So etwas passiert in der Regel, wenn man planlos ändert, ohne zu wissen, was man tut.

Gruß Tommy

1 Like

Das wundert mich allerdings, wie Tommy dir auch schon geschrieben hat.
Hier findest du zu deinem Vorhaben weitere Beispiele.

Und hier gibt es das auch in deutsch.

1 Like

Okay, danke für die Antworten. Ich werde es probieren, wie ihr es vorgeschlagen habt.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.