查看: 804|回复: 0
打印 上一主题 下一主题

【Arch BLE学习笔记】07.蓝牙控制LED灯开关

[复制链接] qrcode

36

主题

40

帖子

121

积分

注册会员

Rank: 2

积分
121
楼主
跳转到指定楼层
发表于 2015-12-27 12:04 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先感谢坛友shaoziyang,经他提醒才知道mbed支持虚拟串口,这样就省的调试时还要拖个串口线了,mbed虚拟串口
驱动下载链接:https://developer.mbed.org/handbook/Windows-serial-configuration

本次实验主要是通过手机蓝牙来控制led灯的开关。在官方wiki上,有个手机蓝牙控制RGB的例程,不过这个指定的RGB售
价不菲,这里将官方例程改造下,控制一个普通的led开和关。

1.硬件原理
控制p10脚外接的led灯

2.源代码
修改官方BLE Color Pixels例程中main函数:
/* BLE Color Pixels
 */

#include "mbed.h"
#include "BLEDevice.h"
#include "UARTService.h"
#include "color_pixels.h"

#define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
                               * it will have an impact on code-size and power consumption. */

#if NEED_CONSOLE_OUTPUT
Serial  pc(USBTX, USBRX);
#define DEBUG(...) { pc.printf(__VA_ARGS__); }
#else
#define DEBUG(...) /* nothing */
#endif /* #if NEED_CONSOLE_OUTPUT */

ColorPixels pixels(1, 32);

BLEDevice  ble;
DigitalOut led1(LED1);
DigitalOut myled(p10); //add for my test

UARTService *uartServicePtr;
 

void processPacket(uint8_t *packet)
{
    uint8_t red = packet[0];
    uint8_t green = packet[1];
    uint8_t blue = packet[2];
    
    uint8_t mode = packet[3];
    
    uint8_t number = packet[4] - 1;
    
    //mode = mode & 1;
    
    DEBUG("r: %d, g: %d, b: %d, mode: %dnr", red, green, blue, mode);
    
    if (mode == 0) {
        pixels.set_color(number, red, green, blue);
        pixels.update();
        myled = 0;  //add for test
    } else if (mode == 1) {
        for (int i = 0; i < 32; i++) {
            pixels.set_color(i, red, green, blue);
        }
        pixels.update();
        myled = 1;  //add for test
    } else if (mode == 2) {

    } else {
        
    }
    
}

void disconnectionCallback(Gap::Handle_t handle, Gap:isconnectionReason_t reason)
{
    DEBUG("Disconnected!nr");
    
    DEBUG("Restarting the advertising processnr");
    ble.startAdvertising();
}

void onDataWritten(const GattCharacteristicWriteCBParams *params)
{
    if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) {
        uint16_t bytesRead = params->len;
        DEBUG("received %u bytesnr", bytesRead);
        ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead);
        processPacket((uint8_t *)params->data);
    }
}

void periodicCallback(void)
{
    led1 = !led1; /* Do blinky on LED1 while we\'re waiting for BLE events */
}

int main(void)
{
    led1 = 1;
    Ticker ticker;
    ticker.attach(periodicCallback, 1);
    
    pixels.clear();
    pixels.set_color(0, 255, 0, 0);
    pixels.set_color(0, 0, 255, 0);
    pixels.set_color(0, 0, 0, 255);
    pixels.update();

    DEBUG("Initialising the nRF51822nr");
    ble.init();
    ble.onDisconnection(disconnectionCallback);
    ble.onDataWritten(onDataWritten);
 
    /* setup advertising */
    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
    ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
    ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
                                     (const uint8_t *)"Color Pixels", sizeof("Color Pixels") - 1);
    ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
                                     (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
 
    ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(1000));
    ble.startAdvertising();
 
    UARTService uartService(ble);
    uartServicePtr = &uartService;
 
    while (true) {
        ble.waitForEvent();
    }
}

其他保持不变,编译后烧写进开发板中


3.下载手机APP
在官方wiki中有下载连接,手机安装后如下:



点击connect,连接开发板。

然后点击屏幕上方进行模式切换(就是带有圆圈的1那里),可以控制LED开和关。
模式0:关掉LED
模式1:开启LED

运行效果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表