Code: Select all
#include <supla/sensor/DS18B20.h>
// ESP-NOW
#include <ESP8266WiFi.h>
extern "C" {
#include <espnow.h>
}
#define CFG_BUTTON_GPIO 0
#define STATUS_LED_GPIO 2
#define LED_RED_GPIO 13
#define LED_BLUE_GPIO 12
#define OUTPUT_GPIO 14
#define INPUT_GPIO 12 //GPIO do sprawdzania stanu
#define DS18B20_GPIO 4
const char* ssid = "xxxxxxxx";
const char* password = "0123456789";
uint8_t broadcastAddress[] = {0xC8, 0xC9, 0xA3, 0x3A, 0xEA, 0xB3}; // Adres MAC drugiego Wemosa
// Struktura danych do wysyłania
typedef struct struct_message
{
bool relayState; // Przechowuje stan GPIO14
} struct_message;
struct_message relayData;
void OnDataSent(uint8_t *mac_addr, uint8_t sendStatus) {
Serial.print("Wysyłanie ESP-NOW: ");
Serial.println(sendStatus == 0 ? "Sukces" : "Błąd");
}
Supla::ESPWifi wifi;
Supla::Eeprom eeprom;
Supla::LittleFsConfig configSupla;
Supla::Device::StatusLed statusLed(STATUS_LED_GPIO, true);
Supla::EspWebServer suplaServer;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nPołączono z WiFi!");
// Pobierz aktualny kanał WiFi
int wifiChannel = WiFi.channel();
Serial.print("Kanał WiFi: ");
Serial.println(wifiChannel);
// Ustawienie ESP-NOW na ten sam kanał
//esp_wifi_set_channel(wifiChannel, WIFI_SECOND_CHAN_NONE);
// Supla
new Supla::Clock;
new Supla::Html::DeviceInfo(&SuplaDevice);
new Supla::Html::WifiParameters;
new Supla::Html::ProtocolParameters;
new Supla::Html::StatusLedParameters;
new Supla::Html::TimeParameters(&SuplaDevice);
new Supla::Device::StatusLed(STATUS_LED_GPIO, true);
eeprom.setStateSavePeriod(5000);
auto output = new Supla::Control::InternalPinOutput(OUTPUT_GPIO);
auto redStatusLed = new Supla::Control::InternalPinOutput(LED_RED_GPIO, false);
auto blueStatusLed = new Supla::Control::InternalPinOutput(LED_BLUE_GPIO, false);
auto hvac = new Supla::Control::HvacBase(output);
new Supla::Html::HvacParameters(hvac);
DeviceAddress ds1addr = {0x28, 0x97, 0xD7, 0x06, 0x0A, 0x00, 0x00, 0x46};
DeviceAddress ds2addr = {0x28, 0xFF, 0x54, 0x73, 0x6E, 0x18, 0x01, 0x77};
new Supla::Sensor::DS18B20(DS18B20_GPIO, ds1addr);
new Supla::Sensor::DS18B20(DS18B20_GPIO, ds2addr);
hvac->setMainThermometerChannelNo(1);
hvac->setAuxThermometerChannelNo(2);
hvac->setTemperatureHisteresisMin(20);
hvac->setTemperatureHisteresisMax(1000);
hvac->setTemperatureAuxMin(500);
hvac->setTemperatureAuxMax(7500);
hvac->setTemperatureHisteresis(40);
auto cfgButton = new Supla::Control::Button(CFG_BUTTON_GPIO, true, true);
cfgButton->configureAsConfigButton(&SuplaDevice);
SuplaDevice.setSuplaCACert(suplaCACert);
SuplaDevice.setSupla3rdPartyCACert(supla3rdCACert);
SuplaDevice.setName("Termostat ESP");
SuplaDevice.begin(21);
// ESP-NOW
// Ustawienie ESP-NOW na ten sam kanał
//esp_wifi_set_channel(wifiChannel);
WiFi.mode(WIFI_STA);
if (esp_now_init() != 0) {
Serial.println("Błąd inicjalizacji ESP-NOW");
return;
}
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
esp_now_register_send_cb(OnDataSent);
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, 1, NULL, 0);
pinMode(OUTPUT_GPIO, OUTPUT); //INPUT_GPIO,INPUT
}
void loop() {
SuplaDevice.iterate();
relayData.relayState = digitalRead(OUTPUT_GPIO);
esp_now_send(broadcastAddress, (uint8_t *) &relayData, sizeof(relayData));
Serial.print("Wysłano stan GPIO14: ");
Serial.println(relayData.relayState ? "HIGH" : "LOW");
delay(1000);
}a tu kod do drugiego wemosa
Code: Select all
#include <ESP8266WiFi.h>
extern "C" {
#include <espnow.h>
}
// Definicja pinów
#define LED_BUILTIN_GPIO 2 // Wbudowana dioda LED
#define RELAY_GPIO 5 //przekaźnik
// Struktura danych do odbierania
typedef struct struct_message {
bool relayState;
} struct_message;
struct_message relayData;
unsigned long lastReceiveTime = 0; // Czas ostatniego odbioru danych
const unsigned long timeout = 10000; // Czas (ms) do automatycznego wyłączenia LED
// Callback – wywoływana, gdy dane zostaną odebrane
void OnDataRecv(uint8_t *mac, uint8_t *incomingData, uint8_t len) {
memcpy(&relayData, incomingData, sizeof(relayData));
Serial.print("Odebrano stan: ");
Serial.println(relayData.relayState ? "HIGH" : "LOW");
// Włącz lub wyłącz diodę LED wbudowaną w Wemos D1 Mini
digitalWrite(LED_BUILTIN_GPIO, relayData.relayState ? LOW : HIGH);
digitalWrite(RELAY_GPIO, relayData.relayState ? HIGH : LOW);
// Aktualizacja czasu ostatniego odbioru
lastReceiveTime = millis();
}
void setup() {
Serial.begin(115200);
// Ustawienie pinu diody LED jako OUTPUT
pinMode(LED_BUILTIN_GPIO, OUTPUT);
pinMode(RELAY_GPIO, OUTPUT);
digitalWrite(LED_BUILTIN_GPIO, HIGH); // Wyłączona domyślnie
digitalWrite(RELAY_GPIO, LOW); // Przekaźnik domyślnie wyłączony
// Ustawienie trybu Wi-Fi na station mode
WiFi.mode(WIFI_STA);
// Inicjalizacja ESP-NOW
if (esp_now_init() != 0) {
Serial.println("Błąd inicjalizacji ESP-NOW!");
return;
}
// Rejestracja callbacka do odbioru danych
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
esp_now_register_recv_cb(OnDataRecv);
Serial.println("Oczekiwanie na dane ESP-NOW...");
}
void loop() {
// W tej wersji loop() jest puste, bo ESP-NOW działa w tle
// Sprawdź, czy minęło 10 sekund od ostatniego odebrania danych
if (millis() - lastReceiveTime > timeout) {
digitalWrite(LED_BUILTIN_GPIO, HIGH); // Wyłącz diodę LED
digitalWrite(RELAY_GPIO, LOW); // Wyłącz przekaźnik
}
}
