問題
「Wi-Fi&BluetoothモジュールESP32とBLEタグで誰かの在宅状況を見守ってみる」で作ったArduinoコードを久しぶりに引っ張り出してきて、パラメータだけ変更してビルドしてESP32に書き込んだら、うまく動かなくなりました(^^;)。色々試してみると、どうやら、BLEスキャンとWIFI経由でのHTTPS送信が同時に実行できない問題だったようです。
(っていうか、逆になんで今まで動いていたのか謎なんですが、結局調べてもよくわからなかったので謎のまま。。。)
少し前の記事ですが、以下でも同じ現象が報告されています。
ESP32でBLEで受信したデータをWi-Fi経由でhttp送信はできるが、httpS送信ができない - つれづれ日記
回避策
試行錯誤の結果、最終的には「BLEスキャンとHTTPS送信を同時に実行しない」という当然の対策に行き着きました。流れは以下の通り。
- まずはBLEスキャンだけ実行して、スキャン結果をEEPROMに書き込みリセット
※このとき、Wi-Fiは使いません。 - リセットからの復帰後、EEPROMからスキャン結果を読み取ってWi-FiでHTTPS送信
※このとき、Bluetoothは使いません。
安直ですが、これで安定動作してくれます。
起動毎に処理を切り分けるやり方は色々ありそうですが、今回の用途では、起動時にリセット理由をチェックして処理を切り分けています(BLEスキャンの後はSOFTWARE RESET、HTTPS送信の後はDEEP SLEEPさせているので、リセット理由だけで処理が決まります)。EEPROMに何かしらのフラグを保管しておくのがスマートかもしれません。
コード
コードは以下に置いておきます。
nikotan/BLETagMonitor_esp32.ino - GitHubGist
setup()
の中で、起動時のリセット理由をチェックして処理を振り分けてます。
こんな感じ。
void setup()
{
delay(500);
// reset理由をチェック
RESET_REASON r = rtc_get_reset_reason(0);
if (r != 12)
{
// software reset 以外の場合
doScanBLETag();
}
else
{
// software reset の場合
doSendResult();
}
}