shuzo-kino.hateblo.jp
ではバリバリおくっており電気をバカ食いします。
これではBLEの利点である低消費電力が全く意味をなさないのでディープスリープをして消費電力を落としてみます。
実際のところ
30秒に一回起動し、一秒だけ窓をあける……みたいな感じの動きをしてみます。
#include <M5StampS3.h> #include <BLEDevice.h> #include <BLEUtils.h> #include <BLEServer.h> #include <BLEAdvertising.h> // Eddystone-URLの設定 #define EDDYSTONE_URL_FRAME_TYPE 0x10 #define TX_POWER 0xEE // -18dBm const char* url = "https://example.com"; // スリープ時間の設定(マイクロ秒) #define SLEEP_TIME 30000000 // 30秒 RTC_DATA_ATTR int bootCount = 0; void setup() { M5.begin(); // ブート回数をインクリメント bootCount++; Serial.println("Boot number: " + String(bootCount)); // BLEデバイスの初期化 BLEDevice::init("M5StampS3-Eddystone"); // BLEサーバーの作成 BLEServer *pServer = BLEDevice::createServer(); // アドバタイジングの設定 BLEAdvertising *pAdvertising = pServer->getAdvertising(); // Eddystone-URLフレームの作成 uint8_t eddystoneData[20]; int dataLength = 0; eddystoneData[dataLength++] = EDDYSTONE_URL_FRAME_TYPE; eddystoneData[dataLength++] = TX_POWER; // URLエンコーディング eddystoneData[dataLength++] = 0x03; // https:// for (int i = 0; i < strlen(url); i++) { eddystoneData[dataLength++] = url[i]; } // アドバタイジングデータの設定 pAdvertising->setAdvertisementData(BLEAdvertisementData() .setFlags(0x06) // BR/EDR Not Supported & LE General Discoverable Mode .setManufacturerData(std::string((char*)eddystoneData, dataLength))); // アドバタイジング開始 pAdvertising->start(); Serial.println("Eddystone-URL Beacon transmitted"); // 短時間アドバタイジングを続ける(BLEスキャナーが検出しやすくするため) delay(1000); // アドバタイジングの停止 pAdvertising->stop(); BLEDevice::deinit(true); Serial.println("Going to sleep for 30 seconds"); Serial.flush(); // ディープスリープの開始 esp_sleep_enable_timer_wakeup(SLEEP_TIME); esp_deep_sleep_start(); } void loop() { // ディープスリープを使用しているため、このループは実行されません }