ログイン トップページ
ソースコードの参照 : espnow03 (作成者: 三浦 元喜)
Hash:
注:このページのURLをシェアすると、他のユーザも参照したり、自分用にコピーしたりできるようになります。
#include <M5Unified.h>
#include <esp_now.h>
#include <WiFi.h>

esp_now_peer_info_t peerInfo;

void setup() {
  auto cfg = M5.config();
  cfg.serial_baudrate = 115200; // ボーレートを115200に設定
  M5.begin(cfg);
  M5.Display.setRotation(3);
  M5.Display.setFont(&fonts::lgfxJapanGothic_16);
  M5.Display.println("ESPNOW 02");
  M5.Display.setTextScroll(true);
  Init_ESPNOW();
}

void loop() {
  M5.update();
  if (M5.BtnA.wasReleased()) {
    uint8_t data[100] = {234}; // 送信データ    234に深い意味はない。uint8_tは0〜255の数値
    float pi = 3.14159265f;
    double dpi = 3.14159265358979323;
    const void* ppi = &pi;
    const void* pdpi = &dpi;
    // data[0] は1byte char 234 を、宣言時に設定した。
    // そのあと、floatとdoubleを混載する。data[1]~data[4]はfloat (4byte)
    // data[5]~data[12]はdouble (8byte)
    memcpy(data+1, ppi, sizeof(pi));   // data[1]〜data[4]に、piの値をfloat形式で保存
    memcpy(data+5, pdpi, sizeof(dpi)); // data[5]〜data[12]に、dpiの値をdouble形式で保存
    // さらに、文字列をdata[13]から格納する
    sprintf((char *)data+13,"ABCDEFG_abcdefg"); // Store string (Line86)
    // さらに、送信側プログラムのコンパイル時刻をdata[28]から格納する
    sprintf((char *)data+28, __TIME__ ); // __TIME__はC言語のプリプロセッサが時刻に置き換える
    // 送信
    esp_err_t result = esp_now_send(peerInfo.peer_addr, data, sizeof(data));
  }
  M5.delay(20);
}

void Init_ESPNOW()
{ // ESPNowの初期化
  // 引用: https://101010.fun/iot/esp32-m5stickc-plus-esp-now.html
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  if (esp_now_init() == ESP_OK)
  {
    M5.Display.println("ESP-Now Init Success");
  }
  else
  {
    M5.Display.println("ESP-Now Init failed");
  }
  // マルチキャスト用Slave登録
  memset(&peerInfo, 0, sizeof(peerInfo));
  for (int i = 0; i < 6; ++i)
  {
    peerInfo.peer_addr[i] = (uint8_t)0xff;
  }
  esp_err_t addStatus = esp_now_add_peer(&peerInfo);
  if (addStatus == ESP_OK)
  {
    // Pair success
    M5.Display.println("Pair success");
    esp_now_register_send_cb(onESPNOWSent);    //送信後のコールバック関数を指定する
    esp_now_register_recv_cb(onESPNOWReceive); ///受信時のコールバック関数を指定する
  }
}
// データを送信した後に実行されるコールバック関数
// 引用: https://101010.fun/iot/esp32-m5stickc-plus-esp-now.html
void onESPNOWSent(const uint8_t *mac_addr, esp_now_send_status_t status)
{
  // char macStr[18];
  // snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X",
  //          mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
  M5.Display.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}

// データを受け取った時に実行されるコールバック関数
void onESPNOWReceive(const esp_now_recv_info_t *recv_info, const uint8_t *data, int data_len)
{
//  char macStr[18];
//  snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X",
//           recv_info->src_addr[0], recv_info->src_addr[1], recv_info->src_addr[2], 
//           recv_info->src_addr[3], recv_info->src_addr[4], recv_info->src_addr[5]);

  if (data[0] == 234) // 234に深い意味はない。uint8_tは0〜255の数値
  {
    M5.Speaker.tone(2000, 1000);
    M5.Lcd.fillScreen(YELLOW);
    M5.Lcd.setCursor(0, 0, 1);
    M5.Lcd.setTextColor(BLACK, CYAN);

    float *ppi = (float*)&data[1]; // byte列に保存していたfloat値を読み取るためのポインタ
    double *dppi = (double*)&data[5];
    M5.Lcd.printf("%.8f\n", *ppi);    // float値を読み取って表示
    M5.Lcd.printf("%.16f\n", *dppi);  // double値を読み取って表示
    M5.Lcd.printf("%s\n", &data[13] ); // Print string stored at Line86
    M5.Lcd.printf("%s\n", &data[28] ); // 送信側プログラムのコンパイル時刻
  }
}