打印
[uCOS/RTOS]

【RTOS】RT-Thread创新设计大赛——面向物联网的智能台灯设计

[复制链接]
4276|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 一路向北lm 于 2020-7-3 14:19 编辑


交作品啦...........



面向物联网的智能台灯设计.pdf (2.48 MB)

视频连接:https://www.bilibili.com/video/BV1bk4y1q7oc/
代码托管:https://github.com/code-meng/RT_Thread-


第一部分:板卡评测阶段,之前对东软载波的板卡有过评测这里直接上链接地址
https://bbs.21ic.com/icview-2889120-1-1.html


第一步:开箱 //bbs.21ic.com/icview-2889122-1-1.html
第二步: 认知芯片,便于上手 //bbs.21ic.com/icview-2889130-1-1.html
第三步: iDesigner的安装体验 //bbs.21ic.com/icview-2889140-1-1.html
第四步: 迅速上手//bbs.21ic.com/icview-2889150-1-1.html
第五步: 新建工程(基于Keil 5//bbs.21ic.com/icview-2889208-1-1.html     
第六步: 测试LED、按键 //bbs.21ic.com/icview-2889264-1-1.html   
第七步: 测试串口0 //bbs.21ic.com/icview-2889278-1-1.html
第八步: 测试ADC功能 //bbs.21ic.com/icview-2889606-1-1.html   
第九步: 测试高级控制定时器(AD16C4T)基本定时和产生4路PWM波 //bbs.21ic.com/icview-2889858-1-1.html
第十步:移植RT-Thread到ES32F0654平台 //bbs.21ic.com/icview-2890020-1-1.html
第十一步:测试RT-Thread kprintf  //bbs.21ic.com/icview-2890338-1-1.html  
第十二步:测试RT-Thread +真随机数发生器(TRNG//bbs.21ic.com/icview-2891006-1-1.html
第十三步:测试RT-Thread+硬件加密(CRYPT//bbs.21ic.com/icview-2891048-1-1.html
第十四步:测试RT-Thread+循环冗余校验(CRC//bbs.21ic.com/icview-2891994-1-1.html
第十五步:基于ES32F0654LQ PCB的制作 //bbs.21ic.com/icview-2891172-1-1.html


第二部分:设计方案阶段:

作品简介
   随着时代的进步人们对灯的要求也越来越多,台灯是普遍的家用照明设备之一,为了结合国家的节能环保计划以及产品人性化的要求,本次比赛开发出了一种多功能用途台灯,将智能与节能环保最大化结合。该智能台灯基于多种模块的相互配合,融入了团队智能环保的设计理念,以及人性化的宗旨使可以更加贴心的照顾我们对灯光的需求。智能灯光调节的设计使她拥有最大化保护用户视力的强大功能,通过智能语音云服务用户可以随心所欲的对她进行远程控制与监控,本智能台灯强大的外设模块使它可以实时获取工作时间、外部环境温湿度、光照强度、可燃气体的数据,并将数据实时显示在手机APP页面端让用户可以实时了解近期工作时间,并掌控外界环境的各种变化。同时语音识别控制和无极调光功能的嵌入更加灵敏化了的可操作性。自动调光模式在不同的时间可以通过获取外界环境来自动调整灯光亮度,有利于节能环保。坐姿纠正功能的实现使得用户能够养成良好的学习工作习惯并保护视力。手速调光的新挑战赋予与众不同的亮点,通过手势扫描的速度来调节灯光亮度,在调节灯光的时候还能给用户体验速度的乐趣,让台灯的使用变得更加便捷、有趣。产品智能化、物联化、人性化的设计将带您进入智能家居的美好生活。

研究背景:
   随着现代科学技术的不断发展,生活用品的智能化程度也越来越普及,人们对一些家居物品的人性化、智能化设计要求也越来越高。众所周知台灯作为家庭主要照明工具之一,在现代社会生活中占有重要地位,而且台灯的应用范围非常广泛,适用于各年龄阶段的人群,因此它的市场应用性非常高,具有很好的发展前景。随着青少年近视问题越来越严重,家长越来越重视孩子的视力保护,这使得“无频闪、无眩光”的“护眼台灯”越来越受到家长们的青睐。然而实际上,市面上很多护眼台灯虽然声称“无频闪”,但只是“高频闪”而已。这种更高频的频闪,对眼睛的伤害更大,因为眼睛要非常快速地根据灯光闪动作出反应,长时间使用此种台灯,眼睛更容易疲劳,对视力造成一定伤害。真正无频闪的台灯应该是使用直流电恒流驱动的LED作为发光源,所以本次我们采用的便是 LED灯作为发光源。
如果台灯仅仅具有这些功能,未免太缺乏实用性和创新性。因此,我们通过调查和学习,了解到很多人希望台灯有一些特殊功能,例如:能够通过外界光照自动调节亮度、能够对周边环境检测、能够用手机远程控制台灯、能够让台灯拥有多种工作模式、能够对有害气体的预警、能够让害怕黑夜的孩子晚上安稳入睡等。还有很多生活中我们常常会遇到的问题。一切产品的最终目标都是为人类服务,所以我们团队决定此次比赛我们致力于解决在智能家居类普遍存在的问题,我们也希望通过这次学习能够更好地为人们生活带来便捷,更大程度的实现台灯的人性化、智能化,满足未来智能家居的要求。
研究目的:
    创新来源于生活,一切有价值的创造都将用于提高人们的生活品质。随着现代化社会的不断发展智能物联一体化的创新方向得到了特别的重视,这些方面人们善于开发思想敢于创新,加快了智能化产品的快速发展。台灯作为生活中必不可少的家居用品之一在人们的生活中起着非常重要的作用,尤其对于学生、儿童。但市面上的台灯规格不一种类繁多,为了满足大多数人们的生活要求,我们开始研究了一款符合大众的智能台灯。在一些硬件模块的结合以及一些开发平台的帮助之下让它更具“思想”,能够满足大多数人对于台灯的期望值。
   眼睛是人们心灵的窗户,因此,很多人希望台灯能够很好的保护我们的眼睛。所以借助本次大赛的平台我们团队决定做一款多功能的台灯。当然护眼是它的主要功能之一,我们决定采用直流电恒流驱动的LED作为发光源,以减少频闪对人眼的伤害,同时我们采用光照感应模块采集台灯周围环境亮度用来调节灯光自身亮度减少亮度差。我们通过在身边同学的调查得出很多同学希望现代台灯能够等多的拥有科技感时代感,因此在现在智能化,物联化快速发展的今天我们决定用手机APP远程控制台灯,在APP页面上我们做了很多人性化的设计,比如:模式选择功能、远程控制开关、语音开关、亮度调节、温度时间、工作数据显示等一些好玩的功能。这样的设计一是为了满足现代人对于产品智能化的要求,另一个则是物品人性化设计的理念,更好地提高人们的生活质量。手势调节灯光亮度在现代社会中还没有发展成熟,本次我们努力尝试探索以手速快慢等特定条件来调节灯光强弱,使台灯更具科技感。在现实生活中很多小孩子在早期学习中不能养成良好的坐姿,本次比赛中我们试着实现坐姿纠正的功能,用于培养小孩子的正确坐姿养成良好的学习习惯。还有一些人夜晚睡觉害怕黑暗,所以我们此次加入了小夜灯模式,用几个蓝色发光二极管来发出美丽的蓝光,帮助用户安稳入眠。

作品系统框图:

使用特权

评论回复

相关帖子

来自 2楼
一路向北lm|  楼主 | 2020-6-3 11:10 | 只看该作者
本帖最后由 一路向北lm 于 2020-6-25 10:05 编辑

第二部分:硬件设计

PWM调光电路设计:
        使用东软载波ESP32Fxxx作为主控可以产生多路PWM方波,输出的PWM波通过隔离的光耦进一步驱动MOS开关电路,最终输出24V的PWM放大波形。

       电路分解,整个电路根据光耦可分为两部分:左边为光耦输入部分,也是整个电路PWM信号的输入部分;右边为光耦输出部分,也是电磁阀的驱动部分。这两部分通过光耦隔离,两边的地都不一样。整个电路的工作过程:当光耦没有PWM信号输入时,光耦发光二极管截止,光耦的光电晶体管也是截止状态,Q1是一个NMOS,也处于截止状态,电磁阀没有电流,不工作。当光耦有PWM信号输入时,光耦发光二极管导通,触发光电晶体管也导通。24V电源经电阻R1,光电晶体管的CE极,电阻R3分压使NMOSIRF540N的栅极为高电平,触发MOS管导通,电磁阀线圈有电流流过,电磁阀触发动作。二极管D1为电磁阀的泄放二极管,防止NMOS被高压损坏。电容C1起滤波作用,但同时也会增加MOS管的开关损耗。注意在实际制作时,要注意电磁阀驱动这块,要让MOS管处于开关状态,以免它发热严重。
实物焊接和调试过程:



使用基于RT-Thread工程输出2Hz的方波信号,即是LED灯的翻转操作,具体代码如下,连接的指针万用表依次往复摆动,最终验证了此电路方案的可行性。

#include "board.h"
#include "rtthread.h"

struct rt_thread Task1_thread;
rt_uint8_t rt_task1_thread_stack[1024];

void task1(void *parameter);

int main()
{
  rt_thread_init(&Task1_thread,"task1",
                       task1,RT_NULL,&rt_task1_thread_stack[0],
                       sizeof(rt_task1_thread_stack),5,10);
        rt_thread_startup(&Task1_thread);           
}


//任务1:状态指示
void task1(void *parameter)
{
        while(1)
        {
                LED1_TOGGLE;
                LED2_TOGGLE;
                rt_thread_delay(500);        
                rt_kprintf("任务1正在运行,LED指示正常\r\n\r\n");        
        }  
}
绘制PCB文件如下(家里设备简陋,暂且使用插件元件啦!)


使用特权

评论回复
来自 3楼
一路向北lm|  楼主 | 2020-6-5 21:19 | 只看该作者
本帖最后由 一路向北lm 于 2020-6-10 17:27 编辑

硬件电路之二:主核心板卡电路设计    

   原理图如下所示,主要包括电源模块、Wifi网络模块,ES32-F0654 MCU模块、USB串口模块、DHT11/DHT22 手势感应模块、PWM驱动输出模块等。这些模块构成了一个基于东软载波的板卡的一个拓展板。

设计的PCB文件如下图所示,该PCB可以放置到东软载波ES32板卡上,作为拓展板卡使用。

使用特权

评论回复
来自 4楼
一路向北lm|  楼主 | 2020-6-10 17:11 | 只看该作者
本帖最后由 一路向北lm 于 2020-6-10 17:30 编辑

硬件电路打样焊接:
今天顺丰给我发消息,说有个快递,迫不及待的去领了快递,打开看到了打样的板子。


半个小时过后…………………..,焊接完毕!

焊接的按键PCB板卡

焊接LED-PWM驱动电路

焊接东软载波ES32F0654X扩展板卡

最后来一张全家福,30分钟的成果!

差点忘了,东软载波的核心板哈……….

将ES32F0654X扩展板卡,装到对应的主核心板上,连线,开始测试!


使用特权

评论回复
来自 5楼
一路向北lm|  楼主 | 2020-6-10 17:21 | 只看该作者
本帖最后由 一路向北lm 于 2020-6-10 22:31 编辑

硬件电路调试:
发现了一个低级的错误,ES32F0654x连接到扩展板的串口引脚接反了,瞬间无语啦!赶紧抢救,飞线。
测试uart0 打印RT-Thread代码如下:(需要修改部分代码:之前的Demo是使用USART0,这里改为了Uart0
#include "board.h"
#include "rtthread.h"

struct rt_thread Task1_thread;
rt_uint8_t rt_task1_thread_stack[1024];
void task1(void *parameter);

int main()
{

  rt_kprintf("RT-Thread 设计大赛 & 21ic  ID:一路向北lm  2020-6-10\r\n");        
  rt_thread_init(&Task1_thread,"task1",
                       task1,RT_NULL,&rt_task1_thread_stack[0],
                       sizeof(rt_task1_thread_stack),5,10);
        
        rt_thread_startup(&Task1_thread);        
}
//任务1:状态指示
void task1(void *parameter)
{
        while(1)
        {
                LED1_TOGGLE;
                LED2_TOGGLE;
                rt_thread_delay(500);        
                rt_kprintf("任务1正在运行,LED指示正常\r\n\r\n");        
        }  
}
如果发现uart0发送数据乱码,需要添加(检测发送完成标志位,虽然stm32不需要检测,不然乱码!),这里自己封装了一个Uart发送字节的函数,供RT-Thread调用。
//串口UART0 发送数据 
void UartSendByte(UART_TypeDef *UARTx, uint8_t value)
{
   UARTx->TBR = value; //发送数据
while(READ_BIT(UARTx->SR, UART_SR_TFEM_MSK) == (UART_SR_TFEM_MSK)==0);  //等待发送完毕
}
好了,终于抢救过来了!串口正确打印了RT-Thread 任务信息!

使用特权

评论回复
来自 6楼
一路向北lm|  楼主 | 2020-6-16 11:01 | 只看该作者
本帖最后由 一路向北lm 于 2020-6-25 10:06 编辑

第三部分: RT-Thread的使用情况1:



1.使用RT-Thread的KPrintf 打印功能
//重映串口控制台到rt_kprintf
void rt_hw_console_output(const char *str)
{
   rt_enter_critical();
        while(*str!= '\0')
        {
           if(*str == '\n')
                 {
                         UartSendByte(UART0, '\r');
                          
                 }
                  UartSendByte(UART0, *str++);
        }
        rt_exit_critical();
}

2.在Nano上添加FiniSH组件
RT-ThreadFinSH 是 RT-Thread 的命令行组件(shell),提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信,ES32F0654平台上使用 FinSH 组件基本命令的效果图如下所示:
本设计以串口 UART 0作为 FinSH 的输入输出端口与 PC 进行通信,描述如何在Nano 上实现 FinSH shell 功能。在 RT-Thread Nano 上添加 FinSH 组件,实现 FinSH 功能的步骤主要如下:

1添加 FinSH 源码到工程
01.移植RT-Thread的过程中已经将FinSH组件的代码添加到工程RT-Thread\\RT-Thread-Include\finsh中,只是没有添加到工程中。
02.将对应的源文件添加到工程中,(方便管理,新建一个分组RT-Thread-finsh)全部添加到该分组下。
03. rtconfig中配置,打开finsh功能,打开RT_USING_FINSH宏。

#define   RT_USING_FINSH      //打开finsh功能

04.这里我遇到了一个坑,一直抱错,需要在rtconfig配置中,打开DEVICE,即RTE_USING_DEVICE宏,还需要打开RTE_FINSH_USING_MSH宏。

#define   RTE_USING_DEVICE    //打开DEVICE
#define   RTE_FINSH_USING_MSH
终于没有错误了,made………….快一点了!,不管怎么调试,按、tab键无效果,经过一天多的努力,终于找到原因………..使用RT-Thread源码里面的finsh组件源码,可能是我的RT-ThreadNano版本太老了,使用最新版的Finsh组件源码后,可以正常使用Finsh组件。RT-Thread-Finsh分组下只需要添加三个文件即可,rtconfig中配置,打开finsh功能,打开RTE_FINSH_USING_MSH 宏即可。
实现函数对接
在重映串口控制台到rt_kprintf已经完成控制台的输出,现在我们来实现控制台的输入函数,即char rt_hw_console_getchar(void)函数,具体代码如下:
char rt_hw_console_getchar(void)
{
    int ch = -1;
    if(READ_BIT(UART0->SR,UART_SR_RFNE_MSK) != RESET)
    {
        ch =  UART0->RBR & 0xff;
    }
    return ch;
}
到此,Finsh组件在ES32F0654上可以正常运行啦!………………
这样移植RT-Thread的组件以及后面的软件包太麻烦了,这里我就直接使用RT-Thread官方提供的ENV工具了,点点点即可…………….

使用特权

评论回复
来自 7楼
一路向北lm|  楼主 | 2020-6-16 14:03 | 只看该作者
本帖最后由 一路向北lm 于 2020-6-25 10:06 编辑

第三部分:RT-Thread的使用情况2


使用RT-Thread ENV工具

01.下载ENV工具,https://www.rt-thread.org/page/download.html下载RT-ThreadENV工具和源码。

02.解压RT-Thread的ENV工具,如果使用ENV工具需要准备以下三个原材料:
ENV工具源码(下载解压) 已存在
Git工具,下载,安装,并将安装执行文件路径条件到系统环境变量中 已完成
RT-Thread 源码,其中BSP分组下包含了ES32F654的板卡的支持,可以直接使用ENV图形界面来配置。
RT-Thread的ENV工具打开方式和右键打开方式
双击env.exe 或者env.bat 即可打开直接打开ENV,此方式需要切换路径到需要编译和执行的板卡BSP路径下,这样比较麻烦,可以设置右键打开,这样不管你在哪一个文件夹下都可以使用右键打开ENV,默认就是当前路径了。设置方法如下:
使用ENV开启RT-Thread的控制台输入和控制台输出,这里选择自己设计的PCB板的串口0,具体配置如下:
打开下载的RT-Thread源码,打开BSP文件夹下东软载波的板卡文件夹,选择ES32F0654,输入Menuconfig 打开ENV的主菜单。
将串口0打开,配置为控制台输入和输出的串口,即开启了KPrintf和Finsh组件。
保存,使用命令生成MDK5的工程:Scons –target==mdk5,打开工程,烧录到板卡里,我去,真方便,比我自己在RT-Thread Nano上移植快多了。


使用特权

评论回复
来自 8楼
一路向北lm|  楼主 | 2020-6-16 14:08 | 只看该作者
本帖最后由 一路向北lm 于 2020-6-16 14:09 编辑

使用ENV工具,开启AT组件组件客户端


本次设计需要使用AT指令和ESP-WIFI进行数据交互,需要使用RT-Thread的AT组件,AT组件的实现包括客户端的和服务器两部分。对于本设备而言,更多的情况下设备使用 AT 组件作为客户端连接服务器设备。
01.使用ENV工具,打开ES32F654MCU的串口1,此串口作为AT执行的发送和接收串口,即是和ES-WIFI通讯的端口。
02.使用使用ENV工具,打开AT组件客户端功能。配置完成,保存并退出配置选项,输入命令 scons --target=mdk5 生成 MDK 工程。
打开工程,下载 AT Client 示例代码,添加到打开的 MDK 工程中,如下图所示
编译,烧写到板卡,输入at_client_init uart0,即可初始化串口1用作AT-Client


使用特权

评论回复
来自 9楼
一路向北lm|  楼主 | 2020-6-16 21:31 | 只看该作者
本帖最后由 一路向北lm 于 2020-6-17 11:43 编辑

AT客户端组件连接ES-WIFI测试


1.ES-WIFI恢复到AT指令模式,之前烧写过第三方固件库的一定要操作此步骤:

02.  下载Flash Download Tool 烧录工具http://wiki.ai-thinker.com/esp_download
03.  打开Flash Download Tool,选择ESP8266,选择串口,和波特率,然后选择安信可的AT固件ESP8266 01 是选择8Mbit 的版本,flash地址选择0. 点击start开始烧录
完成后,拔掉GPIO0退出烧写模式,进入Flash程序运行模式;RST接GND复位一次,打开串口即可使用AT命令操作。
AT Client 模式测试


该模式下东软载波ES32F0654开发板串口1 作为 AT Client, ESP-WIFI作为 AT Server,进行数据交互模式,在本地 shell 中输入 at_client_test 命令,该 shell 命令用于发送 AT 命令到服务器,并且接收和解析服务器响应数据,如下图所示过程:
AT Client CLI 模式

ATClient CLI 功能可以转发本地 shell 输入的数据到设备连接的 AT Server 串口设备上,并在本地 shell 上实时显示 AT Client 串口接收到的数据。在本地 shell 中执行 at client 命令进入 AT Client CLI 模式即可进行数据的收发。通过 AT Client CLI 模式,用户可以很方便的完成与 AT Server 的连接与调试,极大的提高开发效率。下图演示了 AT Client CLI 功能的使用和退出:

使用特权

评论回复
来自 10楼
一路向北lm|  楼主 | 2020-6-17 11:41 | 只看该作者
本帖最后由 一路向北lm 于 2020-6-17 11:42 编辑

使用RT-Thread软件包连接到OneNet

终于要连接云了,哈哈哈,好激动!使用ENV对AT设备包和OneNet软件包云进行配置,具体操作如下:
1. env进入RT-Thread onlinepackages -> Iot internet of things -> AT DEVICES:xxxxx -> EspressifESP8266 ,设置需要连接的路由器或者热点的名称和密码,以及设置和ES-WIFI连接的串口等,具体如下图:
2. env进入RT-Thread onlinepackages -> Iot internet of things –> Iot Cloud -> OneNet ,将设备ID、鉴权信息、APIKey、产品ID、产品APIKey填入下图对应的位置。
·        Enable OneNET sample:开启 OneNET 示例代码
·        Enable support MQTT protocol:开启 MQTT 协议连接 OneNET 支持
·        Enable OneNET automaticregister device:开启 OneNET 自动注册设备功能
·        device id:配置云端创建设备时获取的 设备ID
·        auth info:配置云端创建产品时 用户自定义的鉴权信息 (每个产品的每个设备唯一)
·        api key:配置云端创建设备时获取的 APIkey
·        product id:配置云端创建产品时获取的 产品ID

·        master/product apikey:配置云端创建产品时获取的 产品APIKey
3.退出保存,使用pkgs –update命令更新,再生成对应的MDK5工程,编译无误下载到开发板,上电,ES-Wifi 连接指定的路由热点打印相关信息。
4.测试OneNet初始化和数据点的上传,使用onenet_init命令初始化onenet云,完成后使用onenet_upload_cycle命令周期上传数据。
5.onenet云端监测到设备上线,且曲线图在进行实时更新数据

使用特权

评论回复
来自 11楼
一路向北lm|  楼主 | 2020-6-25 09:58 | 只看该作者
本帖最后由 一路向北lm 于 2020-6-25 10:07 编辑

第四部分: 功能的完善与开发1

1.   使用ESP-WIFI上传数据到oneNet云
在代码中添加onenet_mqtt初始化,这样就可以连接到onenet云了,设备显示上线,具体如下所示:
while(onenet_mqtt_init())
{
rt_kprintf("onenet_mqtt_init error!\r\n");
}


终端上已经打印了onenet正确连接......


在onenet主页上可以看到我们创建的设备已经上线了!

添加数据上传线程,上传数据至云端,在ESP-WIFI 已经正常连上 WIFI 的前提下,MQTT 初始化成功后,就可以放心大胆的上传数据给 OneNet 了。创建线程2,将数据上传到onenet云端,这里上传的数据只是作为展示,并不是真正的温度数据。具体代码如下:
// onenet 上传数据线程
void task2(void *parameter)
{
  unsigned int i;
  while(onenet_mqtt_init());
        while(1)
        {
                i++;
                if(i>=100)i=1;
          onenet_mqtt_upload_digit("temperature",i);
                rt_thread_mdelay(1000);
          rt_kprintf("\r\n upload_temp thread is OK!\r\n");
        }
}
/****************************************************************************/
struct rt_thread Task2_thread;
rt_uint8_t rt_task2_thread_stack[1024];
rt_thread_init(&Task2_thread,"task2",
                       task2,RT_NULL,&rt_task2_thread_stack[0],
                       sizeof(rt_task2_thread_stack),4,50);
rt_thread_startup(&Task2_thread);        
上传数效果如下:


使用特权

评论回复
来自 12楼
一路向北lm|  楼主 | 2020-6-25 10:12 | 只看该作者
本帖最后由 一路向北lm 于 2020-7-1 14:17 编辑

第四部分: 功能的完善与开发2



2.   oneNet云接受数据来控制台灯的亮灭
上次我们把本地的数据传到了onenet云端,这次我们来实现接受onenet云端的数据,控制台灯的亮灭。好了,先来看一下我改装的台灯哈,无聊的改装部分来喽!
败家的玩意,把好好的一个LED灯拆了,电路板改的面目全非……………………………
灯壳、灯罩、LED板分了三部分,大家忽略我肮脏的桌面……………
开始拼装啦,哈哈哈,220V被我改成12V的啦,焊接的线,我自己都嫌弃…………….
装好了,盖上盖子,哈哈,这还是没怎么破坏嘛………….
暂时就引出来两根线吧,不用灯座了哈!真是奇丑无比啊…………
丑是丑了点,但是也得试一下,是不是亮啊,通电,OK,灯亮了,也照亮了我前行的路,该出发啦,窝在家快半年啦……………..
重点的来啦……….数据下发入口, 当有平台数据下发,设备会进入mqtt_callback()回调函数,回调函数中处理数据,然后抛给应用层数据接收处理函数onenet_cmd_rsp_cb(),可通过onenet_set_cmd_rsp_cb(onenet_cmd_rsp_cb)在应用层设置。为了提高效率,我就不再使用onenet_set_cmd_rsp_cb函数,直接在mqtt_callback()回调函数中进行解析,具体测试代码如下:
static void mqtt_callback(MQTTClient *c, MessageData *msg_data)
{
    size_t res_len = 0;
    uint8_t *response_buf = RT_NULL;
    char topicname[45] = { "$crsp/" };

    RT_ASSERT(c);
    RT_ASSERT(msg_data);

    LOG_D("topic %.*s receive a message", msg_data->topicName->lenstring.len, msg_data->topicName->lenstring.data);

        LOG_D("message length is %d", msg_data->message->payloadlen);
                LOG_D("recv data is %s\n", msg_data->message->payload);
/*******************本人添加测试代码部***************************************/
                uint8_t *recv_data = msg_data->message->payload;    //获取按钮数据
                rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);        //配置LED
                if(*recv_data == '1')
                {
                   //led on
                        rt_pin_write(LED1_PIN, PIN_LOW);                 
                }
                else if((*recv_data == '0'))
                {
                 rt_pin_write(LED1_PIN, PIN_HIGH);
                }                       
/****************************************************************************/
    if (onenet_mqtt.cmd_rsp_cb != RT_NULL)
    {
        onenet_mqtt.cmd_rsp_cb((uint8_t *) msg_data->message->payload, msg_data->message->payloadlen, &response_buf,
                &res_len);

        if (response_buf != RT_NULL || res_len != 0)
        {
            strncat(topicname, &(msg_data->topicName->lenstring.data[6]), msg_data->topicName->lenstring.len - 6);

            onenet_mqtt_publish(topicname, response_buf, strlen((const char *)response_buf));

            ONENET_FREE(response_buf);
        }
    }
}
下载,测试,可成功使用onenet云,按钮控制ES32F0654板卡的PC9 LED亮灭。

使用特权

评论回复
来自 13楼
一路向北lm|  楼主 | 2020-7-1 17:26 | 只看该作者
本帖最后由 一路向北lm 于 2020-7-1 17:28 编辑

使用RT-Thread上传温湿度数据OneNet
连接DHT11,编写驱动完成温度和湿度的数据上传,具体代码如下:
/***************************************************************************/
#include "bsp_dht11.h"
/* 可以在下面的宏定义中把后面的延时函数替换换SysTick的延时函数,就是想用那个就换成那个的 */
#define  delay_us(us)   rt_hw_us_delay(us)
#define  delay_ms(ms)   rt_thread_mdelay(ms)

#define  DH_PIN  43

void DHT11_Rst(void)           
{                 
          DHT11_IO_OUT();         //SET OUTPUT
          DHT11_Dout_0;            //拉低DQ
    delay_ms(20);     //拉低至少18ms
    DHT11_Dout_1;                  //DQ=1
          delay_us(30);     //主机拉高20~40us
}

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
unsigned char DHT11_Check(void)            
{   
        unsigned char retry=0;
        DHT11_IO_IN();//SET INPUT         
    while (DHT11_Dout_IN()&&retry<100)//DHT11会拉低40~80us
        {
                retry++;
                delay_us(1);
        };         
        if(retry>=100)return 1;
        else retry=0;
    while (!DHT11_Dout_IN()&&retry<100)//DHT11拉低后会再次拉高40~80us
        {
                retry++;
                delay_us(1);
        };
        if(retry>=100)return 1;            
        return 0;
}

//从DHT11读取一个位
//返回值:1/0
unsigned char DHT11_Read_Bit(void)                          
{
         unsigned char retry=0;
        while(DHT11_Dout_IN()&&retry<100)//等待变为低电平
        {
                retry++;
                delay_us(1);
        }
        retry=0;
        while(!DHT11_Dout_IN()&&retry<100)//等待变高电平
        {
                retry++;
                delay_us(1);
        }
        delay_us(40);//等待40us
        if(DHT11_Dout_IN())return 1;
        else return 0;                  
}
//从DHT11读取一个字节
//返回值:读到的数据
unsigned char DHT11_Read_Byte(void)   
{        
    unsigned char i,dat;
    dat=0;
        for (i=0;i<8;i++)
        {
                   dat<<=1;
            dat|=DHT11_Read_Bit();
    }                                                   
    return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi)   
{        
         unsigned char buf[5];
        unsigned char i;
        DHT11_Rst();
        if(DHT11_Check()==0)
        {
                for(i=0;i<5;i++)//读取40位数据
                {
                        buf[i]=DHT11_Read_Byte();
                }
                if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
                {
                        *humi=buf[0];
                        *temp=buf[2];
                }
        }else return 1;
        return 0;            
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在            
unsigned char DHT11_Init(void)
{         
    gpio_init_t  x;
                 /* Initialize PC9 pin */
    x.mode = GPIO_MODE_OUTPUT;
    x.pupd = GPIO_PUSH_UP;
    x.odos = GPIO_PUSH_PULL;
    x.odrv = GPIO_OUT_DRIVE_NORMAL;
    x.flt  = GPIO_FILTER_DISABLE;
    x.type = GPIO_TYPE_CMOS;
    x.func = GPIO_FUNC_1;
        
   gpio_init(DHT11_GPIO_PORT, DHT11_PIN, &x);
                           
        DHT11_Rst();  //复位DHT11
        return DHT11_Check();//等待DHT11的回应
}
/***************************************************************************/
#ifndef __DHT11_H
#define        __DHT11_H
#include <es32f065x.h>
#include "ald_gpio.h"
#include <rtthread.h>
#include "pin.h"
#include "board.h"

#define      DHT11_GPIO_PORT                 GPIOA
#define      DHT11_PIN                       GPIO_PIN_10

//IO方向设置
#define DHT11_IO_IN()   rt_pin_mode(DH_PIN, PIN_MODE_INPUT_PULLUP)        
#define DHT11_IO_OUT()  rt_pin_mode(DH_PIN,PIN_MODE_OUTPUT)

////IO操作函数                                                                                          
#define DHT11_Dout_0              gpio_write_pin(DHT11_GPIO_PORT, DHT11_PIN,0)
#define DHT11_Dout_1              gpio_write_pin(DHT11_GPIO_PORT,DHT11_PIN,1)

#define DHT11_Dout_IN()            gpio_read_pin(DHT11_GPIO_PORT,DHT11_PIN )


unsigned char DHT11_Init(void);
unsigned char DHT11_Read_Data(unsigned char *temp,unsigned char *humi);
#endif /* __DHT11_H */
/***************************************************************************/
云端的APP端的展示效果如下:

PC端:
APP端:


使用特权

评论回复
14
21ic小喇叭| | 2020-5-9 16:36 | 只看该作者
感谢分享,论坛送您1000家园币,可以兑换礼品。以及论坛给您寄出一份礼品,以示鼓励~ 您继续加油,尽快把帖子更新、继续完善,上传方案文档哦~

使用特权

评论回复
15
21ic小喇叭| | 2020-5-22 14:43 | 只看该作者
哥,记得继续完成啊

使用特权

评论回复
16
一路向北lm|  楼主 | 2020-5-24 17:18 | 只看该作者
21ic小喇叭 发表于 2020-5-22 14:43
哥,记得继续完成啊

先写word 不要急哈

使用特权

评论回复
17
21ic小喇叭| | 2020-6-5 10:54 | 只看该作者
您别忘记上传文档哈,文档的格式要求,在咱们群里有。如果没找到,联系大掌柜单独发给您

使用特权

评论回复
18
一路向北lm|  楼主 | 2020-6-5 14:45 | 只看该作者
21ic小喇叭 发表于 2020-6-5 10:54
您别忘记上传文档哈,文档的格式要求,在咱们群里有。如果没找到,联系大掌柜单独发给您 ...

好的放心

使用特权

评论回复
19
goyhuan| | 2020-7-16 18:19 | 只看该作者
好详细的说

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

277

主题

3805

帖子

76

粉丝