Probelm with ESP_NOW (2 way communication)

Guys I have a problem with my project. In my project there are two ESP 32, which should communicate with each other. The first ESP has a motionsensor which should send a message to the other ESP if an alarm is detected. The problem is that the data isn't send and I don't know why.

Programm one (ESP-with sensor - sending ESP):

#include <Arduino.h>
#include <WiFi.h>
#include <esp_now.h>
#include "esp_wifi.h"

int pinSensor = 35;//Pinbelegung für den Bewegungssensor

uint8_t ownMacAddress[] = {0x32, 0xAE, 0xA4, 0x07, 0x0D, 0x64}; //Mac-Adresse des ESPs der Zentrale
uint8_t macAddress[] = {0x32, 0xAE, 0xA4, 0x07, 0x0D, 0x66}; //Mac-Adresse des ESPs des Sensors

boolean alarmStatus; //Variabel, welche übertragen werden soll
boolean incomingAlarmStatus;//Variabel, welche empfangen wird;

String success; //soll gesendet werden, wenn die Übertragung erfolgreich war

typedef struct struct_message{ //hier wird die Struktur der Nachricht, welche übertragen werden soll, definiert
  boolean alarmStatus;
}struct_message;

struct_message incommingMessage; //Nachricht, welche empfangen wird, muss diese Struktur aufweisen
struct_message sendingMessage; //Nachricht, welche gesendet wird, muss diese Struktur aufweisen
esp_now_peer_info_t peerInfo;

// Callback, wenn die Daten versendet werden -> gibt an, ob die Übertragung erfolgreich war
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("Last Packet Send Status:");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
  if (status ==0){
    success = "Delivery Success :)";
  }
  else{
    success = "Delivery Fail :(";
  }
}

// Callback, wenn Daten empfangen werden
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  memcpy(&incommingMessage, incomingData, sizeof(incommingMessage));
  Serial.print("Bytes received: ");
  Serial.println(len);
  incomingAlarmStatus = incommingMessage.alarmStatus;

}

void setup(){

  Serial.begin(115200);
  pinMode(pinSensor, INPUT);

  WiFi.mode(WIFI_STA); //Gerät als Wifi-Station definieren
  esp_wifi_set_mac(WIFI_IF_STA, ownMacAddress); //Neue Mac-Adresse setzen

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

  //Wenn ESP-Now erfolgreich initialisiert wurde, soll eine Testnachricht verschickt werden. 
  esp_now_register_send_cb(OnDataSent);
  
  // Register peer
  memcpy(peerInfo.peer_addr, macAddress, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;

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

  esp_now_register_recv_cb(OnDataRecv);
}

void loop(){

  long alarmDetection = digitalRead(pinSensor);

  if (alarmDetection == HIGH)
  {
    sendingMessage.alarmStatus = true;  
    esp_err_t result = esp_now_send(macAddress, (uint8_t *) &sendingMessage, sizeof(sendingMessage));
    delay(2000);
    if (result != ESP_OK) {
    Serial.println("Error sending the data-Alarm");
    }else {
    Serial.println("Sent with success-Alarm");
    
  }
  
  }else if(alarmDetection == LOW){
    sendingMessage.alarmStatus = false;
    esp_err_t result = esp_now_send(macAddress, (uint8_t *) &sendingMessage, sizeof(sendingMessage));
    delay(2000);
    if (result == ESP_OK) {
    Serial.println("Data sent with success-No Alarm");
    delay(1000);
    }else {
    Serial.println("Error sending the data-No Alarm");
    delay(1000);

  }
}
}

Second programme (receiver ESP):

#include <Arduino.h>
#include <WiFi.h>
#include <esp_now.h>
#include "esp_wifi.h"

//Pinbelegung für LED und Buzzer -> (Frequenz für Ton und die Resulution Bit)
int pinLed = 14;
int pinBuzzer = 12;
int channel = 0;
int frequenzTone = 600;
int frequenzNoTone = 0;
int resolutionBit = 12;

unsigned long myTime, timeNow1; //Um einen non-blocking code zu realisieren
unsigned long waitTime2 = 250; //Zeit die gewartet werden soll, zwischen den Abfragen 

uint8_t ownMacAddress[] = {0x32, 0xAE, 0xA4, 0x07, 0x0D, 0x66}; //Mac-Adresse des ESPs der Zentrale
uint8_t macAddress[] = {0x32, 0xAE, 0xA4, 0x07, 0x0D, 0x64}; //Mac-Adresse des ESPs des Sensors


boolean alarmStatus; //Variabel, welche übertragen werden soll
boolean incomingAlarmStatus;//Variabel, welche empfangen wird;

String success; //soll gesendet werden, wenn die Übertragung erfolgreich war

typedef struct struct_message{ //hier wird die Struktur der Nachricht, welche übertragen werden soll, definiert
  boolean alarmStatus;
}struct_message;

struct_message incommingAlarmStatus; //Nachricht, welche empfangen wird, muss diese Struktur aufweisen
struct_message sendingMessage; //Nachricht, welche gesendet wird, muss diese Struktur aufweisen
esp_now_peer_info_t peerInfo;

// Callback, wenn die Daten versendet werden -> gibt an, ob die Übertragung erfolgreich war
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  Serial.print("Last Packet Send Status:");
  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
  if (status ==0){
    success = "Delivery Success :)";
  }
  else{
    success = "Delivery Fail :(";
  }
}

// Callback when data is received
void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
  memcpy(&incomingAlarmStatus, incomingData, sizeof(incomingAlarmStatus));
  Serial.print("Bytes received: ");
  Serial.println(len);
}  


void setup() {

  Serial.begin(115200);
  
  pinMode(pinLed, OUTPUT);
  pinMode(pinBuzzer, OUTPUT);
  digitalWrite(pinLed, LOW);
  digitalWrite(pinBuzzer, LOW);
  
  WiFi.mode(WIFI_STA); //Gerät als WIFI-Station definieren
  
  esp_wifi_set_mac(WIFI_IF_STA, ownMacAddress); //Neue Mac-Adresse setzen
  
  


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

  //Wenn ESP-Now erfolgreich initialisiert wurde, soll eine Testnachricht verschickt werden. 
  esp_now_register_send_cb(OnDataSent);
  
  // Register peer
  memcpy(peerInfo.peer_addr, macAddress, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;

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

  esp_now_register_recv_cb(OnDataRecv);

}
  


void loop() {
  
  /*myTime = millis();
  
  if (incomingAlarmStatus == true)
  {
    Serial.println("Alarm detected");
    digitalWrite(pinLed,HIGH);
    ledcWriteTone(channel, frequenzTone);
    delay(5000);
    incomingAlarmStatus = false;
  }else{
    digitalWrite(pinLed,LOW);
    ledcWriteTone(channel, frequenzNoTone);
  }*/


}

I would be very happy if someone could find the problem.
Kind regards leon

And what's the output on sender/receiver side?

Thanks for your quick reply! On the sender site the output is:
Error sending the data
On the receiver site the ouptut is:

ESP-Now initialisiert
Peer added

You should put some more Serial.println() into your code so that you get the exact error code and reason why what when failes.

Ok i will try it. Do you have any advice where i should put it?

I'd start with the basic ESP-NOW demo code. If that works, move to your code and look at the differences.

I will try. Thank you!
But do you have any idea where the problem coule be in my code?

No. It would take too much time debugging it.

Ok no probelm. Thank you very much!

Unfortunately this advice didn't help me

Which aspekt? Did you try the demos, do they work?

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