ESP32のBluetooth機能を使用して、RTCに時刻を設定する方法を紹介する。Bluetooth(BLE)にはGATT(Generic Attribute Profile)という規格があり
周囲のデバイスが提供するサービスを認知することができる。その中に"current time"というサービスがあり、このサービスでは、デバイスの時刻が参照できるようになっている。
ここでは、そのサービスをESP32側に実装し、Web Bluetoothの機能を利用して、
外部のブラウザから、現在時刻をESP32のRTC(クロック)に設定する方法について説明する。
"current time"サービスの実装
ESP32にService"current time"、Characteristicとして"current time"を設定したBLEサーバーを定義する。現在時刻の設定先としてDescriptorを追加しておく。
BLEサーバーのアドバタイズをスタートさせると、ESP32の"current time"サービスが外部から認知できるようになる。
外部から、現在時刻がDescriptorに書き込まれると、Descriptorのコールバックの onWrite()関数に通知される。
H/W構成
・ESP32 DevkitC
・SD1306 128x64 OLED表示装置
・LED
- BuitIn LED:5(1kΩ程度の抵抗を経由して接続) 使用したESP32にはBuitIn LEDが無いので外付けした
- Control用LED:17(1kΩ程度の抵抗を経由して接続)
ブラウザの操作
- Chromeを開いて"Web_Bluetooth_Set_RTC.html"をドラッグ&ドロップする。
- "Connect to ESP32"ボタンを押す。Bluetoothデバイスのスキャン画面が表示される。
- スキャン画面に"ESP32_2"が表示されるので選択して"ペア設定"ボタンを押す。
- 接続状態(約30秒間。BuitIn LEDが点滅)になるので"Set current time to ESP32 RTC"ボタンを押す。
- 現在の時刻が表示される。
Commandに"off"と入力して"Execute specified command : on/off"ボタンを押すとControl用LEDが消灯する。
このCommand実行機能は、拡張して他の制御機能にも利用できる。
接続
OLED表示装置の接続は以下の通り。
I2C | ESP32 |
SCK | 21 |
SDA | 22 |
インストール
- コードを、ZIP形式でダウンロード
- ArduinoIDEにおいて、ライブラリマネージャから以下を検索してインストールする
- Adafruit_BusIO
- Adafruit_GFX
- Adafruit_SSD1306
- ArduinoIDEからESP32_WebBLE_clock_set_master.inoを開く
- 「検証・コンパイル」に成功したら、一旦、「名前を付けて保存」を行う
若干の解説
・PCにはBluetooth機能かBluetooth(5.0以降)のUSBドングルが必要である。
・ブラウザはChromeだけでなく、Edgeでも動作した。スマートフォンのChromeでも動作する。
・ここで使用した"Web_Bluetooth_Set_RTC.html"は冒頭のWeb Bluetoothサイトのサンプルを改造したものである。
注意事項
・利用の際は、自己責任でお楽しみください。