ESP32など

電子工作してます

ESP-NOWの一番シンプルで簡単なサンプル

概要

  • ESP32は独自の通信「ESP-NOW」が使えます。すごい簡単に使えます。
  • M5Stack系や、esp32-camとかでも使えます。
  • すごい簡単に使えるやつのさらに一番簡単なメモを記載します。

ESP-NOWが使えるM5Stack AtomS3 Lite

ATOM S3

ATOM S3

  • 共立電子産業株式会社 KYOHRITSU ELECTRONIC INDUSTRY CO.,LTD.
Amazon

(1) 通知だけの場合(受信したデータ取得無し・ブロードキャスト)

  • 伝える情報は無しで、送信側から送信されたことを、受信側が検知するだけ
  • 送信側がボタンを押して、受信側がボタン押されたことを受け取るみたいな単純な処理のときに使う
  • 送信失敗などは検知しない
  • ブロードキャスト(送信先を指定せずに誰でも受信出来るように送信)
  • 多対多でも行けるけどマジ電波届く範囲のESP-NOW受信待ちESP32全部に送られちゃうから注意してね

送信側

#include "WiFi.h"
#include <esp_now.h>

// ボタンを41に接続
#define PIN_BTN GPIO_NUM_41

// ブロードキャスト用のアドレス
uint8_t macAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

// 送信データ(別の型とか構造体でもいい)
int send_data = 1;

void setup() {

  // ボタン
  pinMode(PIN_BTN, INPUT);

  // WiFi初期化
  WiFi.mode(WIFI_STA);

  // ESP-NOWの初期化(出来なければリセットして繰り返し)
  if (esp_now_init() != ESP_OK) {
    return;
  }

  // 送信先アドレスを設定(この場合はブロードキャストアドレス)
  esp_now_peer_info_t peerInfo;
  memset(&peerInfo, 0, sizeof(peerInfo));
  memcpy(peerInfo.peer_addr, macAddress, 6);
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    return;
  }
}

void loop() {
  if (digitalRead(PIN_BTN) == LOW) {
    // ESP-NOW送信
    esp_now_send(macAddress, (uint8_t *) &send_data, sizeof(send_data));
    delay(500);
  }
}

受信側

#include <WiFi.h>  // ESPNOWを使う場合はWiFiも必要
#include <esp_now.h> // ESPNOW本体

// 確認用LEDをつなげとく
#define PIN_LED 7

void setup() {

  // 確認用LED
  pinMode(PIN_LED, OUTPUT);

  // WiFi初期化
  WiFi.mode(WIFI_STA);

  // ESP-NOWの初期化(出来なければリセットして繰り返し)
  if (esp_now_init() != ESP_OK) {
    return;
  }

  // ESP-NOW受信時に呼ばれる関数の登録
  esp_now_register_recv_cb(esp_now_recv_cb_t(OnDataRecv));
}

void loop() {
}

// ESP-NOW受信時に呼ばれる関数
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *incomingData, int len) {

  // 確認用LEDピカピカ
  digitalWrite(PIN_LED, HIGH); 
  delay(100);
  digitalWrite(PIN_LED, LOW); 
  delay(100);
  digitalWrite(PIN_LED, HIGH); 
  delay(100);
  digitalWrite(PIN_LED, LOW); 
}

ATOMS3 Lite

ATOMS3 Lite

  • 共立電子産業株式会社 KYOHRITSU ELECTRONIC INDUSTRY CO.,LTD.
Amazon

(2) 通知だけの場合(受信したデータ取得無し・受信側アドレス指定)

  • 特定の相手に送信
  • データを乗せて送る

Macアドレス確認

#include "esp_mac.h"

void setup() {
  Serial.begin(9600);
  delay(1000);
  
  uint8_t mac[6];
  char macChr[100] = {0};
  esp_read_mac(mac, ESP_MAC_WIFI_STA);
  sprintf(macChr, "{0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X}", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  Serial.println(macChr);
}
void loop() {}

送信側

  • ブロードキャスト用のアドレスの代わりに上記で取得した受信側アドレスを記載
  uint8_t maxAddress[] = {0x??, 0x??, 0x??, 0x??, 0x??, 0x??};

受信側

  • 変更なし