This is the receiver code, which must be where the error originates. Sender pods both report the correct COUNTER number via serial.
#include <Arduino.h>
#include <esp_now.h>
#include <WiFi.h>
#include <Wire.h>
#include "ESPAsyncWebServer.h"
#include <Arduino_JSON.h>
#include "Adafruit_GFX.h"
#include "Fonts/FreeMono12pt7b.h"
#include "Fonts/FreeMono9pt7b.h"
#include <MCUFRIEND_kbv.h>
#include <NTPClient.h>
#include <WiFiUdp.h>
#define NTP_OFFSET -14400 // In seconds
#define NTP_INTERVAL 60 * 1000 // In miliseconds
#define NTP_ADDRESS "pool.ntp.org"
#define CYAN 0x07FF
#define YELLOW 0xFFE0
#define BLACK 0x0000
#define PINK 0xFC9F
#define AQUA 0x04FF
#define WHITE 0xFFFF
const char *ssid = "TP-Link_7C28";
const char *password = "64411811";
typedef struct struct_message
{
int id;
float temperature;
float humidity;
float pressure;
float Gas;
float CO;
float smoke;
float moisture;
int UV;
float CO2;
float NH3;
float NO2;
float VOC;
float H2;
unsigned int counter;
} struct_message;
struct_message myData;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
MCUFRIEND_kbv tft;
JSONVar board;
AsyncWebServer server(80);
AsyncEventSource events("/events");
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *incomingData, int 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(&myData, incomingData, sizeof(myData));
board["id"] = myData.id;
board["temperature"] = myData.temperature;
board["humidity"] = myData.humidity;
//board["pressure"] = myData.pressure;
board["counter"] = String(myData.counter);
String jsonString = JSON.stringify(board);
events.send(jsonString.c_str(), "new_readings", millis());
Serial.printf("Board ID %u: %u bytes\n", myData.id, len);
Serial.printf("t value: %4.2f \n", myData.temperature);
Serial.printf("h value: %4.2f \n", myData.humidity);
Serial.printf("p value: %4.2f \n", myData.pressure);
Serial.print("ID:"); Serial.print(myData.counter);
Serial.println();
}
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
<title>ESP-NOW DASHBOARD</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<link rel="icon" href="data:,">
<style>
html {font-family: Arial; display: inline-block; text-align: center;}
p { font-size: 1.2rem;}
body { margin: 0;}
.topnav { overflow: hidden; background-color: #2f4468; color: white; font-size: 1.7rem; }
.content { padding: 20px; }
.card { background-color: white; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); }
.cards { max-width: 900px; margin: 0 auto; display: grid; grid-gap: 2rem; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }
.reading { font-size: 2.8rem; }
.packet { color: #bebebe; }
.card.temperature { color: #fd7e14; }
.card.humidity { color: #1b78e2; }
.card.pressure { color: #4682B4; }
</style>
</head>
<body>
<div class="topnav">
<h3>ESP-NOW DASHBOARD</h3>
</div>
<div class="content">
<div class="cards">
<div class="card temperature">
<h4><i class="fas fa-thermometer-half"></i> BOARD #2 - TEMPERATURE</h4><p><span class="reading"><span id="t2"></span> °C</span></p><p class="packet">Reading ID: <span id="rt2"></span></p>
</div>
<div class="card humidity">
<h4><i class="fas fa-tint"></i> BOARD #2 - HUMIDITY</h4><p><span class="reading"><span id="h2"></span> %</span></p><p class="packet">Reading ID: <span id="rh2"></span></p>
</div>
<div class="card pressure">
<h4><i class="fas fa-tint"></i> BOARD #2 - PRESSURE</h4><p><span class="reading"><span id="p2"></span> "Hg</span></p><p class="packet">Reading ID: <span id="rp2"></span></p>
</div>
<div class="card temperature">
<h4><i class="fas fa-thermometer-half"></i> BOARD #1 - TEMPERATURE</h4><p><span class="reading"><span id="t1"></span> °C</span></p><p class="packet">Reading ID: <span id="rt1"></span></p>
</div>
</div>
</div>
<script>
if (!!window.EventSource) {
var source = new EventSource('/events');
source.addEventListener('open', function(e) {
console.log("Events Connected");
}, false);
source.addEventListener('error', function(e) {
if (e.target.readyState != EventSource.OPEN) {
console.log("Events Disconnected");
}
}, false);
source.addEventListener('message', function(e) {
console.log("message", e.data);
}, false);
source.addEventListener('new_readings', function(e) {
console.log("new_readings", e.data);
var obj = JSON.parse(e.data);
document.getElementById("t"+obj.id).innerHTML = obj.temperature.toFixed(1);
document.getElementById("h"+obj.id).innerHTML = obj.humidity.toFixed(0);
document.getElementById("p"+obj.id).innerHTML = obj.pressure.toFixed(0);
document.getElementById("rt"+obj.id).innerHTML = obj.counter;
document.getElementById("rh"+obj.id).innerHTML = obj.counter;
document.getElementById("rp"+obj.id).innerHTML = obj.counter;
}, false);
}
</script>
</body>
</html>)rawliteral";
void setup()
{
Serial.begin(9600);
uint16_t ID = tft.readID();
tft.begin(ID);
WiFi.mode(WIFI_AP_STA);
// Set device as a Wi-Fi Station
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("Setting as a Wi-Fi Station..");
}
Serial.print("Station IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("Wi-Fi Channel: ");
Serial.println(WiFi.channel());
// Init ESP-NOW
if (esp_now_init() != ESP_OK)
{
Serial.println("Error initializing ESP-NOW");
return;
}
// Once ESPNow is successfully Init, we will register for recv CB to
// get recv packer info
esp_now_register_recv_cb(OnDataRecv);
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request)
{ request->send_P(200, "text/html", index_html); });
events.onConnect([](AsyncEventSourceClient *client)
{
if(client->lastId()){
Serial.printf("Client reconnected! Last message ID that it got is: %u\n", client->lastId());
}
// send event with message "hello!", id current millis
// and set reconnect delay to 1 second
client->send("hello!", NULL, millis(), 10000); });
server.addHandler(&events);
server.begin();
}
void loop()
{
float dewpoint = (myData.temperature - (100 - myData.humidity) / 5);
timeClient.update();
String formattedTime = timeClient.getFormattedTime();
tft.setFont(&FreeMono9pt7b);
tft.fillScreen(BLACK);
tft.setTextSize(1);
tft.setTextColor(YELLOW);
tft.setCursor(1, 20);
tft.print("Station IP : ");
tft.println(WiFi.localIP());
tft.setFont(&FreeMono12pt7b);
tft.setTextColor(WHITE);
tft.print("Time: ");
tft.println(formattedTime);
if (myData.id == 1)
{
tft.setTextColor(CYAN);
tft.print("Board ID: ");
tft.println(myData.id);
tft.print("Temperature: ");
tft.print(myData.temperature, 0);
tft.println("*C");
tft.print("Moisture: ");
tft.print(myData.moisture, 0);
tft.println("%");
tft.print("Smoke: ");
tft.println(myData.smoke, 0);
tft.print("Uv index: ");
tft.println(myData.UV, 0);
tft.print("Reading ID: ");
tft.println(myData.counter);
tft.println();
}
else if (myData.id == 2)
{
tft.setTextColor(PINK);
tft.print("Pod ID: ");
tft.println(myData.id);
tft.print("Temperature: ");
tft.print(myData.temperature, 0);
tft.println("*C");
tft.print("Dewpoint: ");
tft.print(dewpoint, 0);
tft.println("*C");
tft.print("Pressure: ");
tft.print(myData.pressure, 0);
tft.println(" in Hg");
tft.print("Humidity: ");
tft.print(myData.humidity, 0);
tft.println("%");
tft.print("LPG: ");
tft.println(myData.Gas, 0);
tft.print("CO: ");
tft.println(myData.CO, 0);
tft.print("CO2: "),
tft.println(myData.CO2, 0);
tft.print("VOC: ");
tft.println(myData.VOC, 0);
tft.print("H2: ");
tft.println(myData.H2, 0);
tft.print("NH3: ");
tft.println(myData.NH3, 0);
tft.print("NO2: "),
tft.println(myData.NO2, 0);
tft.setCursor(1, 385);
tft.print("Reading ID: ");
tft.println(myData.counter);
tft.println();
}
/* else if (myData.id == 3)
{
tft.setTextColor(AQUA);
tft.print("Board ID: ");
tft.println(myData.id);
tft.print("Temperature: ");
tft.print(myData.temperature, 0);
tft.println("*C");
tft.print("Dewpoint: ");
tft.print(dewpoint, 0);
tft.println("*C");
tft.print("Pressure: ");
tft.print(myData.pressure, 0);
tft.println(" in Hg");
tft.print("Humidity: ");
tft.print(myData.humidity, 0);
tft.println("%");
tft.print("Moisture: ");
tft.print(myData.moisture, 0);
tft.println("%");
tft.print("Smoke: ");
tft.println(myData.smoke, 0);
tft.print("Uv index: ");
tft.println(myData.UV, 0);
tft.setCursor(1, 290);
tft.print("LPG: ");
tft.println(myData.Gas, 0);
tft.print("CO: ");
tft.println(myData.CO, 0);
tft.print("CO2: "),
tft.println(myData.CO2, 0);
tft.print("VOC: ");
tft.println(myData.VOC, 0);
tft.setCursor(150, 290);
tft.print("H2: ");
tft.println(myData.H2, 0);
tft.setCursor(150, 315);
tft.print("NH3: ");
tft.println(myData.NH3, 0);
tft.setCursor(150, 340);
tft.print("NO2: "),
tft.println(myData.NO2, 0);
tft.setCursor(1, 385);
tft.print("Reading ID: ");
tft.println(myData.counter);
tft.println();
}*/
Serial.print("Board ID: ");
Serial.println(myData.id);
Serial.print("Temperature: ");
Serial.print(myData.temperature);
Serial.println("*C");
Serial.print("Dewpoint: ");
Serial.print(dewpoint, 0);
Serial.println("*C");
Serial.print("Pressure: ");
Serial.print(myData.pressure);
Serial.println(" in Hg");
Serial.print("Humidity: ");
Serial.print(myData.humidity);
Serial.println("%");
Serial.print("Moisture: ");
Serial.print(myData.moisture);
Serial.println("%");
Serial.print("Smoke: ");
Serial.println(myData.smoke);
Serial.print("Uv index: ");
Serial.println(myData.UV);
Serial.print("LPG: ");
Serial.println(myData.Gas);
Serial.print("CO: ");
Serial.println(myData.CO);
Serial.print("CO2: "),
Serial.println(myData.CO2);
Serial.print("VOC: ");
Serial.println(myData.VOC);
Serial.print("H2: ");
Serial.println(myData.H2);
Serial.print("NH3: ");
Serial.println(myData.NH3);
Serial.print("NO2: "),
Serial.println(myData.NO2);
Serial.print("Reading ID: ");
Serial.println(myData.counter);
Serial.println();
delay(15000);
}