
Zdroj obrázku: randomnerdtutorials.com
Popularita ESP8266 a ESP32 stále stoupá a není divu — díky čipu za pár korun dokážete své zařízení připojit do internetu během několika chvil. Ale co když router nemáte po ruce, nebo potřebujete, aby senzory komunikovaly přímo mezi sebou bez připojení ke střednímu bodu?
Pro takové situace je tu ESP-Now — protokol přímo od Espressif, který umožňuje rychlou a energeticky úspornou komunikaci mezi zařízeními ESP8266 a ESP32 bez Wi-Fi routeru.
Co ESP-Now umí
ESP-Now pracuje na úrovni vrstvy 2 (linková vrstva) — zařízení se naváží přímo podle MAC adres, bez DHCP, bez hesla, bez routeru. Spojení se nastaví jednou a pak už žádný handshake neprobíhá. Výsledek? Několik millisekund od probouzení z deep sleep po odeslání paketu a návrat zpět.
Hlavní vlastnosti:
- Max 250 bytů na zprávu
- Podporuje šifrovanou i nešifrovanou komunikaci
- Jednosměrná i obousměrná komunikace
- Režim peer-to-peer (jeden na jeden) nebo broadcast (jeden na všechny)
- Až 20 šifrovaných peerů, 250 nešifrovaných
- Funguje paralelně s běžným Wi-Fi připojením
Kdy se to hodí? Typicky pro baterijové senzory, které se probudejí z deep sleep, odměří hodnotu, odešlou jí na centrální ESP a jdou zpět spát. HTTP nebo MQTT spojení nad Wi-Fi na tohle není vhodné — trvají až několik sekund a samotné připojení k routeru spotřebuje zbytečně energii.
Jednoduchý příklad: sender a receiver
Potřebujete znát MAC adresu přijímajícího zařízení. Zjistíte ji jednoduchým programem:
#include <WiFi.h>
void setup() {
Serial.begin(115200);
Serial.println(WiFi.macAddress());
}
void loop() {}
Sender — odešle jednoduchou zprávu:
#include <esp_now.h>
#include <WiFi.h>
uint8_t receiverMac[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; // MAC přijímače
typedef struct Message {
float teplota;
float vlhkost;
} Message;
Message data;
void onSent(const uint8_t *mac, esp_now_send_status_t status) {
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "OK" : "FAIL");
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
esp_now_init();
esp_now_register_send_cb(onSent);
esp_now_peer_info_t peer = {};
memcpy(peer.peer_addr, receiverMac, 6);
peer.channel = 0;
peer.encrypt = false;
esp_now_add_peer(&peer);
data.teplota = 23.5;
data.vlhkost = 61.2;
esp_now_send(receiverMac, (uint8_t*)&data, sizeof(data));
}
void loop() {}
Receiver — přijme a vypíše data:
#include <esp_now.h>
#include <WiFi.h>
typedef struct Message {
float teplota;
float vlhkost;
} Message;
void onReceive(const uint8_t *mac, const uint8_t *data, int len) {
Message msg;
memcpy(&msg, data, sizeof(msg));
Serial.printf("Teplota: %.1f, Vlhkost: %.1fn", msg.teplota, msg.vlhkost);
}
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
esp_now_init();
esp_now_register_recv_cb(onReceive);
}
void loop() {}
Struktura zprávy musí být na obou stranách naprosto stejná. Pokud posíláte jiná data než přijímáte, dostanete nesmysly.
Broadcast: jeden odešle, všichni přijmou
Broadcast je jednoduchý — místo konkrétní MAC adresy použijete broadcastovou FF:FF:FF:FF:FF:FF:
uint8_t broadcastMac[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
Broadcast zprávy nejsou šifrovány a nepotvrzují se — sender neví, kdo zprávy přijal. Pro jednosměrný přenos senzorových dat to ale vadí málo.
Tipy a běžné chyby
- Wi-Fi channel musí souhlasit — pokud je sender připojen k routeru a přijímač ne, kanály se mohou lišit. Receiver nastavíte na konkrétní kanál:
WiFi.channel(). - Nezapomeňte na
WiFi.mode(WIFI_STA)předesp_now_init(). Bez toho inicializace selže. - Velikost struktury: max 250 bytů. Pro větší data použijte více zpráv nebo přenášejte index + chunk.
- ESP8266 a ESP32 spolu komunikují, ale API se mírně liší — na ESP8266 používáte
espnow.hz SDK, neesp_now.h.
Kam dál
ESP-Now zvládně i složitější topologie — gateway režim, kde jeden ESP přijímá data ze všech sensorů a přepisuje je dál přes MQTT do Home Assistant nebo na TMEP.cz. To už je materiál na samostatný článek.
S těmito základy máte funkční obousměrnou komunikaci mezi dvěma ESP zařízeními do pěti minut.
Oficiální dokumentace Espressif: https://www.espressif.com/en/products/software/esp-now/overview
Praktický návod (EN): randomnerdtutorials.com/esp-now-esp32-arduino-ide







Žádné sociální komentáře k dispozici.