ESP32 BLE経由で温度を通知

ESP32のBLE環境の構築が終わったのでBLEライブラリを使ってみる

ベースにするのは、スケッチ例 の”BLE_notify”

やってみる事

  • ボタンを押すと温度センサの値をBLE経由でスマホに”Notify”で通知する
  • 送信中にLEDを光らせる

ハードウエア構成

  • Seeed StudioのGrove Starter kit for Arduinoを使って半田付けなしで構成する
  • 使用するモジュール

    • Base Shield (VCC SWは3.3Vに設定)
    • Grove_Temperature Sensor (A0に接続)
    • Grove_Button (D8に接続)
    • Grove_LED (D4に接続)

IMG_2026

 

スケッチの修正内容 (サンプルスケッチのダウンロードはこちら)

  • Unopuino32ピン配置を記載したヘッダファイルを”スケッチ”->”ファイル追加”でスケッチに追加
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

// Include Unopuino32 pin definition
#include "Unopuino32.h"
  • UUIDを”environmental_sensing”, “temperature”に変更
# define SERVICE_UUID "0000181a-0000-1000-8000-00805f9b34fb" // org.bluetooth.service.environmental_sensing 
# define CHARACTERISTIC_UUID "00002a6e-0000-1000-8000-00805f9b34fb" // org.bluetooth.characteristic.temperature
  • 接続したGroveモジュールのピン番号を指定
const int inputButton = GP8; // IO12
const int outputLed = GP4; // IO18
const int pinTemp = AD0; // pin of temperature sensor
  • ボタン状態の判定及び温度検出用の変数を定義
bool outputState = true;  // 出力状態フラグ
unsigned long t = 0; // Time

float temperature;
int B=3975; // B value of the thermistor
float resistance;
  • setup()関数のBLE初期化関数でPeripheralで表示する名前を指定
void setup() {
 Serial.begin(115200);

// Create the BLE Device
 BLEDevice::init("Unopuino32s");

// Create the BLE Server
 BLEServer *pServer = BLEDevice::createServer();
 pServer->setCallbacks(new MyServerCallbacks());
  • setup()関数にボタン及びLEDのpinMode設定を追加
pinMode(outputLed, OUTPUT);
pinMode(inputButton, INPUT);
  • loop()関数を以下に変更
void loop() {
  uint8_t data_buff[2];  // データ通知用バッファ

  int val = analogRead(pinTemp); // get analog value
  resistance=(float)(4095-val)*10000/val; // get resistance (12bit AD)
  temperature=1/(log(resistance/10000)/B+1/298.15)-273.15; // calc temperature

  // デバイスが接続された時の処理
  if(deviceConnected){
    // ボタンが押された時の処理
    if (digitalRead(inputButton) == HIGH) {
      // チャタリング防止
      if (!outputState && millis() - t >= 1000) {
        digitalWrite(outputLed, HIGH);
        outputState = true;
        Serial.println(temperature);
        // 値を設定してNotifyを発行
        data_buff[0] = (int16_t)(temperature * 100.0) & 0xff;
        data_buff[1] = ((int16_t)(temperature * 100.0) >> 8);
        Serial.printf("*** NOTIFY: %d, %d ***\n", data_buff[0], data_buff[1]);
        pCharacteristic->setValue(data_buff, 2);
        pCharacteristic->notify();
        t = millis();
      }
    }else{
      digitalWrite(outputLed, LOW);  // 送信後LEDを消灯
      outputState = false;
    }
  }
  delay(10);
}

スマートフォンへのBLEスキャナのインストール

  • iPhone: “LightBlue”
  • Android: “nRF connect”

BLEスキャナで通知を受信 (“nRF connect”の例)

  • PeripheralをスキャンしてESP32(上記例では”Unopuino32s”)に接続する

nordicsemi.android.mcp

  • “Environmental Sensing”を開き、”Temperature”で”Notifications enabled”にする

nordicsemi_notification_enable

  • Grove_Buttonボタンを押すと温度が通知される

nordicsemi_notification_temperature

参考

Yengawa Lab さんの”BLEスタートアップ”

https://sites.google.com/view/ble-startup/

1件のコメント

コメントは停止中です。