首先感谢坛友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
运行效果如下:
|