본문 바로가기

[ST_MICRO]/STM32WB

STM32WB55 SSM - Arduino BLE 램프제어 테스트

 

 

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에 연결되어 있는 램프가 제어 되는것을 확인 할 수 있다.

 

반응형