发帖
0 0 0

【WB2蓝牙学习-3】实现链接状态指示

大锤子
金牌会员

7

主题

22

回帖

2635

积分

金牌会员

积分
2635
Ai-WB2系列 6 0 昨天 22:06
[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 中声明一个任务句柄变量,通过句柄来控制任务的运行状态。

image.png

创建任务指定句柄

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

image.png

使用句柄来控制任务

在链接成功的回调函数中挂起任务

image.png

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

image.png

添加LED控制代码

添加LED控制代码:

image.png

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

功能演示

──── 0人觉得很赞 ────

使用道具 举报

您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 28629 个
  • 话题数: 40798 篇