Newer
Older
OurSketch / SampleSrc / espnow03.ino
@hoge hoge on 28 Jun 2022 6 KB 03
#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("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(293, 750);
            M5.Lcd.fillScreen(GREEN);
            M5.Lcd.setCursor(0, 0, 1);
            line++;
            delay(500);
        }
        if (line = 2)//レ たっ
        {
            M5.Beep.tone(293, 1000);
            M5.Lcd.fillScreen(BLACK);
            M5.Lcd.setCursor(0, 0, 1);
             line++;
            delay(500);
        }
        if (line = 3)//シ て
        {
            M5.Beep.tone(493, 250);
            M5.Lcd.fillScreen(RED);
            M5.Lcd.setCursor(0, 0, 1);
            line++;
            delay(500);
        }
        if (line = 4)//ラ け
        {
            M5.Beep.tone(440, 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(587, 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(440, 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(440, 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(440, 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);
}