[i=s] 本帖最后由 大锤子 于 2025-5-1 22:06 编辑 [/i]
前边的文章入门了蓝牙的基本知识,和回调函数。这次实现蓝牙控制LED灯。
1、通过蓝色LED灯闪烁状态指示蓝牙的链接状态;
2、链接后,控制红色LED灯的亮灭;
创建工程
这里直接复制 /Ai-Thinker-WB2/applications/bluetooth 目录下的 ble_slave 工程,重命名为ble_slave_led。
编译,烧录验证工程的正确;然后在该工程的基础上添加需要的功能;
添加灯闪烁任务
在目录 /Ai-Thinker-WB2/applications/bluetooth/ble_slave_led/ble_slave_led 目录下添加两个文件:
led.c 和 led.h
led.h
#ifndef __LED_H_
#define __LED_H_
void blink_test(void *param);
#endif // !__LED_H_
led.c
#include <stdio.h>
#include <string.h>
#include <FreeRTOS.h>
#include <task.h>
#include <bl_gpio.h>
#include "led.h"
#define GPIO_LED_PIN 3
void blink_test(void *param)
{
uint8_t value = 1;
while (1)
{
bl_gpio_enable_output(GPIO_LED_PIN, 0, 0);
printf("Turning the LED %s! \r\n", value == 1 ? "ON" : "OFF");
bl_gpio_output_set(GPIO_LED_PIN, value);
value = !value;
vTaskDelay(1000);
}
}
在main.c 文件中添加led 闪烁任务:
void main()
{
bl_sys_init();
puts("[OS] proc_main_entry task...\r\n");
xTaskCreate(TaskUart, "TaskUart", 2048, NULL, 15, NULL);
xTaskCreate(proc_main_entry, (char *)"main_entry", 1024, NULL, 15, NULL);
xTaskCreate(blink_test, "blink", 1024, NULL, 15, NULL);
}
这一步完成之后我们将得到一个带有蓝色LED闪烁的蓝牙slave程序。
接下来我们添加LED 指示程序:
当蓝牙链接成功LED停止闪烁;当断开链接LED重新开始闪烁;
添加LED状态指示代码
由于demo中使用了FreeRTOS, 上一步添加的灯闪烁程序是创建了一个FreeRTOS任务。 需要通过任务间通信的方式实现。在链接成功后发送消息给闪灯程序暂停闪灯。 如果断开链接发送消息开始闪灯;
在上一步中创建LED闪烁任务时没有指定闪烁任务句柄。 也就没法控制任务的运行状态。
声明任务句柄
在led.h 中声明一个任务句柄变量,通过句柄来控制任务的运行状态。

创建任务指定句柄
根据FreeRTOS的api 在创建任务时,最后一个参数就是所创建任务的句柄;

使用句柄来控制任务
在链接成功的回调函数中挂起任务

在断开链接的回调函数中重新唤醒任务

添加LED控制代码
添加LED控制代码:

特性写回调函数中实现控制LED功能;
功能演示