esp-nowの基本コードをメモしておく。ESP32用。8266は若干コード変更が必要。
レイテンシは大体4ms、早ければ1、2ms? 測定プログラムが怪しいので基本4msぐらいか。十分な速度と思うが。
いろんなサイトを参考にしたのでもはや出典元がわからんがどこかのコードがベースになってます。全てのインターネッツに感謝。
//sender
#include <esp_now.h>
#include <WiFi.h>
//受信側のMACアドレスを設定
uint8_t broadcastAddress[] = {0x, 0x, 0x, 0x, 0x, 0x};
esp_now_peer_info_t peerInfo;
uint8_t MY_DATA[2];
char buf[2];
int tmp = 0;
void setup() {
delay(500);
Serial.begin(9600);
Serial.println("Serial.begin");
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
Serial.println("esp_now_init");
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add peer");
return;
}
esp_now_register_send_cb(OnDataSent);
Serial.println("esp_now_register_send_cb");
}
void loop() {
tmp = (tmp == 0) ? 1 : 0;
sprintf(buf, "%d", tmp);
memcpy(MY_DATA, buf, strlen(buf));
esp_err_t result = esp_now_send(broadcastAddress, MY_DATA, sizeof(buf));
if (result == ESP_OK) {
Serial.println("success");
}
else {
Serial.println("Error");
}
delay(100);
}
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Deli_Success" : "Deli_Fail");
}
//rcv
#include <esp_now.h>
#include <WiFi.h>
char buf[2];
int delay_cnt = 0;
int v = 0;
void setup() {
delay(500);
Serial.begin(9600);
Serial.println("Serial.begin");
WiFi.mode(WIFI_STA);
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
Serial.println("esp_now_init");
esp_now_register_recv_cb(OnDataRecv);
Serial.println("esp_now_register_recv_cb");
}
void loop() {
delay(1);
delay_cnt++;
}
void OnDataRecv(const uint8_t *mac, const uint8_t *recvData, int len) {
memcpy(&buf[0], recvData, len);
buf[len] = '\0';
sscanf(buf, "%d", &v);
Serial.print(delay_cnt);
Serial.print(",");
Serial.println(v);
delay_cnt = 0;
}