#include "M5StickCPlus.h"
#include <esp_now.h>
#include <WiFi.h>
esp_now_peer_info_t peerInfo;
int line = 0;
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.Lcd.println("ESP-Now Init Success");
}
else
{
M5.Lcd.println("ESP-Now Init failed");
ESP.restart();
}
// マルチキャスト用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.Lcd.println("ESP add peer 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]);
line++;
if (line > 3)
{
M5.Lcd.fillScreen(YELLOW);
M5.Lcd.setCursor(0, 0, 1);
line = 0;
M5.Beep.tone(2000, 500);
}
else
{
M5.Beep.tone(1000, 500);
}
M5.Lcd.setTextColor(BLACK, GREEN);
M5.Lcd.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
void setup()
{
M5.begin();
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(YELLOW);
M5.Lcd.setTextColor(BLACK, YELLOW);
M5.Lcd.setCursor(0, 0, 1);
M5.Lcd.setTextSize(2);
Init_ESPNOW();
}
void loop()
{
M5.update();
M5.Beep.update();
if (M5.BtnA.wasReleased())
{
uint8_t data[100] = {100}; // Data to be sent uint8_tは0〜255の数値(1Byte)
float pi = 3.14159265f;
double dpi = 3.14159265358979323;
const void* ppi = π
const void* pdpi = &dpi;
memcpy(data+1, ppi, sizeof(pi));
memcpy(data+5, pdpi, sizeof(dpi));
sprintf((char *)data+13,"ABCDEFG_abcdefg"); // Store string (Line86)
// for (int i = 1; i < 80; i += 10)
// {
// sprintf((char *)data + i, "ABCDEFGHIJ");
// }
esp_err_t result = esp_now_send(peerInfo.peer_addr, data, sizeof(data)); // Really send
}
delay(20);
}
// データを受け取った時に実行されるコールバック関数
void onESPNOWReceive(const uint8_t *mac_addr, const uint8_t *data, int data_len)
{
if (data[0] == 100) // 100に深い意味はない。uint8_tは0〜255の数値
{
M5.Beep.tone(2000, 1000);
M5.Lcd.fillScreen(YELLOW);
M5.Lcd.setCursor(0, 0, 1);
M5.Lcd.setTextColor(BLACK, CYAN);
float *ppi = (float*)&data[1];
double *dppi = (double*)&data[5];
M5.Lcd.printf("%.8f\n", *ppi);
M5.Lcd.printf("%.16f\n", *dppi);
// M5.Lcd.printf("%s\n", ?????[??] ); // Print string stored at Line86
}
}