I have set up an esp32 master and 2 slaves pretty much following the instructions on drone Bot workshop and everything works fine apart from occasional false triggers. One of my slaves will randomly trigger for one-half second, sometimes once every 5 minutes sometimes once every 2 days, there is no pattern. I have attached a copy of the PCB I use and I am wondering if someone might know if I need to add a capacitor to filter out unwanted electrical noise that may be causing this. It is powered by a 5v USB charger, and when triggered it powers a small 5v 600ma motor.
I have only noticed this on one of the slaves but cannot say with 100 percent certainty that it doesn't happen on both.
Thanks for any advice you might have.
// Include Libraries
#include <WiFi.h>
#include <esp_now.h>
// Define LED and pushbutton state booleans
bool buttonDown = false;
bool ledOn = true;
// Define LED and pushbutton pins
#define STATUS_LED D6
#define STATUS_BUTTON D0
void formatMacAddress(const uint8_t *macAddr, char *buffer, int maxLength)
// Formats MAC Address
{
snprintf(buffer, maxLength, "%02x:%02x:%02x:%02x:%02x:%02x", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
}
void receiveCallback(const uint8_t *macAddr, const uint8_t *data, int dataLen)
// Called when data is received
{
// Only allow a maximum of 250 characters in the message + a null terminating byte
char buffer[ESP_NOW_MAX_DATA_LEN + 1];
int msgLen = min(ESP_NOW_MAX_DATA_LEN, dataLen);
strncpy(buffer, (const char *)data, msgLen);
// Make sure we are null terminated
buffer[msgLen] = 0;
// Format the MAC address
char macStr[18];
formatMacAddress(macAddr, macStr, 18);
// Send Debug log message to the serial port
Serial.printf("Received message from: %s - %s\n", macStr, buffer);
// Check switch status
if (strcmp("on", buffer) == 0)
{
ledOn = true;
}
else
{
ledOn = false;
}
digitalWrite(STATUS_LED, ledOn);
}
void sentCallback(const uint8_t *macAddr, esp_now_send_status_t status)
// Called when data is sent
{
char macStr[18];
formatMacAddress(macAddr, macStr, 18);
Serial.print("Last Packet Sent to: ");
Serial.println(macStr);
Serial.print("Last Packet Send Status: ");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void broadcast(const String &message)
// Emulates a broadcast
{
// Broadcast a message to every device in range
uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
esp_now_peer_info_t peerInfo = {};
memcpy(&peerInfo.peer_addr, broadcastAddress, 6);
if (!esp_now_is_peer_exist(broadcastAddress))
{
esp_now_add_peer(&peerInfo);
}
// Send message
esp_err_t result = esp_now_send(broadcastAddress, (const uint8_t *)message.c_str(), message.length());
// Print results to serial monitor
if (result == ESP_OK)
{
Serial.println("Broadcast message success");
}
else if (result == ESP_ERR_ESPNOW_NOT_INIT)
{
Serial.println("ESP-NOW not Init.");
}
else if (result == ESP_ERR_ESPNOW_ARG)
{
Serial.println("Invalid Argument");
}
else if (result == ESP_ERR_ESPNOW_INTERNAL)
{
Serial.println("Internal Error");
}
else if (result == ESP_ERR_ESPNOW_NO_MEM)
{
Serial.println("ESP_ERR_ESPNOW_NO_MEM");
}
else if (result == ESP_ERR_ESPNOW_NOT_FOUND)
{
Serial.println("Peer not found.");
}
else
{
Serial.println("Unknown error");
}
}
void setup()
{
// Set up Serial Monitor
Serial.begin(115200);
delay(20);
// Set ESP32 in STA mode to begin with
WiFi.mode(WIFI_STA);
Serial.println("ESP-NOW Broadcast RX");
// Print MAC address
Serial.print("MAC Address: ");
Serial.println(WiFi.macAddress());
// Disconnect from WiFi
WiFi.disconnect();
// Initialize ESP-NOW
if (esp_now_init() == ESP_OK)
{
Serial.println("ESP-NOW Init Success");
esp_now_register_recv_cb(receiveCallback);
esp_now_register_send_cb(sentCallback);
}
else
{
Serial.println("ESP-NOW Init Failed");
delay(3000);
ESP.restart();
}
// Pushbutton uses built-in pullup resistor
pinMode(STATUS_BUTTON, INPUT_PULLUP);
// LED Output
pinMode(STATUS_LED, OUTPUT);
}
void loop()
{
if (digitalRead(STATUS_BUTTON) == HIGH) // Button is pressed (LOW when using INPUT_PULLUP)
{
// Detect the transition from high to low
if (!buttonDown)
{
buttonDown = true;
// Toggle the LED state
ledOn = !ledOn;
digitalWrite(STATUS_LED, ledOn);
// Send a message to all devices
if (ledOn)
{
broadcast("on");
}
else
{
broadcast("off");
}
}
// Delay to avoid bouncing
delay(100);
}
else
{
// Reset the button state
if (buttonDown)
{
buttonDown = false;
// Toggle the LED state (turn off when button is released)
ledOn = !ledOn;
digitalWrite(STATUS_LED, ledOn);
// Send a message to all devices
if (ledOn)
{
broadcast("on");
}
else
{
broadcast("off");
}
}
// Delay to avoid bouncing
delay(200);
}
}
