ESP-Now: Difference between revisions
Nieuwe esp-now bridge |
(No difference)
|
Latest revision as of 13:27, 3 December 2022
In the beginning, revspace was strung together using a mix of genuine and cloned nRF42 modules. This has made a lot of people very angry and been widely regarded as a bad move.
| Project ESP-Now | |
|---|---|
| ESP-Now netwerk op de space | |
| Status | Completed |
| Contact | Kartoffel,bertrik |
| Last Update | 2022-12-03 |
Tegenwoordig zijn de meeste sensors en frutsels zelf via WiFi direct met MQTT verbonden. Het is in sommige gevallen fijn om een simpeler, meer low-power radioprotocol te hebben waarmee we berichtjes naar MQTT kunnen slingeren.
Dit is per december 2022 vervangen door een simpeler broadcast esp-now systeem op kanaal 9. Hiermee is geen pairing via het revspace-espnow SSID meer nodig.
Werking
Aan de ledspace Raspberry Pi hangt een ESP32 die alle espnow broadcasts op WiFi kanaal 9 opvangt. Als de berichten met #R of #U beginnen worden ze naar de seriële poort doorgestuurd en door pyserial-mqtt op MQTT gepubliceerd.
De verzendende ESP8266 en ESP32's sturen een esp-now bericht naar het broadcast adres (0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF) op kanaal 9, met data:
#Rtopic payloadvoor een retained MQTT topic#Utopic payloadvoor een unretained MQTT topic
That's it!
Projecten
- Skipknop
- Nomzknop keuken
Voorbeeldcode
Dit zou portable moeten zijn voor zowel ESP8266 als ESP32 modules binnen de Arduino omgeving. De esp8266 heeft wat extra trickery nodig om daadwerkelijk op kanaal 9 uit te zenden.
#include "Arduino.h"
#if defined(ESP8266)
#include <espnow.h>
#include "ESP8266WiFi.h"
#else
#include <esp_now.h>
#include <esp_wifi.h>
#include <WiFi.h>
#endif
// Custom protocol for MQTT over ESP-NOW
// Always start with #, then R for retained or U for unretained
#define MQTT_TOPIC "#Urevspace/button/test"
#define MQTT_MSG "hallo"
#define ESP_NOW_CHANNEL 9
#if defined(ESP32)
esp_now_peer_info_t peerInfo;
#endif
uint8_t broadcastAddress[] = {0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF};
void setup(void) {
// Welcome
Serial.begin(115200);
Serial.printf("\nStart\n");
#if defined(ESP32)
WiFi.mode(WIFI_STA);
ESP_ERROR_CHECK(esp_wifi_start());
ESP_ERROR_CHECK(esp_wifi_set_promiscuous(true));
if (esp_wifi_set_channel(ESP_NOW_CHANNEL, WIFI_SECOND_CHAN_NONE) != ESP_OK) {
Serial.println("Failed to set WiFi channel!");
return;
}
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
// register peer
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = ESP_NOW_CHANNEL;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}
#else
WiFi.forceSleepWake();
WiFi.persistent(false);
WiFi.mode(WIFI_STA);
WiFi.begin("aapnoot", "miesmies", ESP_NOW_CHANNEL, NULL, false);
WiFi.disconnect();
wifi_set_channel(ESP_NOW_CHANNEL);
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
}
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
esp_now_add_peer(broadcastAddress, ESP_NOW_ROLE_SLAVE, ESP_NOW_CHANNEL, NULL, 0);
#endif
}
bool send_topic_text(const char *topic, const char *text) {
uint8_t *mac = broadcastAddress;
char buf[250];
int n = snprintf(buf, sizeof(buf), "%s %s", topic, text);
return esp_now_send(mac, (uint8_t *)buf, n) == 0;
}
void loop(void) {
send_topic_text(MQTT_TOPIC, MQTT_MSG);
delay(10);
// Sleep forever
#if defined(ESP32)
esp_deep_sleep_start();
#else
ESP.deepSleep(0);
#endif
}