ArduinoManagerを使って携帯定規を作る

先日紹介したArduino ManagerのESP32BLEでの実践例を紹介します。
本当は超音波距離センサモジュールで携帯巻き尺レベルが欲しかったのですが
不良品を掴んでしまいとりあえず断念、次回実装予定のVL53L0Xを使った短距離測長機を
作成してみました。
![image1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255936/f29f5c9b-a486-1aea-ffa1-3229a39a29cf.jpeg)


#必要なリソース
　Arduino Managerを使う為のIOSControllerESP32BLEをセットアップしたPC。
　iPhone / iPad   (手元にAndroidが無いので・・・
　下に掲載しているソース
　ESP32S　　(USBコネクタで電源供給が可能なタイプ)
　モバイルバッテリー
　USBケーブル

#準備：Arduino ManagerにWigetsを登録する
　下の４種のWigetsを登録します。　各Wigetsには同じ名称を付けます
　Text Field
　Display
　Gauge
　Console

#準備：ESP32の配線する
　ESP32にVL53L0Xを接続します。
　VL53L0XはI2CのセンサなのでSDA・SCL・VCC・GNDを繋ぐだけで済みます。
　USBコネクタ付きは他の配線も不要なのでお気楽であります。

#準備：ソフトアップロード
　ESP32に下にあるソフトをアップロードします。

#動作：動いた!
　ESP32に電源供給をすると、BLEの端末として検出可能になります。
　ArduinoManagerにてSCANすると検出できるので接続しましょう。
　DisplayのWigetsにｃｍ表記で寸法が表示されます。
![image0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255936/9eb878ff-9d14-b265-cd66-a04e86f8aea8.png)


```ino:ArduinoManagerESP32BLE.ino:
#include "IOSControllerESP32Ble.h"
IOSControllerESP32Ble iosController(&doWork, &doSync, &processIncomingMessages, &processOutgoingMessages, &processAlarms, &deviceConnected, &deviceDisconnected);
#include <Wire.h>
#include <VL53L0X.h>

VL53L0X VL53L0X_1;

float distance;
float powerOnTime;
unsigned long lastPowerOnTimeMillis = 0;
// ArduinoIDE 初期処理
void setup() {
  Serial.begin(115200);
  iosController.begin();
  powerOnTime = 0;
  Serial.println("start");
  Wire.begin();
  VL53L0X_1.init();
  VL53L0X_1.setTimeout(500);

#if defined LONG_RANGE
  // lower the return signal rate limit (default is 0.25 MCPS)
  VL53L0X_1.setSignalRateLimit(0.1);
  // increase laser pulse periods (defaults are 14 and 10 PCLKs)
  VL53L0X_1.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  VL53L0X_1.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif

#if defined HIGH_SPEED
  // reduce timing budget to 20 ms (default is about 33 ms)
  VL53L0X_1.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
  // increase timing budget to 200 ms
  VL53L0X_1.setMeasurementTimingBudget(200000);
#endif
}
// ArduinoIDE 平常のループ
void loop() {
  iosController.loop();
}
// ESP32BLE 端末との接続イベント
void deviceConnected () {
  Serial.println("* Device connected");
}
// ESP32BLE 平常のループ(ArduinoIDEとの差異は不明)
void doWork() {
  if( (millis() - lastPowerOnTimeMillis) > 1000 ) {
    lastPowerOnTimeMillis = millis();
    powerOnTime = lastPowerOnTimeMillis / 1000;
    distance = ((float)VL53L0X_1.readRangeSingleMillimeters())*0.1;
    Serial.println( distance );
  }
}
// ESP32BLE 端末のWigets(variable)より現状値の問い合わせ
//          ※端末との接続時にWigetsの表示を同期していると思われます。
void doSync (char *variable) {
  Serial.print("Sync "); Serial.println(variable);
  if (strcmp(variable, "Text Field") == 0) {
    iosController.writeTxtMessage("Text Field", "Distance");
  }
}
// ESP32BLE 端末のWigets(variable)より現状値(value)の通知
//          ※端末側でボタン・スイッチ・スライダ等変更すると通知されます。
void processIncomingMessages(char *variable, char *value) {
  Serial.print("in: ");  Serial.print(variable);  Serial.print(" ");  Serial.println(value);
  iosController.log("in: ");
  iosController.log(variable);
  iosController.log(" ");
  iosController.logLn(value);
}
// ESP32BLE 端末のWigetsへ現状値の通知
//          ※ESP32機器側での変化を端末のWigetsに通知します。
void processOutgoingMessages() {
  iosController.writeMessage("Display", distance);
  iosController.writeMessage("Gauge", distance);
}
// ESP32BLE 端末との接続が切れた通知
void deviceDisconnected () {
  Serial.println("* Device disconnected");
}
// ESP32BLE アラーム  ***不明
void processAlarms(char *alarm) {
  Serial.print(alarm);
  Serial.println(" fired");
}
```

あとがき
　単機能だと出番は少なそうだけども、I2Cセンサをテンコ盛りで繋いだ
　小パッケージの多機能機は出張等に持ち運ぶのは良いかもしれない。