本帖最后由 dvacos 于 2024-7-18 17:56 编辑
高级任务第二步 Web Ble滑条灯实现
上一篇文章,已经通过蓝牙完成了数据收发。本文是在收发数据的基础上添加功能,打算做一个用蓝牙控制的调光灯,将接收过来的PWM值设置到灯上,完成调光功能。解决了床上不想动,却要调光、开光灯的问题,科技的第一推动力就是懒!!
既然要和开发板的蓝牙通讯,最先想到的就是写个APP 或者 小程序,这两者一个是要安装应用,一个是必须打开微信,很是麻烦。所以选择用WEB BLE!!!
因为web天生跨平台的特性,一套代码可以在手机电脑上使用,并且不需要安装APP,包装为PWA应用就可以固定在桌面(安卓手机,IOS未知),十分的方便啊!! 虽然目前WEB BLE是虽然 Web Bluetooth API 规范尚未最终确定,只是测试、实验版本。但是就目前已有的API足够我们使用了,可以实现我们想要的调光功能。
一、WEB BLE 入门学习
1、入门资料
谷歌的WEB BLE相关文档:
链接:https://developer.chrome.google.cn/docs/capabilities/bluetooth?hl=zh-cn
文档内有代码解析,解释很详细,跟着改文档一步步操作就可以实现WEB BLE 接收设备Notify数据 和 写数据给设备了。如下:
由于本人就是学习了几天的初学者,想学习WEB BLE的建议大家直接看谷歌的文档。JavaScript有太多太多的API 方法了,同一种功能有一堆API 方法。
2、我的WEB BLE
上图是PC端的截图,与最后的演示的手机端不一样。
二、调光灯实现
蓝牙的工程并没有看见While(1),在main的最下方可以看见,使用了RTOS来调度任务 与 蓝牙协议栈。
本人之前没有使用过RTOS,都是时间片+状态机来实现任务的,因为做的产品都是实时性要求不高的设备,所以对RTOS只有基本的认知,没有实际的上手过。
所以下面我就没有去创建新的任务,直接魔改了RGB的任务。以下就是我的一些思路:
1、RGB任务回调修改
RGB任务申请空间 与 创建任务(确定回调函数、优先级等)
所以跳转到回调函数“task_rgb_led”里,看到了RGB灯的逻辑,看懂后修改为以下
void task_rgb_led(void* param)
{
cyhal_pwm_t pwm_led_control;
BaseType_t rtos_api_result = pdFAIL;
rgb_led_command_data_t rgb_led_cmd_data;
cy_rslt_t cy_result = CY_RSLT_SUCCESS;
/* Suppress warning for unused parameter */
(void)param;
cyhal_pwm_init(&pwm_led_control, CYBSP_USER_LED, NULL);
for(;;)
{
/* Block until a command has been received over queue */
rtos_api_result = xQueueReceive(rgb_led_command_data_q, &rgb_led_cmd_data,portMAX_DELAY);
/* Command has been received from queue */
if(pdPASS == rtos_api_result)
{
cyhal_pwm_set_duty_cycle(&pwm_led_control, 100-rgb_led_cmd_data.green ,100000);
cyhal_pwm_start(&pwm_led_control);
}
蓝牙接收的数据会通过,以下代码赋值给rgb_led_cmd_data,这个结构体,这样就可以取出蓝牙发送的数据了rtos_api_result = xQueueReceive(rgb_led_command_data_q, &rgb_led_cmd_data,portMAX_DELAY);
其他的就是基本的设置PWM的API了。
2、蓝牙数据转发
上篇文章已经详细的描述了数据收发的实现了,此处是主要描写的是:在RTOS的框架下,如何将蓝牙接到的数据转发到任务回调中(不乱改,不直接使用全局变量)
<div class="blockcode"><blockquote>case HDLC_MY_TEST_CUSTOM_CHARACTERISTIC_VALUE:{
wiced_bt_gatt_server_send_notification(0,HDLC_MY_TEST_CUSTOM_CHARACTERISTIC_VALUE,len,&p_val[0],NULL);
led_cmd_data.green= p_val[0];
led_cmd_data.brightness = p_val[0];
led_cmd_data.red= p_val[0];
led_cmd_data.blue = p_val[0];
xQueueSendToBack(rgb_led_command_data_q, &led_cmd_data, 0u);
}
break;
实验后我发现,必须要把led_cmd_data这个结构体的4字节数据都赋值后,调用“xQueueSendToBack”才能触发回调,所以我就赋值了4个数据。
查询互联网后,了解到与初始化时的
rgb_led_command_data_q = xQueueCreate(SINGLE_ELEMENT_QUEUE,sizeof(rgb_led_command_data_t));
有关,于是我把“sizeof(rgb_led_command_data_t)”改为1,发现1字节数据还是不能触发,我就展示放弃了,回头再尝试,或者各位大佬教一下!
三、实验效果
GIF如下:
WEB BLE连接后通过滑条控制灯的亮度。
|