Unsigned int = 65,535 max, but display says 1615343620

My ESP Now receiver does exactly one weird thing.
Pod 1 and Pod 2 have the same code for ‘counter.’ It’s:
“unsigned int counter = 0;” Then counter = counter + 1;.

Pod 1 displays the correct number. It’s at

Pod 2 is bonkers. RIght now it’s 1615343620, which is too big for unsigned int.
It was ‘0’, and it was maybe correct once, at 437. But I have two other huge numbers in my notes, and that’s where it stays. I guess it will be a different number when I reboot.

Receiver code doesn’t have anything in it about ‘counter’, except to receive it in the struct and display it. AND THE OTHER POD’s COUNTER IS CORRECT?!??!?!!!?
I’ll post the receiver code and a sensor pod code below.
(Having some trouble with the HTML…)

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> &deg;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> &percnt;</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> &deg;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);
}

This is the sender code for Pod 2:

#include <Arduino.h>

#include <esp_now.h>

#include <esp_wifi.h>

#include <WiFi.h>

#include <Adafruit_Sensor.h>

#include "Adafruit_BME680.h"

#include "Adafruit_SGP30.h"

#define BOARD_ID 2

#define SEALEVELPRESSURE_HPA (1026.25)

uint8_t broadcastAddress[] = {0x8C, 0xaa, 0xb5, 0x86, 0x1C, 0x94};

Adafruit_BME680 bme; // I2C

Adafruit_SGP30 sgp;

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;

unsigned int counter = 0;

constexpr char WIFI_SSID[] = "TP-Link_7C28";

int32_t getWiFiChannel(const char *ssid)

{

  if (int32_t n = WiFi.scanNetworks())

  {

    for (uint8_t i = 0; i < n; i++)

    {

      if (!strcmp(ssid, WiFi.SSID(i).c_str()))

      {

        return WiFi.channel(i);

      }

    }

  }

  return 0;

}

// callback when data is sent

void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status)

{

  Serial.print("\r\nLast Packet Send Status:\t");

  Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");

}

void setup()

{

  Serial.begin(9600);

  Serial.println(F("BME680 test"));

  if (!bme.begin())

  {

   Serial.println("BME680 sensor test failed.");

   while (1)

     ;

  }

  if (!sgp.begin())

  {

    Serial.println("SGP30 sensor not found :(");

    while (1)

      ;

  }

  bme.setTemperatureOversampling(BME680_OS_8X);

  bme.setHumidityOversampling(BME680_OS_2X);

  bme.setPressureOversampling(BME680_OS_4X);

  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);

  bme.setGasHeater(320, 150); // 320*C for 150 ms

  // Set device as a Wi-Fi Station and set channel

  WiFi.mode(WIFI_STA);

  int32_t channel = getWiFiChannel(WIFI_SSID);

  WiFi.printDiag(Serial); // Uncomment to verify channel number before

  esp_wifi_set_promiscuous(true);

  esp_wifi_set_channel(channel, WIFI_SECOND_CHAN_NONE);

  esp_wifi_set_promiscuous(false);

  WiFi.printDiag(Serial); // Uncomment to verify channel change after

  // 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 Send CB to

  // get the status of Trasnmitted packet

  esp_now_register_send_cb(OnDataSent);

  // Register peer

  esp_now_peer_info_t peerInfo;

  memset(&peerInfo, 0, sizeof(peerInfo));

  memcpy(peerInfo.peer_addr, broadcastAddress, 6);

  peerInfo.encrypt = false;

  // Add peer

  if (esp_now_add_peer(&peerInfo) != ESP_OK)

  {

    Serial.println("Failed to add peer");

    return;

  }

}

void loop()

{

  counter = counter + 1;

  unsigned long endTime = bme.beginReading();

  if (endTime == 0)

  {

    Serial.println(F("BME680 measurement failed :("));

    return;

  }

  if (!bme.endReading())

  {

    Serial.println(F("BME680 failed to complete reading :("));

    return;

  }

  if (!sgp.IAQmeasureRaw())

  {

    Serial.println("SGP30 Measurement failed");

    return;

  }

  float pressure = (bme.pressure / 3377);

  float VOC = (bme.gas_resistance / 1000);

  float LPG = analogRead(36) / 4095;

  float CO = analogRead(34) / 4095;

  float NH3 = analogRead(38) / 4095;

  float NO2 = analogRead(39) / 4095;

  Serial.print("BOARD_ID: ");

  Serial.println(BOARD_ID);

  Serial.print("Temp: ");

  Serial.print(bme.temperature, 0);

  Serial.println(" C");

  Serial.print("Humidity: ");

  Serial.print(bme.humidity, 0);

  Serial.println(" %");

  Serial.print("Pressure: ");

  Serial.print(pressure, 0);

  Serial.println(" in Hg");

  Serial.print("VOC: ");

  Serial.println(1/VOC, 0);

  Serial.print("LPG: ");

  Serial.print(LPG, 0);

  Serial.println(" PPM");

  Serial.print("CO: ");

  Serial.print(CO, 0);

  Serial.println(" PPM");

  Serial.print("NH3: ");

  Serial.print(NH3, 0);

  Serial.println(" PPB");

  Serial.print("NO2: ");

  Serial.print(NO2, 0);

  Serial.println(" PPB");

  Serial.print("counter: ");

  Serial.print(counter);

  Serial.println();

  // Set values to send  Serial

  myData.id = BOARD_ID;

  myData.temperature = bme.temperature;

  myData.humidity = bme.humidity;

  myData.pressure = pressure;

  myData.VOC = VOC;

  myData.CO2 = sgp.eCO2;

  myData.H2 = sgp.rawH2;

  myData.Gas = LPG;

  myData.CO = CO;

  myData.NH3 = NH3;

  myData.NO2 = NO2;

  myData.counter = counter;

  // Send message via ESP-NOW

  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&myData, sizeof(myData));

  if (result == ESP_OK)

  {

    Serial.println("Sent with success");

  }

  else

  {

    Serial.println("Error sending the data");

  }

}

I finally articulated my question well enough, and the stinking thing fixed itself.

1 Like

I really wanted to learn something. It’s been a problem for months. Tried everything.