ST에서 제공하는 ST BLE Sensor 앱을 이용하여 LED제어 Service로 BLE 램프 제어를 해보자.
ST BLE Sensor 앱의 LED Sevice를 등록하고 BLE로 전송되는 데이터를 처리 하는 콜백 함수에서 GPIO 로 릴레이를 제어 해서 램프를 On/Off 하는 코드를 작성 할 수 있다.
#include "Arduino.h"
#include "BLE.h"
#define LED_BUILTIN 10
typedef struct __attribute__((packed)) {
uint16_t timestamp;
uint8_t led;
} blue_st_led_t;
blue_st_led_t ledFeature;
BLEService sensorService("00000000-0001-11e1-9ab4-0002a5d5c51b");
BLECharacteristic ledCharacteristic("20000000-0001-11e1-ac36-0002a5d5c51b", (BLE_PROPERTY_READ | BLE_PROPERTY_NOTIFY), ledFeature);
BLEService commandService("00000000-000F-11e1-9ab4-0002a5d5c51b");
BLECharacteristic commandCharacteristic("00000002-000F-11e1-ac36-0002a5d5c51b", (BLE_PROPERTY_WRITE | BLE_PROPERTY_NOTIFY), 0, 20, true);
static const uint8_t manufacturer_data[6] = {
0x01,
0x00,
(uint8_t)(0x20000000 >> 24),
(uint8_t)(0x20000000 >> 16),
(uint8_t)(0x20000000 >> 8),
(uint8_t)(0x20000000 >> 0),
};
void subscribedCallback() {
if (ledCharacteristic.subscribed()) {
ledCharacteristic.writeValue(ledFeature);
}
}
void commandCallback() {
uint8_t data[20];
uint32_t feature;
if (commandCharacteristic.written()) {
commandCharacteristic.getValue(data, sizeof(data));
feature = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3] << 0);
if (feature == 0x20000000) {
if (ledFeature.led != (data[4] & 1)) {
ledFeature.timestamp = millis() / 8;
ledFeature.led = (data[4] & 1);
digitalWrite(LED_BUILTIN, (ledFeature.led != 0));
Serial.print(ledFeature.led, HEX);
ledCharacteristic.writeValue(ledFeature);
}
}
}
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, (ledFeature.led != 0));
Serial.begin(115200);
while (!Serial) { }
BLE.begin();
BLE.setIncludeTxPowerLevel(true);
BLE.setLocalName("STM32WB");
BLE.setManufacturerData(manufacturer_data, sizeof(manufacturer_data));
sensorService.addCharacteristic(ledCharacteristic);
BLE.addService(sensorService);
commandService.addCharacteristic(commandCharacteristic);
BLE.addService(commandService);
ledCharacteristic.onSubscribed(subscribedCallback);
commandCharacteristic.onWritten(commandCallback);
BLE.advertise();
delay(1000);
}
void loop()
{
if (!BLE.advertising() && !BLE.connected()) {
BLE.advertise();
}
delay(2000);
}
프로그램 다운로드 후 ST BLE Sensor앱에서 접속하면 Switch 서비스가 인식되는 것을 확인 할 수 있다.
스위치를 On/Off 할때 콜백함수가 수행되고 GPIO로 릴레이를 제어해서 220V에 연결되어 있는 램프가 제어 되는것을 확인 할 수 있다.
반응형