ESP-Now which sending information to 2 led on and off with 2 buttons.

mevero
Posts: 2
Joined: Sun Aug 04, 2024 4:58 pm

ESP-Now which sending information to 2 led on and off with 2 buttons.

Postby mevero » Tue Aug 06, 2024 9:23 am

I'm making a system with one green and one red led. it must communicate to thee ESP's The script I rewrite is not working " good " it is with ESP-Now I hope someone good find what is wrong.The code I rewrite:
// Script rewrite with 2 led's and two buttons which is NOT correct !

// Include Libraries
#include <WiFi.h>
#include <esp_now.h>

// Define LED and push button state booleans

bool buttonDown_2 = false;
bool ledOn_2 = false;
bool buttonDown_1 = false;
bool ledOn_1 = false;

// Define LED and pushbutton pins
#define STATUS_LED_1 15
#define STATUS_BUTTON_1 5

#define STATUS_LED_2 14
#define STATUS_BUTTON_2 4


void formatMacAddress(const uint8_t *macAddr, char *buffer, int maxLength)
// Formats MAC Address
{
snprintf(buffer, maxLength, "%0xFF:%0xFF:%0xFF:%0xFF:%0xFF:%0xFF", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]);
}

//void receiveCallback(const uint8_t *macAddr, const uint8_t *data, int dataLen)
void receiveCallback(const esp_now_recv_info_t* esp_now_info, 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);
Serial.printf("Received message %s\n", buffer);

// Check switch status
if (strcmp("on", buffer) == 0)
{
ledOn_1 = true;
}
else
{
ledOn_1 = false;
}
digitalWrite(STATUS_LED_1, ledOn_1);

if (strcmp("on", buffer) == 0)
{
ledOn_2 = true;
}
else
{
ledOn_2 = false;
}
digitalWrite(STATUS_LED_2, ledOn_2);
}


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(1000);

// Set ESP32 in STA mode to begin with
WiFi.mode(WIFI_STA);
Serial.println("ESP-NOW Broadcast Demo");

// 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_1, INPUT_PULLUP);
pinMode(STATUS_BUTTON_2, INPUT_PULLUP);

// LED Output
pinMode(STATUS_LED_1, OUTPUT);
pinMode(STATUS_LED_2, OUTPUT);
}

void loop()
{
if (digitalRead(STATUS_BUTTON_1))
{
// Detect the transition from low to high
if (!buttonDown_1)
{
buttonDown_1 = true;

// Toggle the LED state
ledOn_1 = !ledOn_1;
digitalWrite(STATUS_LED_1, ledOn_1);

if (digitalRead(STATUS_BUTTON_2))

// Detect the transition from low to high
if (!buttonDown_2)

buttonDown_2 = true;

// Toggle the LED state
ledOn_2 = !ledOn_2;
digitalWrite(STATUS_LED_2, ledOn_2);


// Send a message to all devices
if (ledOn_1)
{
broadcast("on");
}
else
{
broadcast("off");

// Send a message to all devices
if (ledOn_2)
{
broadcast("on");
}
else
{
broadcast("off");
}

}
}

// Delay to avoid bouncing
delay(500);
}
else
{
// Reset the button state
buttonDown_1 = false;
buttonDown_2 = false;
}
}
I'm living in the Netherlands, and try to make a project with ESP-NOW. It is with a green and re led and two buttons. I rewrite a script but it is not working well. The system is with 3 ESP's and the all communicate with each other.

mevero
Posts: 2
Joined: Sun Aug 04, 2024 4:58 pm

Re: ESP-Now which sending information to 2 led on and off with 2 buttons.

Postby mevero » Thu Oct 17, 2024 12:32 pm

This line in the program is the "problem" if (strcmp("on", buffer) == 0) It can only look to one GPO port. That is why both led's are going on ! I found out that there are other arguments for strncmp
maybe someone know which must be the right line ( the right argument ) : int strncmp(const char *s1, const char *s2, size_t n);
A lot off viewers has red the program thanks for that !! Gr. Wim
I'm living in the Netherlands, and try to make a project with ESP-NOW. It is with a green and re led and two buttons. I rewrite a script but it is not working well. The system is with 3 ESP's and the all communicate with each other.

ESP_Sprite
Posts: 9668
Joined: Thu Nov 26, 2015 4:08 am

Re: ESP-Now which sending information to 2 led on and off with 2 buttons.

Postby ESP_Sprite » Sat Oct 19, 2024 12:37 am

Thing is, you're sending 'on' when you want led1 to turn on, and 'on' as well if you want led2 to turn on. You'd need to send two different messages if you want to distinguish the two LEDs from eachother! The strcmp is OK here, strncmp would be used if you only want to compare the first n bytes to be compared, e.g. (strcmp("apekooien","apennootjes",3)==0) is true.

(Also, for next time, 'The script I rewrite is not working " good "' is just about the worst symptom description you can give. If you want to increase the likelihood of people wanting to help you, it's better to specifically describe what you want the script to do, what it does now, plus anything you already tried to make it work. If you simply say 'it's not working', you leave us to figure out what the code should do and what it likely does now, and that's an extra step making a whole lot of people decide to not look at your issue in-depth.)

Who is online

Users browsing this forum: No registered users and 5 guests