概要
ESP32 の開発ボードにはブートボタンとリフレッシュボタンが実装されていることがよくあります
今回はそれらのビルトインのボタンを利用してボタンが押されたときに BLE の notify 情報を送信するようなデバイスを作成してみたいと思います
基本的にはブートピン (0 ピン)が 1 になったときを見れば OK です
環境
- macOS 11.6
- Arduino IDE 1.8.16
- ESP-WROOM-32 devkitc v4
スケッチ
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint32_t value = 255;
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
void onButton() {
// sedning integer 255 via notify
pCharacteristic->setValue((uint8_t*)&value, 4);
pCharacteristic->notify();
}
void setup() {
Serial.begin(115200);
pinMode(0, INPUT_PULLUP);
// Create the BLE Device
BLEDevice::init("ESP32");
// Create the BLE Server
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
// Create the BLE Service
BLEService *pService = pServer->createService(SERVICE_UUID);
// Create a BLE Characteristic
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY |
BLECharacteristic::PROPERTY_INDICATE
);
pCharacteristic->addDescriptor(new BLE2902());
// Start the service
pService->start();
// Start advertising
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(false);
pAdvertising->setMinPreferred(0x0); // set value to 0x00 to not advertise this parameter
BLEDevice::startAdvertising();
Serial.println("Waiting a client connection to notify...");
}
void loop() {
// notify value no button pushed
if (deviceConnected) {
static uint8_t lastPinState = 1;
uint8_t pinState = digitalRead(0);
if (!pinState && lastPinState) {
onButton();
}
lastPinState = pinState;
}
// disconnecting
if (!deviceConnected && oldDeviceConnected) {
delay(500); // give the bluetooth stack the chance to get things ready
pServer->startAdvertising(); // restart advertising
Serial.println("start advertising");
oldDeviceConnected = deviceConnected;
}
// connecting
if (deviceConnected && !oldDeviceConnected) {
// do stuff here on connecting
oldDeviceConnected = deviceConnected;
}
}
解説
pinMode(0, INPUT_PULLUP);
でブートピンの状態を読み込めるようにします
0 ピンの最後の状態と今の状態が異なっていたら onButton 関数をコールします
onButton 関数では setup で作成した pCharacteristic を使って notify します
notify する値は FF (255) を送信します
動作確認
LightBlue を使って確認します
ESP32 に接続して notify サービスを選択します そしてlisten for notification の状態にしてブートボタンを押してみると FF のデータが取得できるのが確認できると思います