0.ライブラリ
1.はじめに
自社基板のFWに ESPNow の実装をするたびに
「これ長いなぁ」と毎回感じており
特に100個のクローンを製作する場合にIPアドレスの設定等ちょっと面倒な事になります
そこで 自前で MYID を設定し基本ブロードキャスト送信
受信するときに MYID で振り分けが出来るような
仕組みを実装し Arduino Library として登録しました
2.仕組み
_slave.peer_addr[i] = (uint8_t)0xff;
上記の設定により ブロードキャスト送信
tinyESPNow::begin
uint16_t tinyESPNow::begin(uint8_t myId, uint32_t arySize) {
__arySize = arySize;
__transAry = new uint8_t[__arySize];
WiFi.mode(WIFI_STA);
WiFi.disconnect();
if (esp_now_init() == ESP_OK) {
Serial.print("ESPNow Init Success\n");
} else {
Serial.print("ESPNow Init Failed\n");
ESP.restart();
}
memset(&_slave, 0x0, sizeof(_slave));
for (int i = 0; i < sizeof(_slave.peer_addr); ++i) {
_slave.peer_addr[i] = (uint8_t)0xff;
}
esp_err_t addStatus = esp_now_add_peer(&_slave);
esp_now_register_send_cb(&OnDataSent);
esp_now_register_recv_cb(&OnDataRecv);
__myId = myId;
return 0;
}
受信したときに呼ばれるコールバック関数
if (recv[0] == __myId) {
}
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *recv, int recvCnt) {
if (recv[0] == __myId) {
memcpy(__transAry, recv, recvCnt);
__recved = true;
}
}
3.使い方
tEN.get で バッファのポインタを持ってきて
tEN.put で バッファ更新して
tEN.sendで バッファを送信します
ESPNow はサーバ/クライアントの概念がありまてんので
これを2個の ESP32系基板に入れ
最初に立ち上げた方が受信 後に立ち上げた方が送信となり
未来永劫送受信できます
#include "tinyESPNow.h"
static tinyESPNow tEN;
#define BUFSIZE (64) // The size of the buffer
#define MYID (0xFF)
void dataUpdate() {
uint8_t *buf = tEN.get(); // Get a pointer to the buffer
buf[0] = 0xFF;
Serial.printf("%02X=>", buf[1]);
buf[1] = (buf[1] + 1) % 256; // Add One to the received data
Serial.printf("%02X\n", buf[1]);
tEN.put(buf, 2); // Update the buffer
tEN.send(); // Send the buffer
}
void setup() {
Serial.begin( 115200 ); while (!Serial);
tEN.begin(MYID, BUFSIZE);
dataUpdate();
}
void loop() {
if (tEN.isRecv()) { // Did the data arrive?
dataUpdate();
}
tEN.update(); // Update class
delay(20);
}
4. 6STEP とは?
- バッファのポインタを持ってくる
- 更新する
- 書き込む
- 送る
- 受信があれば何かする
この6STEPになります
5. 最後に
コードがすっきりちました