I want to ask about ESP-NOW, i want to use this protocol for my project. My project is about WSN with 3 nodes and 1 receiver. I'm using ESP8266 for this project. The nodes has 3 sensors in it which is a flame sensor, DHT22, and MQ5.
My problem with it is when i turn all of my nodes on, the receiver only updates 1 node data, and the other 2 nodes data is not updating in real-time. My question is how to make the receiver, updates all 3 nodes data in real time. Thank you for the help
Receiver code :
#include <ESP8266WiFi.h>
#include <espnow.h>
#include "CTBot.h"
CTBot myBot;
float incomingTemp;
float incomingHum;
float incomingHic;
float incomingflame;
float incominggas;
// Updates DHT readings every 10 seconds
const long interval = 3000;
unsigned long previousMillis = 0; // will store last time DHT was updated
typedef struct struct_message {
int id;
float temp;
float hum;
float hic;
float gas;
float Flame;
} struct_message;
struct_message incomingReadings;
//structure to hold the readings from board 1 and 2//
struct_message board1;
struct_message board2;
struct_message board3;
//structure array//
struct_message boardsStruct[3] = {board1, board2, board3};
//Define Telegram BOT==============================================
String ssid = "Sardefa23" ; // REPLACE mySSID WITH YOUR WIFI SSID
String pass = "AUDI13mei99"; // REPLACE myPassword YOUR WIFI PASSWORD, IF ANY
String token = "2101223933:AAFBdkD6VnExdWevYeHWZtyEYaSXfE6xcRk" ; // REPLACE myToken WITH YOUR TELEGRAM BOT TOKEN
const int id = 1283765532;
void OnDataRecv(uint8_t * mac_addr, uint8_t *incomingData, uint8_t len) {
char macStr[18];
Serial.print("Packet received from: ");
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
Serial.println(macStr);
memcpy(&incomingReadings, incomingData, sizeof(incomingReadings));
Serial.printf("Board ID %u: %u bytes\n", incomingReadings.id, len);
// Update the structures with the new incoming data
boardsStruct[incomingReadings.id - 1].temp = incomingReadings.temp;
boardsStruct[incomingReadings.id - 1].hum = incomingReadings.hum;
boardsStruct[incomingReadings.id - 1].hic = incomingReadings.hic;
boardsStruct[incomingReadings.id - 1].Flame = incomingReadings.Flame;
boardsStruct[incomingReadings.id - 1].gas = incomingReadings.gas;
Serial.print("Bytes received: ");
Serial.println(" ");
}
void printIncomingReadings() {
// Display Readings in Serial Monitor
Serial.println("Titik 1");
Serial.print("Temperature: ");
Serial.print(boardsStruct[0].temp);
Serial.println(" ºC");
Serial.print("Humidity: ");
Serial.print(boardsStruct[0].hum);
Serial.println(" %");
Serial.print("Heat Index: ");
Serial.print(boardsStruct[0].hic);
Serial.println(" ºC");
Serial.print("Kadar Gas: ");
Serial.print(boardsStruct[0].gas);
Serial.println(" ppm");
Serial.println(boardsStruct[0].Flame);
Serial.println("-----------------------------------------");
Serial.println("Titik 2");
Serial.print("Temperature: ");
Serial.print(boardsStruct[1].temp);
Serial.println(" ºC");
Serial.print("Humidity: ");
Serial.print(boardsStruct[1].hum);
Serial.println(" %");
Serial.print("Heat Index: ");
Serial.print(boardsStruct[1].hic);
Serial.println(" ºC");
Serial.print("Kadar Gas: ");
Serial.print(boardsStruct[1].gas);
Serial.println(" ppm");
Serial.println(boardsStruct[1].Flame);
Serial.println("-----------------------------------------");
Serial.println("Titik 3");
Serial.print("Temperature: ");
Serial.print(boardsStruct[2].temp);
Serial.println(" ºC");
Serial.print("Humidity: ");
Serial.print(boardsStruct[2].hum);
Serial.println(" %");
Serial.print("Heat Index: ");
Serial.print(boardsStruct[2].hic);
Serial.println(" ºC");
Serial.print("Kadar Gas: ");
Serial.print(boardsStruct[2].gas);
Serial.println(" ppm");
Serial.println(boardsStruct[2].Flame);
Serial.println("-----------------------------------------");
}
void setup() {
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Init ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Initialize Serial Monitor
// initialize the Serial
Serial.begin(115200);
Serial.println("Starting TelegramBot...");
// connect the ESP8266 to the desired access point
myBot.wifiConnect(ssid, pass);
// set the telegram bot token
myBot.setTelegramToken(token);
// check if all things are ok
if (myBot.testConnection()) {
Serial.println("\ntestConnection OK");
}
else {
Serial.println("\ntestConnection NOK");
}
// Once ESPNow is successfully Init, we will register for recv CB to
// get recv packer info
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
// Print incoming readings
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time you updated the DHT values
previousMillis = currentMillis;
printIncomingReadings();
TBMessage msg;
String kondisi = "Kondisi Gedung \n";
kondisi += "Kondisi Ruangan 1 \n";
kondisi += "Temperature : ";
kondisi += String(boardsStruct[0].temp);
kondisi += " °C\n";
kondisi += "Humidity : ";
kondisi += String(boardsStruct[0].hum);
kondisi += " %\n";
kondisi += "Heat Index : ";
kondisi += String(boardsStruct[0].hic);
kondisi += " °C\n";
kondisi += "Kadar Gas : ";
kondisi += String(boardsStruct[0].gas);
kondisi += " ppm\n";
kondisi += "Kondisi Ruangan 2 \n";
kondisi += "Temperature : ";
kondisi += String(boardsStruct[1].temp);
kondisi += " °C\n";
kondisi += "Humidity : ";
kondisi += String(boardsStruct[1].hum);
kondisi += " %\n";
kondisi += "Heat Index : ";
kondisi += String(boardsStruct[1].hic);
kondisi += " °C\n";
kondisi += "Kadar Gas : ";
kondisi += String(boardsStruct[1].gas);
kondisi += " ppm\n";
kondisi += "Kondisi Ruangan 3 \n";
kondisi += "Temperature : ";
kondisi += String(boardsStruct[2].temp);
kondisi += " °C\n";
kondisi += "Humidity : ";
kondisi += String(boardsStruct[2].hum);
kondisi += " %\n";
kondisi += "Heat Index : ";
kondisi += String(boardsStruct[2].hic);
kondisi += " °C\n";
kondisi += "Kadar Gas : ";
kondisi += String(boardsStruct[2].gas);
kondisi += " ppm\n";
if (myBot.getNewMessage(msg)) {
if (msg.messageType == CTBotMessageText)
if (msg.text.equalsIgnoreCase("cek kondisi")) {
myBot.sendMessage(id, kondisi, "");
}
}
if (boardsStruct[0].Flame == LOW ) {
myBot.sendMessage(id, "");
String suhu = "Intensitas suhu : ";
suhu += String(incomingflame);
suhu += "Suhu maksimal gaes!\n";
myBot.sendMessage(id, suhu, "");
}
if (boardsStruct[1].Flame == LOW ) {
myBot.sendMessage(id, "");
String suhu = "Intensitas suhu : ";
suhu += String(incomingflame);
suhu += "Suhu maksimal gaes!\n";
myBot.sendMessage(id, suhu, "");
}
if (boardsStruct[2].Flame == LOW ) {
myBot.sendMessage(id, "");
String suhu = "Intensitas suhu : ";
suhu += String(incomingflame);
suhu += "Suhu maksimal gaes!\n";
myBot.sendMessage(id, suhu, "");
}
}
}
Sender (nodes) code :
const int RELAY_PIN = D8;
const int pinApi = D3;
const int pinBuzzer = D0;
int apiState;
#include "DHT.h"
#define DHTPIN D4 //
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
#include <ESP8266WiFi.h>
#include <espnow.h>
float sensor=A0;
float gas_value;
float ppm1;
float ppm;
#define BOARD_ID 2
// REPLACE WITH RECEIVER MAC Address
uint8_t unicastAddress[] = {0xE0, 0x98, 0x06, 0xB6, 0x99, 0x78};
// Updates DHT readings every 10 seconds
const long interval = 3000;
unsigned long previousMillis = 0; // will store last time DHT was updated
// Variable to store if sending data was successful
String success;
//Structure example to send data
//Must match the receiver structure
typedef struct struct_message {
int id;
float temp;
float hum;
float hic;
float gas;
String Flame;
} struct_message;
struct_message node2Readings;
DHT dht(DHTPIN, DHTTYPE);
// Callback when data is sent
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print("Last Packet Send Status: ");
if (sendStatus == 0){
Serial.println("Delivery success");
}
else{
Serial.println("Delivery fail");
}
}
void setup() {
Serial.begin(115200);
pinMode(pinApi, INPUT);
Serial.println(F("DHTxx test!"));
dht.begin();
//koding relay//
pinMode(RELAY_PIN, OUTPUT);
// Set device as a Wi-Fi Station
WiFi.mode(WIFI_AP_STA);
WiFi.disconnect();
// Init ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
// Set ESP-NOW Role
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
// Once ESPNow is successfully Init, we will register for Send CB to
// get the status of Trasnmitted packet
esp_now_register_send_cb(OnDataSent);
//register peer//
esp_now_add_peer(unicastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
//kode mq5
pinMode(sensor,INPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
// save the last time you updated the DHT values
previousMillis = currentMillis;
//sensor flame dan water pump//
apiState = digitalRead(pinApi);
if(apiState == LOW){
digitalWrite(RELAY_PIN, HIGH);
Serial.println("Kebakaran gais!!");
}else{
digitalWrite(RELAY_PIN, LOW);
Serial.println("Aman dan adem gais!!");
}
//sensor mq5//
gas_value=analogRead(sensor);
ppm1 = ((gas_value/4095)*9800 );
float ppm = ppm1 + 200;
Serial.print("Kadar Gas : ");
Serial.print(ppm);
Serial.println(" ppm");
// sensor dht22//
float h = dht.readHumidity();
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println(F("Failed to read from DHT sensor!"));
}
float hic = dht.computeHeatIndex(t, h, false);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.println(F("%"));
Serial.print(F("Temperature: "));
Serial.print(t);
Serial.println(F("°C "));
Serial.print(F("Heat index: "));
Serial.print(hic);
Serial.println(F("°C "));
//Set values to send
node2Readings.id = BOARD_ID;
node2Readings.temp = t;
node2Readings.hum = h;
node2Readings.hic = hic;
node2Readings.Flame = apiState;
node2Readings.gas = ppm;
// Send message via ESP-NOW
esp_now_send(unicastAddress, (uint8_t *) &node2Readings, sizeof(node2Readings));
}
}