diff --git a/SampleSrc/espnow04.ino b/SampleSrc/espnow04.ino new file mode 100644 index 0000000..019bef6 --- /dev/null +++ b/SampleSrc/espnow04.ino @@ -0,0 +1,252 @@ +#include "M5StickCPlus.h" +#include +#include + +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("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]); + line++; + if (line > 0) + { + M5.Lcd.fillScreen(BLACK); + M5.Lcd.setCursor(0, 0, 1); + line = 0; + M5.Beep.tone(500, 500); + } + else + { + M5.Beep.tone(250, 500); + } + M5.Lcd.setTextColor(BLACK, GREEN); + + M5.Lcd.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); +} + +// データを受け取った時に実行されるコールバック関数 +void onESPNOWReceive(const uint8_t *mac_addr, const uint8_t *data, int data_len) +{ + 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]); + // Serial.println(); + // Serial.printf("Last Packet Recv from: %s\n", macStr); + // Serial.printf("Last Packet Recv Data(%d): ", data_len); + if (data[0] == 50 && data[1] == 200) // 100,254に深い意味はない。uint8_tは0〜255の数値 + { + line++; + if (line = 1)//レ どうし + { + M5.Beep.tone(146, 750); + M5.Lcd.fillScreen(GREEN); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(500); + } + if (line = 2)//レ たっ + { + M5.Beep.tone(146, 1000); + M5.Lcd.fillScreen(BLACK); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(500); + } + if (line = 3)//シ て + { + M5.Beep.tone(246, 250); + M5.Lcd.fillScreen(RED); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(500); + } + if (line = 4)//ラ け + { + M5.Beep.tone(164, 1000); + M5.Lcd.fillScreen(GREEN); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 5)//シ せ + { + M5.Beep.tone(493, 1000); + M5.Lcd.fillScreen(BLACK); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 6)//レ な + { + M5.Beep.tone(164, 1000); + M5.Lcd.fillScreen(RED); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 7)//シ い + { + M5.Beep.tone(493, 1000); + M5.Lcd.fillScreen(GREEN); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 8)//ラ ゆ + { + M5.Beep.tone(164, 1000); + M5.Lcd.fillScreen(BLACK); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 9)//シ め + { + M5.Beep.tone(493, 1000); + M5.Lcd.fillScreen(RED); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(50); + } + if (line = 10)//シ も + { + M5.Beep.tone(493, 250); + M5.Lcd.fillScreen(GREEN); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(500); + } + if (line = 11)//ソ と + { + M5.Beep.tone(391, 250); + M5.Lcd.fillScreen(BLACK); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 12)//ラ ま + { + M5.Beep.tone(184, 1000); + M5.Lcd.fillScreen(RED); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 13)//シ れ + { + M5.Beep.tone(493, 250); + M5.Lcd.fillScreen(GREEN); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 14)//レ な + { + M5.Beep.tone(587, 1000); + M5.Lcd.fillScreen(BLACK); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 15)//シ い + { + M5.Beep.tone(493, 1000); + M5.Lcd.fillScreen(RED); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 16)//ラ い + { + M5.Beep.tone(184, 1000); + M5.Lcd.fillScreen(GREEN); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(250); + } + if (line = 17)//シ ま + { + M5.Beep.tone(493, 1000); + M5.Lcd.fillScreen(BLACK); + M5.Lcd.setCursor(0, 0, 1); + line++; + delay(50); + } + if (line = 18)//シ も + { + M5.Beep.tone(493, 250); + M5.Lcd.fillScreen(RED); + M5.Lcd.setCursor(0, 0, 1); + line=0; + delay(125); + } + + M5.Lcd.setTextColor(BLACK, CYAN); + + M5.Lcd.printf(" %s\n", macStr); + M5.Lcd.printf("Data: %d %d\n", data[0], data[1]); + } +} + +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.BtnB.wasReleased()) + { + uint8_t data[2] = {50, 200}; // 送信データ  100, 254に深い意味はない。uint8_tは0〜255の数値 + esp_err_t result = esp_now_send(peerInfo.peer_addr, data, sizeof(data)); + } + + { + /* data */ + }; + + delay(20); +}