こんにちは、ENGかぴです。
ESP32-WROOM-32EはWiFi通信とBluetooth通信ができるのが特徴です。Blutooth通信を手軽に行うことができるBluetoothSerialライブラリを実装してセンサー情報を無線通信して動作確認を行いました。
スマホ(Android)のSerial Bluetooth Terminalを使用してセンサー情報が表示されることを確認します。
ESP32-WROOM-32E開発ボード(秋月電子)を使用しArduino IDEで開発を行います。センサーにはAE-BME280(秋月電子)を使用しています。
ESP32-WROOM-32Eを使って動作確認したことをまとめています。
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
BluetoothSerialライブラリを実装する
ESP32-WROOM-32EにはESP32専用の標準ライブラリとしてBluetoothSerialライブラリが実装されています。マイコンのシリアル通信をBluetooth通信に変換する仕組みですがArduino環境に準拠したライブラリを使用することで手軽にBluetooth通信ができるのが特徴です。
広告
マイベスト3年連続1位を獲得した実績を持つ実践型のプログラミングスクール
ライブラリの初期化
#include "BluetoothSerial.h"
BluetoothSerial SerialBT; //インスタンス化
void setup() {
SerialBT.begin("ESP32-BME280-demo"); //デバイス名を指定する
}
BluetoothSerialライブラリを使用するためにBluetoothSerial.hをインクルードします。BluetoothSerialクラスの型の変数を宣言します。例ではSerialBTという変数名でインスタンス化しています。
setup()関数内でbegin()関数を使ってBlutoothSerialの初期化を行います。第1引数にBluetoothデバイスの名称を指定します。第2引数にマスターとして使用する場合はtrueを指定します。指定しない場合はfalseとなりスレーブ動作になります。スレーブとして動作させる場合は第2引数は特に指定する必要がありません。
例では「ESP32-BME280-demo」を指定しています。スマホなどでBluetoothデバイスを検索すると指定した文字列がデバイスとして表示されます。
データの読み込み(受信)
if( SerialBT.available()){
Serial.write(SerialBT.read());
}
BluetoothSerialクラスの型の変数においてクラスのメンバー関数を使ってデータを受信します。available()関数でBluetooth通信でデータが受信していることを確認します。データがあればread()関数で受信したデータを取得します。例ではBluetooth通信で取得したデータをシリアルモニターに表示しています。
データの書き込み(送信)
SerialBT.print("Temperature = ");
SerialBT.print(bme280data[0]);
SerialBT.println(" °C");
Bluetooth通信でデータを送信する場合はprint()関数やwrite()関数を使用します。引数に文字列を指定しますが、print()関数を使用するとテキストデータの文字列を送信しwrite()関数はバイナリデータとして送信する使い分けがあります。println()を使用すると文字列を送信した後に改行コードを付加します。
動作確認
ESP32-WROOM-32Eが取得している温湿度と気圧のデータをBluetoothを使用してスマホ(Android)で表示します。iphoneのbluetoothは対応していないためAndroidのスマホを使って動作確認を行います。機種によって表示は異なりますがBluetoothのデバイス検索を行いペア設定を行います。
Androidの設定画面(歯車のアイコン)でBluetoothに関する設定欄があるのでデバイス検索を行います。「新しいデバイスとペア設定する」に使用可能なデバイス一覧に表示されている「ESP32-BME280-deme」を選択してペアリングします。
Serial Bluetooth Terminalのインストールと使い方
Playストアを開いて検索欄に「serial bluetooth terminal」を入力するとアプリの候補が表示されるのでSerial Bluetooth Terminalを選択してインストールします。インストールしてアプリを起動します。アプリを起動するとTerminal画面になりますが、リスト部分(Ξ)をクリックしDevicesを選択すると接続できるデバイスが表示されます。
デバイスを選択するとターミナルがスタートします。接続出来れば通信が可能となりますが一定時間以内に接続できない場合はConnection failedとなります。再接続する場合は上方の接続ピン(ダンベルのようなアイコン)をクリックします。
回路図と結果
ESP32-WROOM-32EとBME280モジュールの配線例を示しています。回路図の番号はESP32-WROOM-32Eの左上を1ピンとした時反時計回りにピンを数えた場合の番号としています。ピン番号横の()内の番号はシルク印刷されているピンの名称です。
AE-BME280モジュールをI2C(Wire)で使用します。AE-BME280モジュールにはプルアップ抵抗が付属されているのでWire用のプルアップ抵抗は不要です。
マイコン内蔵のプルアップ抵抗を使用しても問題ありませんが抵抗分が大きいほど通信波形が鈍り通信ができなくなることがあるためAE-BME280モジュールのプルアップ抵抗を使用することをお勧めします。
電源をONすると5秒毎に温湿度と気圧のデータのデータを取得してBluetooth通信を行うと同時にシリアルモニターに表示します。Serial Bluetooth Terminalの結果とシリアルモニタのデータが一致することを確認します。
Serial Bluetooth Terminalでデバイスを選択するとESP32-WROOM-32Eからデータを受信し温湿度と気圧のデータのデータが表示(緑の文字)されているのが確認できました。またシリアルモニタに表示しているデータとSerial Bluetooth Terminalで表示しているデータが一致していることが確認できました。
Serial Bluetooth TerminalからESP32-WROOM-32Eに「hello」の文字を送信するとシリアルモニタ上にhelloの文字が表示されていることから双方向の通信ができていることが確認できます。
ソースコード全体
以下のソースコードはコンパイルして動作確認をしております。コメントなど細かな部分で間違っていたりやライブラリの更新などにより動作しなくなったりする可能性があります。参考としてお使いいただければと思います。
#include "BluetoothSerial.h"
#include <Adafruit_BME280.h>
#define TIM_BME280_WAIT 500
#define TIME_UP 0
#define TIME_OFF -1
#define BASE_CNT 10
BluetoothSerial SerialBT;
Adafruit_BME280 bme280;
float bme280data[3];
int16_t timBme280Set;
uint32_t timer= millis();
/* プロトタイプ宣言 */
void mainTimer(void);
void Bme280Get(void);
// the setup routine runs once when you press reset:
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32-BME280-demo");
bme280.begin();
}
// the loop routine runs over and over again forever:
void loop() {
mainTimer();
if( timBme280Set == TIME_UP ){
timBme280Set = TIM_BME280_WAIT;
Bme280Get();
}
if( SerialBT.available()){
Serial.write(SerialBT.read());
}
}
/* タイマ管理 */
void mainTimer(void){
if( millis() - timer >= BASE_CNT ){
timer = millis();
if( timBme280Set > TIME_UP ){
--timBme280Set;
}
}
}
/* BME280のデータ取得 */
void Bme280Get(void){
Serial.print("Temperature = ");
bme280data[0] = bme280.readTemperature();
Serial.print(bme280data[0]);
Serial.println(" °C");
SerialBT.print("Temperature = ");
SerialBT.print(bme280data[0]);
SerialBT.println(" °C");
Serial.print("Pressure = ");
bme280data[1] = bme280.readPressure() / 100.0F;
Serial.print(bme280data[1]);
Serial.println(" hPa");
SerialBT.print("Pressure = ");
SerialBT.print(bme280data[1]);
SerialBT.println(" hPa");
Serial.print("Humidity = ");
bme280data[2] = bme280.readHumidity();
Serial.print(bme280data[2]);
Serial.println(" %");
Serial.println();
SerialBT.print("Humidity = ");
SerialBT.print(bme280data[2]);
SerialBT.println(" %");
SerialBT.println();
}
関連リンク
Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。
Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方
Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方
ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方
最後まで、読んでいただきありがとうございました。