ESP-NOWを使ったESP32マイコン同士のデータ通信について、本記事では受信の方法を記す。
こちらも必要最低限(と思われる)部分のみ記載する。先に送信についての記事を書いたので、こちらの記事については内容は薄めで行く。送信編の記事はこちら。
1,必要なライブラリのインクルード
#include <WiFi.h> #include <esp_now.h>
ここは送信用のコードと同様に、必要なライブラリであるWiFi.hとesp_now.hをインクルードする。
2,ESP-NOW機能を初期化
ここの初期化のやり方も、送信用コードと全く同じ。
WiFi.mode(WIFI_STA); //Wi-Fi機能をステーションモードで起動 WiFi.disconnect(); //初期化前にWi-Fi接続を切断 if (esp_now_init() == ESP_OK) { Serial.println("ESP-Now Init Success"); }
3,受信時に実行される関数を設定
esp_now_register_recv_cb(dataRecv);
何らかのデータを受信したときに実行される関数をesp_now_register_recv_cb()で設定する。カッコの中に書いた関数がデータ受信時に呼び出される。ここではdataRecvという名前の関数を呼び出すことにした。
4,受信時に実行される関数の定義&実装
void dataRecv(const uint8_t *addr, const uint8_t *data, int dataSize) { //データ受信時に実行したい内容をここに書く。 }
先程設定したdataRecvという関数の中身を具体的に作っていく。
ここで、addrは送信した機器のMACアドレス、dataは受信したデータ、dataSizeは受信したデータのサイズ、つまりsizeof(data)である。関数内でこれらを使いたい場合は使う。
5,まとめ&サンプルコード
受信用のコードは送信よりもさらにシンプル。もうこれだけでデータの無線通信ができるんだからESP-NOWは便利でいいね!
ここまでの内容を統合し、各種機能を付け足したサンプルコードを以下に記す。
#include <Arduino.h> #include <WiFi.h> #include <esp_now.h> void dataRecv(const uint8_t *addr, const uint8_t *data, int dataSize)//データ受信時に呼び出される関数 { //受信したデータをシリアルコンソールに表示 Serial.print("Received data is, "); Serial.print(data[0]); Serial.print(" , "); Serial.print(data[1]); Serial.print(" , "); Serial.println(data[2]); if(data[0]%3 == 0)//dataの0番目に格納されている値を3で割った余りが0だったら(3の倍数だったら) { digitalWrite(2, HIGH);//ボード上のLED点灯 } else digitalWrite(2, LOW);//ボード上のLED消灯 } void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); //Wi-Fi機能をステーションモードで起動 WiFi.disconnect(); //初期化前にWi-Fi接続を切断 if (esp_now_init() == ESP_OK) { Serial.println("ESP-Now Init Success"); } esp_now_register_recv_cb(dataRecv);//データ受信時にdataRecvを呼び出すように設定 //その他設定 pinMode(2, OUTPUT);//開発ボード上のLED(D2ピンに繋がっている)を出力に設定 } void loop() { //今回のサンプルではloop()内でやることは特に無い。 }
送信編の記事にて記載したサンプルコードは、ボタンを押したら要素数3つのリストを送信するというものだった。リストの0番目の値は送信回数、1番目の値は送信回数に5を掛けたもの、2番目の要素は常に47、という3つの整数からなるリストの送信をしている。
そこで今回の受信用サンプルは、リストの0番目の要素が3の倍数であったときにLEDを点灯し、それ以外であれば消灯する、という動作にした。つまり送信機のボタンを押していくと3回に1回受信機側のLEDが点灯するという動作となる。
ちなみに、パソコン側のシリアルコンソールで送られてきたデータの中身を見るとこんな感じである。

送信側で送ったデータのとおり、「送信回数, 送信回数を5倍した値, 47」というリストがちゃんと受信できている。
自分の頭の整理のために送信編、受信編と2回に分けてESP-NOWの使い方説明を書いたけど、2回に分ける必要もないくらいかなり簡単に無線通信ができた。送信編にも書いたけど、多少パケットロスによる通信エラーになったって気にしないような用途において、ESP-NOWを使うのはかなり楽なのでおすすめしたい。
(おわり)