ESP8266(一)| 基于OneNet的温度采集显示系统

时间:2022-07-24
本文章向大家介绍ESP8266(一)| 基于OneNet的温度采集显示系统,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

说明:本节内容学习自网络,所用代码在原代码基础上修改而成。要了解更多原文详细信息,可以访问https://www.bilibili.com/video/BV1XJ411A7Co

今天分享的是基于ESP8266 WIFI模块的第一个实战项目。实现的功能是采集温度数据上传至OneNet云端,然后云端将数据发送到手机上,在手机上显示温度曲线,另外还实现在手机上控制led小灯的亮灭。实现双向的数据交互。

先来看一下手机上的效果:

这里有4个开关,可以控制4个led灯的亮灭,下面的坐标曲线可以实时显示温度传感器采集的温度信息。

后面还会介绍使用MQTT协议连接阿里云或者百度云、腾讯云之类的,但是由于时间关系,这里不会介绍太多细节,只是大概说一下方法和步骤,以及程序的思路,更多具体的细节大家可以去上面的链接里好好研究。

下面就来讲一讲如何入手去完成这样一个项目。

首先是关于这个WiFi模块,ESP8266是一个比较常用的WiFi模块,它和单片机之间是使用串口来通信的,串口通信是一种比较简单的通信方式,所以我们需要配置好串口,主要是配置波特率,数据位宽度,停止位,校验位这些啊,这些东西stm32的库函数里都有相关的配置,然后就是接线问题,单片机的txd连接模块的rxd,单片机的rxd连接模块的txd,有的模块可能还有一个使能管脚,只要连上一个普通的GPIO口,然后根据手册说明在程序中使能就好了,相信这些大家都很清楚了。

配置好串口之后就是具体怎么通信了,像之前的蓝牙模块一样,都是通过AT指令来控制的,也就是说对每一个模块,都要找到它对应的数据手册来看一下它的AT指令集,才知道发送什么指令,不过大多数应该是通用的,少数细节可能不一样。

我们需要通过串口来把这些指令发给模块,然后模块就会回应我们。

那么,我怎么知道模块工作是不是正常呢?如果不正常的话,我们就希望知道模块到底回应了什么东西,所以这里采用一个技巧,就是通过一个串口转USB的模块,去“截取”模块回应的信息,然后在串口助手上打印出来,这样我们就可以很直观的看到模块回应的是什么。具体的做法就是从模块的txd引脚(其实就是单片机的rxd引脚)用杜邦线引出来,接到串口转USB模块的rxd引脚,然后串口转USB模块插到电脑上。

另外,在调试程序的时候,我们经常在程序中打印出一些调试信息,所以我们还需要再配置一个串口,用来打印调试信息的。好在stm32不止一个串口,所以这个问题很好解决。

接下来就是怎么操作WiFi模块了,前面也说到,是通过AT指令来的,这个AT指令需要查阅手册。那么在本次实验中,主要用到的AT指令不多,如下:

连接路由器:AT+CWJAP
获取IP地址:AT+CIFSR
发送数据:AT+CIPSEND   //启用透传模式后
连接服务器:AT+CIPSTART
进入透传:AT+CIPSEND
断开连接:AT+CIPCLOSE

还有一些其他的指令,以及指令的回复请查阅手册。

基本上大概就是连接路由器,连接TCP服务器,进入透传。当然这里使用的是sta模式,而不是AP模式。因为当ESP8266作为服务器的时候不能使用透传,只有作为客户端的时候才使用透传。

完成了这些基本的配置之后,就是主函数的逻辑了。

在主函数里面,定时器起了很重要的作用,也是最复杂的,搞清楚了这个,基本上就理解了。

在主函数里,我们使用了几个标志位,然后在while(1)循环中来轮询这些标志位的状态,以便执行相应的操作。有哪些标志位呢?

第一,r_flag用来判断是否需要复位,第二,Usart2_RxCompleted标志位用来判断一帧数据是否接收完成,第三,s_flag用来表示需要查询开关量,第四,d_flag表示需要上传温度数据。

知道了这些标志位的作用,接下来就是想要知道这些标志位到底在哪里被改变了,也就是说什么时候会把这些标志位置位。其实大部分是在定时器中,接下来具体分析一下是怎么改变这些标志位的。这里推荐使用vscode来查看代码,因为可以很方便的看到某个变量在哪些地方被引用了。

第一个r_flag,这个在很多地方都可能被置位,也就是说当某个地方出现异常的时候,我们就让这个标志位置位。比如说你连接路由器失败,或者连接服务器失败,或者别的地方异常,一般我们都可以根据函数的返回值来判断是否成功或者异常,比如正常应该返回什么,如果不是返回这个,那可能就异常了,在这里,也可能是8266模块回复的不是你想要的,出现了异常,就可以让r_flag置位,然后在主函数里,当发现r_flag被置位之后,就执行复位操作,一切都重来。

第二,Usart2_RxCompleted标志位用来判断一帧数据是否接收完成。那么它是在一个定时器中断里被置位的。实现的逻辑在我们之前的文章中也有涉及(点击阅读:HC05蓝牙模块通信(附源码)),其实就是定时器定一段时间,当串口收到一个数据的时候,就将计时器清零,如果超过定时时间没有收到数据,就会进入定时器中断,也就认为一帧数据接收完成了,这时就将这个标志位给置位。

第三和第四都差不多,就是简单的定时一段时间,到了就置位。

这里要说明一下,就是因为OneNet它允许的最快的刷新频率是3s,因此,没有必要一直去刷新,可以过三秒去查询一次开关量的状态,这就是定时的原因。

另外还需要注意的就是,比如定时3秒时间到了,s_flag在定时器中断里被置位,然后主函数发现s_flag被置位了,就要去执行查询开关量的状态,那这时,把这两个定时器都暂时关一下,等处理完了再打开,防止在处理开关量的时候,另一个定时器时间到了,又要去上传温度数据,造成冲突。

当然,还有温度采集,这个参照之前的:基于红外传输的多点温度采集系统 文章,有比较详细介绍温度传感器的用法。

到这里,主函数的逻辑也就讲解完毕了。那么还有就是连接服务器有一些细节问题,也就是http协议有一定的报文格式,在程序中需要遵从这样的格式,由于这个比较固定,直接照抄就好了,这里暂时不深入分析。

接下来还有一个比较重要的就是,单片机程序大致弄好了,接下来就是要登录OneNet官网去注册一个产品,然后这个产品绑定一些设备,最重要的是数据流,每个设备都有对应的数据流,程序中的数据流名称要与这个数据流名称一致。这样才能准确交换信息。

比如说界面上的一个开关按钮它就是对应一个数据流,假设这个数据流名称叫做switch_1,那么程序中通过获取switch_1这个数据流的值(0或者1)来决定点亮或者熄灭led灯。当你在手机上将开关打向on的时候,数据流可能是1,然后程序中通过检测这个数据流是1,就点亮led,反之亦然。

同样的,那个坐标曲线也对应一个数据流,在程序中,你就应该将温度数据发送到坐标曲线对应的这个数据流上,这样它就可以在坐标中显示你发送的数据。至于具体的操作,请点击文章前面的链接。

以上就是本项目大致的逻辑和结构,后台回复“onenet”获取本项目参考源码。