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