单片机---HLK-W801蓝牙遥控点灯

发布者:创新思绪最新更新时间:2022-08-01 来源: csdn关键字:单片机 手机看文章 扫描二维码
随时随地手机看文章

昨天吧demo运行明白了,今天那就来看一下手机通过蓝牙远程遥控点亮开发板的LED吧,虽然这并不是低功耗蓝牙的典型用法,但是通过这种手段,能够快速学习一下W801这套恶心的SDK代码,也算是一种福报。嚯,正好这个芯片是阿里生产的,这不是正应了马老的一句话么。


调试工具

这里用的手机蓝牙调试工具叫nRF connect。应用商店也可以搜索BLE,就能搜索到很多蓝牙开发的工具,不过都会各种申请手机权限,定位啊,相册啊,不允许就没法用,简直就是流氓行为,这国家早就说过了这种问题,无奈就是没办法啊。


不过这款软件倒是挺好的,没有申请什么权限

直接就可以使用。让人感动。


自动启动server

原有的demo中,我们知道了需要让开发板自动运行成为BLE的server,需要两部分


开启蓝牙

以server运行

核心的代码就这两个函数


demo_bt_enable();

demo_ble_server_on();


不过你想要干净的将这两个函数的实现复制到你的主函数文件中,那还是想多了,里面用了一些的全局变量,例如打印等级,或者adapter状态。


所以,你干脆,人家给你造了一套代码,你干嘛还想自己写,就直接用它的demo代码,直接在包含好所有的头文件,然后调用这两个函数,就完事了。

所以主要代码就这样写


demo_bt_enable();

while(bt_adapter_state == WM_BT_STATE_OFF)

{

tls_os_time_delay(5000 /HZ);

}

tls_os_time_delay(5000 /HZ);

demo_ble_server_on();


就能够让开发板以server身份运行起来了。简单吧


接收命令

这里就需要找到BLE server接收命令的地方,就在这个函数当中


static int gatt_svr_chr_demo_access_func(uint16_t conn_handle, uint16_t attr_handle,         struct ble_gatt_access_ctxt *ctxt, void *arg)

{

int i = 0;

struct os_mbuf *om = ctxt->om;


switch (ctxt->op) 

{

case BLE_GATT_ACCESS_OP_WRITE_CHR:

while(om) 

{

if(g_ble_uart_output_fptr)

{

g_ble_uart_output_fptr((uint8_t *)om->om_data, om->om_len);

}

else

{

print_bytes(om->om_data, om->om_len); 

}

om = SLIST_NEXT(om, om_next);

}

return 0;

default:

assert(0);

return BLE_ATT_ERR_UNLIKELY;

}

}


其中它指明了一个逻辑,就是如果没有输出函数指针g_ble_uart_output_fptr,那么就自动打印出来,找到了接收消息的地方就办了。我们就已经可以将数据或者命令通过蓝牙,从手机发送到开发板了。


消息传输

这里为了将我们的代码稍微独立出来一点,用了一个消息队列queue,将蓝牙收到的命令,通过queue发送到我的主任务当中,这部分放在主函数文件中,那么以后就直接在这里修改需求,不必再关心消息传递过程了。


主函数中创建队列,并启动监控接收任务


if(tls_os_queue_create(&MyBLE_QUEUE, 32)!=TLS_OS_SUCCESS)

{

printf("create queue failn");

return;

}

tls_os_task_create(NULL, NULL,

                       my_ble_msg_task,

                       NULL,

                       (void *)MyBLETaskStk,          /* task's stack start address */

                       MyBLE_TASK_SIZE * sizeof(u32), /* task's stack size, unit:byte */

                       MyBLE_TASK_PRIO,

                       0);


消息接收任务


void my_ble_msg_task(void *sdata)

{

void *msg;


for(;;)

{

tls_os_queue_receive(MyBLE_QUEUE, (void **)&msg, 0, 0);

printf("myble revice %ld n",(u32)msg);

}

}


将前面的输出打印,替换为发送消息,我们目前只取第一个字节,足够传递信息了。


//print_bytes(om->om_data, om->om_len); 

if(om->om_len>0)

{

tls_os_queue_send(MyBLE_QUEUE, (void *)(om->om_data[0]), 0);

}


这样,启动之后,消息自动就会发送到我这个任务中来,我们就只专心处理这个消息即可。


消息处理

这里将消息转化为控制LED的亮灭,达到了测试效果

这里只要控制GPIO输出低电平,就可以点亮LED,输出高电平就熄灭。

点亮过程。


tls_gpio_cfg(MyLED1_IO, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);

tls_gpio_write(MyLED1_IO,0);


整体测试

首先运行开发板,等待server状态启动。

然后手机打开测试工具,扫描到开发板,连接上

然后点击上箭头,进行数据发送

发送0,可以控制led点亮

开发板被点亮了

发送1过去,开发板熄灭。


完事。


补充说明

这套SDK,把FreeRTOS原有的内容,加以了封装,例如


//消息队列

 tls_os_status_t tls_os_queue_create(tls_os_queue_t **queue, u32 queue_size)

 //任务创建

 tls_os_status_t tls_os_task_create(tls_os_task_t *task,

      const char* name,

      void (*entry)(void* param),

      void* param,

      u8 *stk_start,

      u32 stk_size,

      u32 prio,

      u32 flag)

//延迟

 void tls_os_time_delay(u32 ticks)


这套明明,也是没看出来有啥好的,搞得总和tls加密联系起来,其实没有半毛钱关系


可以用它封装好的代码,例如我上面用到的消息队列。这样可以使代码显得干净,也可以用freeRTOS原有的功能,没有本质的区别,就看你喜好了。

关键字:单片机 引用地址:单片机---HLK-W801蓝牙遥控点灯

上一篇:单片机---HLK-W801移植Nes模拟器(一)
下一篇:单片机---HLK-W801蓝牙BLE功能测试

推荐阅读最新更新时间:2024-11-11 17:41

51单片机原理及应用
  51单片机是一种基于哈弗(Harvard)结构设计的8位单片机,也叫做AT89C51。它由Intel公司在1980年代初推出,成为当时最受欢迎的单片机之一,至今仍广泛应用于各种嵌入式系统中。   51单片机的架构包括CPU、内存、IO口、定时器/计数器、串口、中断控制器等模块。其中CPU采用基于8位数据总线、16位地址总线的哈夫结构设计,运行速度一般为12MHz,最高可以达到33MHz。   内存分为程序存储器ROM和数据存储器RAM,ROM存储程序代码,RAM存储数据,它们的容量分别为64KB和128B。IO口包括32个口线,可以进行输入输出操作,其中P0口和P2口还具有外部中断功能。定时器/计数器共有4个,可以进行
[单片机]
基于AT89C51型单片机的智能化数控调谐文氏电桥陷波器系统设计与实现
1 引言 测量非线性失真一般采用基波抑制法(单音法),可通过基波抑制网络来实现。基波抑制网络即陷波滤波器,可将基波电压分量滤除。常见的有文氏电桥组成的RC陷波电路和双T形电桥组成的陷波电路。 高性能的失真度测量仪必须使用高性能的陷渡器,它应能完全滤除基波而不衰减其他谐波。新式失真度测量仪产生的基波衰减或陷波深度可达100 dB甚至更大,而对谐波只产生l dB或更小的衰减。要获得这样高的性能,需要Q值很高的滤波器,而且调谐必须非常准确,通常采用的手动调谐几乎无法实现。高性能的失真度测量仪可以自动调谐到基频,其偏差只有百分之几。失真度的测量主要是设计和选择高性能的陷波滤波电路。 文氏电桥陷波器是失真度仪设计中最常用的器件,其基
[单片机]
基于AT89C51型<font color='red'>单片机</font>的智能化数控调谐文氏电桥陷波器系统设计与实现
PIC32单片机在气相色谱仪中应用方案,软硬件协同
1 主要内容 1.1课题的目的及意义 气相色谱仪是一个精密仪器,其用途非常广泛。他广泛用于石油、化工、农药、公安、白酒、环境检测、卫生防疫以及高等院校、科研部门。自1952年世界上第一次创建实用气液色谱法以来,在短短几十年间,气相色谱仪作为现代分析检测仪器的代表,已发展成为一个有相当生产规模的产业, 并形成了具有相当丰富的检测技术知识的学科。通过研究气相色谱仪的发展规律,能给使用者有益的启迪,为有关专业人员的工作带来一定的帮助。 1.2国内的外研究现状 虽然我国的气相色谱仪在短短的二、三十年间得到了长足的发展,但是这个市场的大部分配额还是长期被欧美和日本占据,主要是因为我国的技术指标还没有达到一流国家的水平,还有很多空
[单片机]
PIC32<font color='red'>单片机</font>在气相色谱仪中应用方案,软硬件协同
单片机液晶滚动显示(AT89C51、LCD1602)
一、简介 此电路由AT89C51最小系统和LCD1602液晶模块组成。可实现上线垂直滚动、左右滚动和播放暂停。 二、执行效果 上下滚动 左右滚动 三、代码 /*更多项目私wo!!!*/ #include reg52.h #include string.h #define uchar unsigned char #define uint unsigned int void Initialize_LCD(); void ShowString(uchar,uchar,uchar *); sbit K1 = P3^0; sbit K2 = P3^1; sbit K3 = P3^2; uchar code Prompt
[单片机]
<font color='red'>单片机</font>液晶滚动显示(AT89C51、LCD1602)
ht46f49e单片机外部电路和端口的体系结构讲解
通过 单片机 简介中单片机功能简述的学习,我们了解到单片机的核心功能可以描述为:能够按照预先设定的功能,依次执行某种操作。这些操作或者向外输送某种控制信息,或者获取某种外部信息,或者进行某种逻辑判断或计算。此外, 单片机 还具有定时器、外部中断等功能,辅助完成复杂的控制过程。 单片机之所以能够完成各种控制功能是和其内部的体系结构设计分不开的。本文将以ht46f49e为例,介绍单片机外部和内部的体系结构。 1.电源电路 电源引脚,包括VDD和VSS,其直流工作电压范围为2.2~5.5V。在电路图中约定和供电相关的符号包括: VCC:C=circuit 表示电路的意思, 即接入电路的电压; VDD:D=device 表示器件的意思
[电源管理]
ht46f49e<font color='red'>单片机</font>外部电路和端口的体系结构讲解
基于单片机的电子钟设计
#include reg51.h #define uchar unsigned char #define uint unsigned int uchar sec = 6, min = 6, hou = 6, a = 0, b = 0, c = 0; uchar num = 0, cmd = 0; uint time = 0; uint flag = 0; sbit P30 = P3^0; sbit P35 = P3^5; sbit P32 = P3^2; sbit P33 = P3^3; uchar code tab ={0xc0, 0xf9, 0xa4, 0xb0, 0x99,
[单片机]
STC单片机74HC595驱动8个数码管
74HC595驱动8个数码管源程序: /*---------------------------------------------------------------------*/ /* --- STC MCU International Limited ----------------------------------*/ /* --- STC 1T Series MCU Demo Programme -------------------------------*/ /* --- Mobile: (86)13922805190 ----------------------------------------*/ /* -
[单片机]
【GD32 MCU入门教程】GD32 MCU GPIO 结构与使用注意事项
1.前言 本文是专门为基于GD32 MCU开发的工程设计人员提供,主要介绍了GPIO的功能配置、内部结构以及在不同场景使用时的注意事项,旨在帮助GD32 MCU开发者优化对通用型输入输出端口(GPIO)的使用,正确快速的使用GD32 MCU进行产品开发。 GPIO,通用型输入输出端口的简称,可以通过软件配置其输出或者输入,GD32 的 GPIO 引脚与外部设备连接,从而实现与外部通信,控制以及信号输入的功能,是 GD32 MCU 中很常见,使用最广泛的模块。 每个 GPIO 引脚可以由软件配置为输出(推挽或开漏)、输入、外设备用功能或者模拟模式。 每个 GPIO 引脚都可以配置为上拉、下拉或浮空模式或无上拉/下拉。 GD32
[单片机]
【GD32 <font color='red'>MCU</font>入门教程】GD32 <font color='red'>MCU</font> GPIO 结构与使用注意事项
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved