so here is code for sender :
#include <espnow.h>
#include <ESP8266WiFi.h>
#include <Adafruit_AHT10.h>
#include "MS5611.h"
const char* targetSSID = "xxx";
uint8_t broadcastAddress[] = { 0x14, 0x08, 0x08, 0xA4, 0xFB, 0xEC }; //{0xC4, 0x5B, 0xBE, 0xF3, 0x5A, 0x7B};
typedef struct struct_message {
float teplota;
float vlhkost;
float tlak;
} struct_message;
struct_message myData;
Adafruit_AHT10 aht;
MS5611 MS5611(0x77);
void OnDataSent(uint8_t* mac_addr, uint8_t sendStatus) {
Serial.print("Status odosielania: ");
if (sendStatus == 0) {
Serial.println("Uspešne");
} else {
Serial.println("Neuspešne");
}
}
int getWiFiChannel(const char* ssid) {
int n = WiFi.scanNetworks();
for (int i = 0; i < n; ++i) {
if (WiFi.SSID(i) == ssid) {
return WiFi.channel(i);
}
}
return 1; // default channel
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.disconnect();
Serial.println(WiFi.macAddress());
int channel = getWiFiChannel(targetSSID);
Serial.print("Nastavený Wi-Fi kanál: ");
Serial.println(channel);
if (esp_now_init() != 0) {
Serial.println("Chyba inicializacie ESP-NOW");
return;
}
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, channel, NULL, 0);
esp_now_register_send_cb(OnDataSent);
if (!aht.begin()) {
Serial.println("Could not find AHT10? Check wiring");
while (1) delay(10);
}
Serial.println("AHT10 found");
Wire.begin();
if (MS5611.begin() == true) {
Serial.print("MS5611 found: ");
Serial.println(MS5611.getAddress());
} else {
Serial.println("MS5611 not found. halt.");
// while (1);
}
}
void loop() {
sensors_event_t humidity, temp;
aht.getEvent(&humidity, &temp);
MS5611.read();
myData.teplota = temp.temperature;
myData.vlhkost = humidity.relative_humidity;
myData.tlak = MS5611.getPressure();
esp_now_send(broadcastAddress, (uint8_t*)&myData, sizeof(myData));
delay(5000);
}
and here is code for reciever:
#include <esp_now.h>
#include <WiFi.h>
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <time.h>
#include <Wire.h>
#include <DFRobot_SCD4X.h>
#define TFT_DC 5
#define TFT_CS 2
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
DFRobot_SCD4X SCD4X(&Wire, SCD4X_I2C_ADDR);
const char* ssid = "xxx";
const char* password = "xxxx";
IPAddress staticIP(192, 168, 1, 43);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 4, 4);
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 3600;
const int daylightOffset_sec = 3600;
typedef struct struct_message {
float teplota;
float vlhkost;
float tlak;
} struct_message;
struct_message incomingData;
unsigned long lastTimeUpdate = 0;
const long timeUpdateInterval = 1000;
unsigned long lastSCD4XUpdate = 0;
const long scd4xUpdateInterval = 5000;
volatile bool newDataReceived = false;
void drawExternalData();
void drawInternalData(float temp, float humidity, int co2);
void drawCurrentTime();
void readSCD4XData();
void OnDataRecv(const esp_now_recv_info_t *mac_info, const uint8_t *incomingData_raw, int len) {
memcpy(&incomingData, incomingData_raw, sizeof(incomingData));
char macStr[18];
Serial.print("Sprava prisla od: ");
snprintf(macStr, sizeof(macStr), "%02x:%02x:%02x:%02x:%02x:%02x",
mac_info->des_addr[0], mac_info->des_addr[1], mac_info->des_addr[2],
mac_info->des_addr[3], mac_info->des_addr[4], mac_info->des_addr[5]);
Serial.println(macStr);
newDataReceived = true;
}
TaskHandle_t inData;
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_AP_STA);
if (!WiFi.config(staticIP, gateway, subnet, primaryDNS)) {
Serial.println("Nepodarilo sa nastavit staticku IP adresu!");
}
WiFi.begin(ssid, password);
Serial.print("Pripajam sa na WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Pripojené!");
Serial.print("Wi-Fi Channel: ");
Serial.println(WiFi.channel());
if (esp_now_init() != ESP_OK) {
Serial.println("Error pri inicializacii ESP-NOW");
return;
}
esp_now_register_recv_cb(OnDataRecv);
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
while( !SCD4X.begin() ){
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
SCD4X.enablePeriodMeasure(SCD4X_STOP_PERIODIC_MEASURE);
tft.begin();
tft.setRotation(3);
tft.fillScreen(ILI9341_WHITE);
tft.setTextSize(2);
tft.drawRect(15, 30, 130, 120, ILI9341_BLACK);
tft.drawTriangle(5, 30, 155, 30, 80, 0, ILI9341_BLACK);
xTaskCreatePinnedToCore(
inDatacode, /* Task function. */
"inData", /* name of task. */
10000, /* Stack size of task */
NULL, /* parameter of the task */
1, /* priority of the task */
&inData, /* Task handle to keep track of created task */
0); /* pin task to core 0 */
delay(500);
Serial.println("Setup hotovy.");
}
void inDatacode( void * pvParameters ){
Serial.print("Task1 running on core ");
Serial.println(xPortGetCoreID());
for(;;){
if (millis() - lastSCD4XUpdate >= scd4xUpdateInterval) {
lastSCD4XUpdate = millis();
readSCD4XData();
}
}
}
void loop() {
if (newDataReceived) {
drawExternalData();
newDataReceived = false;
}
if (millis() - lastTimeUpdate >= timeUpdateInterval) {
lastTimeUpdate = millis();
drawCurrentTime();
}
}
void readSCD4XData() {
SCD4X.measureSingleShot(SCD4X_MEASURE_SINGLE_SHOT);
while (!SCD4X.getDataReadyStatus()) {
delay(100);
}
DFRobot_SCD4X::sSensorMeasurement_t data;
SCD4X.readMeasurement(&data);
drawInternalData(data.temp, data.humidity, data.CO2ppm);
Serial.println("Precital som vnutorne data.");
}
void drawExternalData() {
tft.fillRect(180, 50, 102, 16, ILI9341_WHITE);
tft.setCursor(180, 50);
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(2);
tft.print(incomingData.teplota);
tft.print(" "); tft.print(char(247)); tft.print("C");
tft.fillRect(180, 80, 102, 16, ILI9341_WHITE);
tft.setCursor(180, 80);
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(2);
tft.print(incomingData.vlhkost);
tft.print(" %");
tft.fillRect(180, 110, 102, 16, ILI9341_WHITE);
tft.setCursor(180, 110);
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(2);
tft.print(incomingData.tlak);
tft.print(" hPa");
}
void drawInternalData(float temp, float humidity, int co2) {
tft.fillRect(40, 50, 80, 16, ILI9341_WHITE);
tft.setCursor(40, 50);
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(2);
tft.print(temp);
tft.print(" "); tft.print(char(247)); tft.print("C");
tft.fillRect(40, 80, 102, 16, ILI9341_WHITE);
tft.setCursor(40, 80);
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(2);
tft.print(humidity);
tft.print(" %");
tft.fillRect(40, 110, 102, 16, ILI9341_WHITE);
tft.setCursor(40, 110);
if (co2 <= 800) {
tft.setTextColor(ILI9341_GREEN);
} else if (co2 > 800 && co2 <= 1200) {
tft.setTextColor(ILI9341_YELLOW);
} else if (co2 > 1200 && co2 <= 1800) {
tft.setTextColor(ILI9341_ORANGE);
} else {
tft.setTextColor(ILI9341_RED);
}
tft.setTextSize(2);
tft.print(co2);
tft.print(" ppm");
}
void drawCurrentTime() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
return;
}
char timeString[9];
strftime(timeString, sizeof(timeString), "%H:%M:%S", &timeinfo);
char dateString[11];
strftime(dateString, sizeof(dateString), "%d.%m.%Y", &timeinfo);
int textWidthTime = strlen(timeString) * 18;
int textWidthDate = strlen(dateString) * 18;
int xPosTime = (tft.width() - textWidthTime) / 2;
int xPosDate = (tft.width() - textWidthDate) / 2;
int yPosTime = 160;
int yPosDate = 190;
tft.fillRect(xPosTime, yPosTime, textWidthTime, 24, ILI9341_WHITE);
tft.setCursor(xPosTime, yPosTime);
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(3);
tft.print(timeString);
Serial.println(timeString);
tft.fillRect(xPosDate, yPosDate, textWidthDate, 24, ILI9341_WHITE);
tft.setCursor(xPosDate, yPosDate);
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(3);
tft.print(dateString);
Serial.println(dateString);
}
so when I delete this:
WiFi.begin(ssid, password);
Serial.print("Pripajam sa na WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Pripojené!");
from reciever setup esp get data from another esp via esp now.