第16回では引き続き、BluetoothとWifi通信が内部実装されているマイコン「ESP32-WROOM-Devkit」を使い、旅Arduinoを無線化します。
第15回の続きの記事になりますので、第15回目を参照の上ご覧ください。
受信したBluetoothシリアル通信を自作アプリで取得
前回で、AndroidスマートフォンにArduino(ESP32)からのセンサーデータをBluetoorh経由送ることが可能となりましたので、このデータをアプリ画面上に表示できるよう、Androidアプリを作成します。
Androidアプリに関しては、説明を省略させていただきます。
基本的なつくりとしては、
- Bluetoothシリアル通信(SPP)を開始できるように機能を実装
- 定期的に送られてくるセンサーデータを取得し、解析
- GPS情報はスマートフォンから取得できるため、定期的に位置情報を取得
- 得られた情報をアプリ画面上に描画
といった仕組みで動いております。
一応、上記処理のコードを含んだjavaファイルをzipに圧縮しダウンロードできるようにしときます。
(javaファイルはセキュリティソフトに消される可能性が高いので、拡張子をtxtに変更しておきます。)
旅Arduino ver4 回路図
新たな回路図になります。
今まではarduino nano everyを使っていましたが、ESP32に変更しております。
また、以前のverではGPSユニットを付けていましたが、スマートフォンで同様の機能を実装できますので、構成から外しております。
注意点として、ESP32の信号ラインは3,3V動作です。今までの5Vではありません。
幸いにも今まで利用してきたセンサーは3.3Vと5Vどちらでも動作しますので、大きな問題とはなりませんでした。
電源に関しては、消費電力が非常に小さいので、USBからの給電のみとしております。今まではLCDを使うためにDCDCコンバータを利用していましたが、スマートフォンに変更になったため、別途電源を用意する必要がなくなり、回路構成が非常にシンプルになりました。
旅Arduinoコード
#include <Wire.h>
#include "BluetoothSerial.h"
#include "SparkFunBME280.h"
#include <Adafruit_INA219.h>
BluetoothSerial SerialBT;
BME280 sensor;
Adafruit_INA219 ina219;
float m_fltTemp;
float m_fltHumidity;
float m_fltPressure;
float m_fltVoltage;
float m_fltCurrent;
float m_fltPowermW;
void setup() {
Serial.begin(115200);
Serial.print("StartMyDevice");
SerialBT.begin("TravelArduino");
Wire.begin(21,22);
//Debug
sensor.settings.commInterface = I2C_MODE;
sensor.settings.I2CAddress = 0x76;
sensor.settings.runMode = 3;
sensor.settings.tStandby = 0;
sensor.settings.filter = 0;
sensor.settings.tempOverSample = 1;
sensor.settings.pressOverSample = 1;
sensor.settings.humidOverSample = 1;
//BME280
sensor.beginI2C();
// INA219 Init
while (!Serial) {
delay(1);
}
uint32_t currentFrequency;
if (! ina219.begin()) {
Serial.println("Failed to find INA219 chip");
while (1) { delay(10); }
}
}
void loop() {
//BME280
m_fltTemp = 0;
m_fltHumidity = 0;
m_fltPressure = 0;
m_fltTemp = sensor.readTempC();
m_fltHumidity = sensor.readFloatHumidity();
m_fltPressure = sensor.readFloatPressure() / 100.0;
// INA210
float fltShuntVoltage;
float fltBusVoltage;
fltShuntVoltage = ina219.getShuntVoltage_mV();
fltBusVoltage = ina219.getBusVoltage_V();
m_fltVoltage = (fltBusVoltage + (fltShuntVoltage / 1000));
m_fltPowermW = ina219.getPower_mW();
String sendData = String(m_fltTemp) + "," + String(m_fltHumidity) + "," + String(m_fltPressure) + "," + String(m_fltVoltage) + "," + String(m_fltPowermW) + ";" ;
Serial.println(sendData);
SerialBT.println(sendData);
delay(1500);
}
ESP32に配置するコードです。
各種アドレス、Bluetooth名は必要に応じて変更してください。
シリアル通信には/で分割したデータを送信しています。本当であればチェックサム機能を実装するべきなのですが、データの信頼性が問題になることは今回ないので、実装していません。
結果
LCDを8pinで動かしていたのが懐かしく感じるくらい、進歩しました。
マスターシリンダー上部に大きく鎮座していた、表示部&制御部は、表示部はスマートフォンに、制御部はシート下に収まるように進化しました。
LCDと違い、視野角が非常に広いスマートフォンはいつどの角度で見ても見やすく、電源も別途用意せずに済むのでいいことづくめです。
本当にやりたいことができてきたので、旅Arduinoは
完成
とします。
ここまで非常に長い記事を見ていただけた皆様、本当にありがとうございました。
皆様の役に立てたら幸いです。
その1-不満点を挙げよう-
その2-不満点をまとめよう-
その3-電圧測定器を作る-
その4-温湿度計を作る-
その5-気圧計を作る-
その6-方位・高度計をGPSで-
その7-12Vバッテリーから電力供給
その8-Ver1作成-
その9-電圧計の誤差とその代替案-
その10-Ver2へアップデート-
その11-LCDをI2Cで制御しよう-
その12-LCDをI2C化-
その13-Ver3へアップデート-
その14-USB充電の仕様に関して-
その15-Arduino言語を用いながらBluetoothで通信できるESP32-
その16-旅Arduino Ver4 スマホアプリ化-
この記事へのコメントはありません。