[ST_MICRO]/STM32WB

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

nexp 2023. 10. 3. 12:54

 

 

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

 

반응형