LoginSignup
3
5

More than 5 years have passed since last update.

ESP32でBLEスキャンとHTTPS送信を同時に実行できない問題の回避策

Posted at

問題

Wi-Fi&BluetoothモジュールESP32とBLEタグで誰かの在宅状況を見守ってみる」で作ったArduinoコードを久しぶりに引っ張り出してきて、パラメータだけ変更してビルドしてESP32に書き込んだら、うまく動かなくなりました(^^;)。色々試してみると、どうやら、BLEスキャンとWIFI経由でのHTTPS送信が同時に実行できない問題だったようです。
(っていうか、逆になんで今まで動いていたのか謎なんですが、結局調べてもよくわからなかったので謎のまま。。。)

少し前の記事ですが、以下でも同じ現象が報告されています。
ESP32でBLEで受信したデータをWi-Fi経由でhttp送信はできるが、httpS送信ができない - つれづれ日記

回避策

試行錯誤の結果、最終的には「BLEスキャンとHTTPS送信を同時に実行しない」という当然の対策に行き着きました。流れは以下の通り。

  1. まずはBLEスキャンだけ実行して、スキャン結果をEEPROMに書き込みリセット
    ※このとき、Wi-Fiは使いません。
  2. リセットからの復帰後、EEPROMからスキャン結果を読み取ってWi-FiでHTTPS送信
    ※このとき、Bluetoothは使いません。

安直ですが、これで安定動作してくれます。
起動毎に処理を切り分けるやり方は色々ありそうですが、今回の用途では、起動時にリセット理由をチェックして処理を切り分けています(BLEスキャンの後はSOFTWARE RESET、HTTPS送信の後はDEEP SLEEPさせているので、リセット理由だけで処理が決まります)。EEPROMに何かしらのフラグを保管しておくのがスマートかもしれません。

コード

コードは以下に置いておきます。
nikotan/BLETagMonitor_esp32.ino - GitHubGist

setup()の中で、起動時のリセット理由をチェックして処理を振り分けてます。
こんな感じ。

setup()だけ
void setup()
{
  delay(500);

  // reset理由をチェック
  RESET_REASON r = rtc_get_reset_reason(0);
  if (r != 12)
  {
    // software reset 以外の場合
    doScanBLETag();
  }
  else
  {
    // software reset の場合
    doSendResult();
  }
}
3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5