diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 4a08aaf..2803cb9 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -96,7 +96,7 @@ "/Users/miura/Library/Arduino15/packages/esp32/hardware/esp32/1.0.6/libraries/Wire/src", "/Users/miura/Library/Arduino15/packages/esp32/hardware/esp32/1.0.6/libraries/SPI/src", "/Users/miura/Library/Arduino15/packages/esp32/hardware/esp32/1.0.6/libraries/FS/src", - "/Users/miura/Library/Arduino15/packages/esp32/hardware/esp32/1.0.6/libraries/BLE/src", + "/Users/miura/Library/Arduino15/packages/esp32/hardware/esp32/1.0.6/libraries/WiFi/src", "/Users/miura/Library/Arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/1.22.0-97-gc752ad5-5.2.0/xtensa-esp32-elf/include/c++/5.2.0", "/Users/miura/Library/Arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/1.22.0-97-gc752ad5-5.2.0/xtensa-esp32-elf/include/c++/5.2.0/xtensa-esp32-elf", "/Users/miura/Library/Arduino15/packages/esp32/tools/xtensa-esp32-elf-gcc/1.22.0-97-gc752ad5-5.2.0/xtensa-esp32-elf/include/c++/5.2.0/backward", diff --git a/M5StickCPlus_FactoryTest2022.ino b/M5StickCPlus_FactoryTest2022.ino index 20e4611..346ef6d 100644 --- a/M5StickCPlus_FactoryTest2022.ino +++ b/M5StickCPlus_FactoryTest2022.ino @@ -56,7 +56,8 @@ extern const unsigned char icon_ble_disconnect[1]; #endif -bool TestMode = true; // テストモード 常時ONにした (A/Bボタンを押しながら起動すれば、通常のFactoryTestでもテストモードになる) +bool TestMode = true; // テストモード 常時ONにした (A/Bボタンを押しながら起動すれば、通常のFactoryTestでもテストモードになる) +bool startCoundDownShutdown = false; // 電源OFFのカウントダウンを開始するならtrue TFT_eSprite Disbuff = TFT_eSprite(&M5.Lcd); // 画面ちらつき防止スプライト(画面のバッファリング) @@ -83,8 +84,10 @@ } while (M5.Axp.GetBtnPress()); M5.Beep.mute(); // ESP.restart(); - M5.Axp.Write1Byte(0x32, M5.Axp.Read8bit(0x32) | 0x80); + M5.Axp.Write1Byte(0x32, M5.Axp.Read8bit(0x32) | 0x80); //電源OFF } + if (startCoundDownShutdown) + countDownShutdown(); } void Displaybuff() // Disbuffスプライトを表示する。(テストモードだったらTest Modeと表示する) @@ -1130,6 +1133,91 @@ } esp_now_peer_info_t peerInfo; +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) + { + Serial.println("ESP-Now Init Success"); + } + else + { + Serial.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 + Serial.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 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] == 100 && data[1] == 254) // 100,254に深い意味はない。uint8_tは0〜255の数値 + { + startCoundDownShutdown = true; // シャットダウンタイマースタート予約(発動はcheckAXPPress()のなかで) + } +} +void countDownShutdown() +{ + int countsec = 10; + int subcount = 10; + while ((!M5.BtnA.isPressed()) && (!M5.BtnB.isPressed())) + { + Disbuff.fillRect(0, 0, 240, 135, TFT_ORANGE); + Disbuff.setTextColor(TFT_BLACK); + Disbuff.setTextSize(3); + Disbuff.setCursor(12, 20); + Disbuff.printf("%d sec to shutdown. A/B press to cancel.", countsec); + + Disbuff.pushSprite(0, 0); + M5.update(); + delay(100); + subcount--; // subcountが10から0になると、約1秒 + if (subcount < 0) + { + countsec--; // カウントダウン秒数を減らす + subcount = 10; + } + if (countsec < 0) + { + M5.Axp.Write1Byte(0x32, M5.Axp.Read8bit(0x32) | 0x80); //電源OFF + } + } + startCoundDownShutdown = false; + delay(50); + M5.Beep.mute(); + Disbuff.setTextColor(TFT_WHITE); +} +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]); + // Serial.print("Last Packet Sent to: "); + // Serial.println(macStr); + // Serial.print("Last Packet Send Status: "); + // Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); +} + void ESP_NOW_SendShutdown() // Bボタンを押したら、ESPNOWで周辺デバイスの電源OFF { while ((!M5.BtnA.isPressed()) && (!M5.BtnB.isPressed())) @@ -1138,18 +1226,14 @@ Disbuff.setTextColor(TFT_YELLOW); Disbuff.setTextSize(3); Disbuff.setCursor(12, 20); - Disbuff.printf("Press B to shutdown all devices "); + Disbuff.printf("Press the B button to turn off nearby devices"); Disbuff.pushSprite(0, 0); checkAXPPress(); M5.update(); - delay(100); - } - while ((M5.BtnA.isPressed()) || (M5.BtnB.isPressed())) - { if (M5.BtnB.isPressed()) { - uint8_t data[2] = {111, 222}; // 送信データ + uint8_t data[2] = {100, 254}; // 送信データ  100, 254に深い意味はない。uint8_tは0〜255の数値 esp_err_t result = esp_now_send(peerInfo.peer_addr, data, sizeof(data)); Serial.print("Send Status: "); if (result == ESP_OK) @@ -1181,44 +1265,15 @@ Serial.println("Not sure what happened"); } } - M5.update(); - checkAXPPress(); - M5.Beep.tone(4000); - delay(10); + if (M5.BtnA.isPressed()) + break; + delay(100); } + M5.Beep.tone(4000); delay(50); M5.Beep.mute(); Disbuff.setTextColor(TFT_WHITE); } -// 引用: https://101010.fun/iot/esp32-m5stickc-plus-esp-now.html -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); - for (int i = 0; i < data_len; i++) - { - Serial.print(data[i]); - Serial.print(" "); - if (data[i] == 222) - { - M5.Axp.Write1Byte(0x32, M5.Axp.Read8bit(0x32) | 0x80); - } - } -} -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]); - Serial.print("Last Packet Sent to: "); - Serial.println(macStr); - Serial.print("Last Packet Send Status: "); - Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail"); -} void ColorBar() // 起動直後のカラーバー表示 { @@ -1390,31 +1445,7 @@ } M5.Axp.ScreenBreath(12); // 画面明るさ調整  8〜15 - // 引用: https://101010.fun/iot/esp32-m5stickc-plus-esp-now.html - WiFi.mode(WIFI_STA); - WiFi.disconnect(); - if (esp_now_init() == ESP_OK) - { - Serial.println("ESP-Now Init Success"); - } - else - { - Serial.println("ESP-Now Init failed"); - } - for (int i = 0; i < 6; ++i) - { - peerInfo.peer_addr[i] = (uint8_t)0xff; - } - peerInfo.channel = 0; - peerInfo.ifidx = WIFI_IF_AP; - peerInfo.encrypt = false; - if (esp_now_add_peer(&peerInfo) != ESP_OK) - { - Serial.println("Failed to add peer"); - return; - } - esp_now_register_send_cb(onESPNOWSent); - esp_now_register_recv_cb(onESPNOWReceive); + Init_ESPNOW(); // ESPNOWの初期化 ColorBar();