●硬件准备:stm32f103c8t6,0.96寸OLED显示屏,DHT11温湿度传感器,土壤湿度传感器,水泵
●软件:keil5
5.2.1利用oled显示温湿度
1,oled显示
参考网址:http://www.51hei.com/bbs/dpj-181420-1.html
oled使用手册:
链接:https://pan.baidu.com/s/1b4Ii40bOvNAckod-38aqgA
提取码:nstd
复制这段内容后打开百度网盘手机App,操作更方便哦
●利用OLED IIC接口,连接GND, VCC, SCL ,SDA
●由于程序已经集成好,只是拿来用,所以没有对程序深入了解,下面主要是说一下自己用的取字模软件放到oledfont.h。
与程序中的对应
取字模软件:
链接:https://pan.baidu.com/s/1Y0f9gZBOKTuCMvjuDK9DxQ
提取码:pk4d
使用说明在oled使用手册有说明。
2,DHT11程序
主程序:
while(DHT11_Init()); //初始化
DHT11_Read_Data(&DHT11_Temp,&DHT11_Hum);//读取温湿度
由于程序已经集成好,自己只是修改了想用的端口来用。
4,程序链接:
链接:https://pan.baidu.com/s/1N1TyV5AB_ONQ4t-SITD1zw
提取码:vb3n
由于字模程序上传失败,随分享到以下网址下载。
https://download.csdn.net/download/harrycomeon/12325740
需要替换下载程序的OLED文件
5.2.2利用oled显示土壤湿度
参考网址:
https://github.com/JSqiubo/Temperature-and-humidity-control-based-on-stm32
1,土壤湿度程序
子程序:
主程序:
2,实验效果图
3,程序链接
链接:https://pan.baidu.com/s/1AGpOD9N6YW6BWF4wOkbEEQ
提取码:yncy
由于字模程序上传失败,随分享到以下网址下载。
https://download.csdn.net/download/harrycomeon/12325740
需要替换下载程序的OLED文件
5.2.3设定土壤湿度阈值,控制水泵的通断
1,功能介绍
●这里采用的两个定时器中断,同时两个定时器是成嵌套关系。
●设定土壤湿度的阈值是40%。
●当检测到土壤湿度低于该阈值的等待20秒,端口电位变化,启动继电器,开始浇水,给水时间设定为5秒,加水5秒后停止加水。其中这5秒是嵌套在20秒内的。
●20秒后,如果仍未达到湿度的阈值,再次重复上述过程。这样可以保证接近水位时不至于加水过多,类似于梯度下降法接近峰值时减少步长。
●当达到湿度阈值时,停止加水操作
2,程序实现
主程序:
定义两个全局变量用于主程序和中断子程序
定时0.5秒
检测程序,同时变量可以调整加水时间和检测时间
子程序:
外部变量:
中断程序
3,实验效果图
4,演示视频
5,程序链接
链接:https://pan.baidu.com/s/1HZ3kFndd9J1Oem4uUXduaQ
提取码:rf16
由于字模程序上传失败,随分享到以下网址下载。
https://download.csdn.net/download/harrycomeon/12325740
需要替换下载程序的OLED文件
在移植程序中遇到的问题汇总:
解决问题:
1,main.c(6): error: #5: cannot open source input file “adc.h”: No such file or directory
原因是添加过来文件夹后没有在options for target 下的C/C++ 添加include paths路径
2,.\OBJ\TEST.axf: Error: L6218E: Undefined symbol TIM_ClearITPendingBit (referred from timer.o).
.\OBJ\TEST.axf: Error: L6218E: Undefined symbol TIM_Cmd (referred from timer.o).
.\OBJ\TEST.axf: Error: L6218E: Undefined symbol TIM_GetITStatus (referred from timer.o).
.\OBJ\TEST.axf: Error: L6218E: Undefined symbol TIM_ITConfig (referred from timer.o).
.\OBJ\TEST.axf: Error: L6218E: Undefined symbol TIM_TimeBaseInit (referred from timer.o).
原因是没有把stm32f10x_tim.c文件添加进去
3,.\OBJ\TEST.axf: Error: L6218E: Undefined symbol sum1 (referred from timer.o).
原因:在main.c 文件中定义int sum1 = 0; 要想在time.c中用就要在time.h文件下加extern int sum1 ;
在多文件编程的时候,你在1.c文件定义的一个变量(或者函数)如果想在2.c文件里面调用就需要在声明的时候加extern
加了可以调用外部的函数,就是在另一个文本上编译的函数可以在这个文本里调用
1,技术文档
ESP8266:
链接:https://pan.baidu.com/s/1-oVjnJTKaAIaLww9nuxwiA
提取码:tlml
ESP8266设置及说明
链接:https://pan.baidu.com/s/1VzFbzIMxnBmQ2yBhsy0-Og
提取码:ode6
复制这段内容后打开百度网盘手机App,操作更方便哦
串口调试助手:
链接:https://pan.baidu.com/s/1UTK0uNacbDZx5oGQg1q8Ng
提取码:q39e
MQTT协议:
链接:https://pan.baidu.com/s/1rX2v1Iaa2Z6ucmZOgTZ-QQ
提取码:s1py
2,ESP8266
与电脑串口助手串口连接图:
ESP8266-01引脚图:
想进一步了解可以参考blog:
https://blog.csdn.net/harrycomeon/article/details/105138106
https://blog.csdn.net/harrycomeon/article/details/105147788
3,MQTT协议
参考网址:
http://www.stmcu.org.cn/module/forum/thread-613083-1-7.html
https://iot.51cto.com/art/201905/596402.htm
1,介绍
●MQTT,目前物联网的最主要的协议,阿里云平台是基于MQTT协议。
MQTT是基于TCP长连接,首先是先跟MQTT服务器建立TCP连接,然后发送登录请求,要保持长连接,还要定时发心跳包跟服务保持连接。我们先用MQTT.fx来登录开源的MQTT服务看看。
MQTT的具体通讯原理可以参考上述1技术文档。
2,MQTT的好帮手JSON
●JSON中文全称是JavaScript对象标记语言,在这门语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。其语法规则是:
●对象表示为键值对;
●数据由逗号分隔;
●花括号保存对象;
●方括号保存数组。
●JSON层次结构简洁清晰,易于阅读和编写,同时也易于机器解析和生成,有效提升网络传输效率。
●对于单片机开发者,主流的微控制器软件开发工具Keil有提供JSON库,可以用于STC、STM32等微控制器开发,所以在微控制器上解析JSON不需要自己写一个JSON解析器或者移植了。
如果实在懒得使用JSON库生成或解析,也可以直接使用C语言中的sprintf生成JSON字符串,比如:
sprintf(buf, "{"String":"%s", "Value":%d}", "Hello World!", 12345);
之前我们用MQTT.fx给阿里云发送消息格式也是json
3,关于MQTT在stm32上的移植
参考网址:
https://blog.csdn.net/mzwhhwj/article/details/77939165
https://sun2y.me/2017/05/12/MQTT%E5%8D%8F%E8%AE%AE%E5%9C%A8STM32%E4%B8%8A%E7%9A%84%E7%A7%BB%E6%A4%8D/
移植步骤可以参考以上参考网址
最后移植后可以像一个包一样引入到stm32中
MQTT实质上只是一个协议,引入到stm32中主要是为了连接阿里云平台,搞清楚什么是订阅什么是发布,如何保持连接。
4,调试开发工具
●MQTT.fx
参考blog:https://blog.csdn.net/harrycomeon/article/details/105491754
●Wireshark
Wireshark并监听阿里云1883端口的网络数据
软件下载:
链接:https://pan.baidu.com/s/1DSVL_4ZlClwG8N_1hNPcpg
提取码:cvet
复制这段内容后打开百度网盘手机App,操作更方便哦
使用参考网址:
https://blog.csdn.net/qq997758497/article/details/91842168
5,设备连接
●前提条件:参照我们上一个blog,创建了阿里云端的stm32底层设备。在这个基础上进行下面的操作。
●首先打开云端的设备,复制三元数组,
●然后复制技小新软件中产生我们想要的参数,修改SN/MAC码,任意,但要和程序中一致
●复制内部参数,替换stm32中的参数
●然后回到主程序中,修改成自己要连接路由器的wifi名和密码
格式类似于这种
error=ESP_JoinAP("123456(wifi)","123456(密码)",2000);
●转到MQTT_Connect((char *)USERNAME,(char *)PASSWARD,200);函数定义
●修改成产生的ID
●然后进行硬件连接
/*ESP8266 部分
TXD — PA3/USART2_RX
RXD — PA2/USART2_TX
RST — PA4
EN — PA5
VCC — 3.3V
GND — GND
●然后下载程序,这里我用的是ST-Link下载的
驱动包下载:
链接:https://pan.baidu.com/s/1cVxPI6FOZ5Qtdr9qr7uFpA
提取码:tm0g
●等待一下,等esp8266联网成功后,刷新阿里云端,这时候看到设备在线,说明我们的设备连接成功了,可以进行下一步的数据通讯(第一次连接尽量靠近路由器)
6,STM32上报数据到阿里云(发布话题)
●首先在产品中自定义了三个关于温度,湿度,水泵的话题,权限设为发布和订阅
●然后在stm32设备中找到这三个话题topic,
●复制到stm32程序的函数中
●定义三个变量,作为温度,湿度输入量,实际应该由传感器取出后进行上传
●传入到话题中,进行发布
●显示设备在线
●打开云端查看发布话题
●查看话题内容:
●这样我们可以实现设备信息的上报。
到这里我们可以看出来其实云端设备更像是实际设备的虚拟版,达到与云端交互的目的。
7,STM32接受阿里云的数据(订阅话题)
●找到订阅话题
●复制到程序中
●对订阅到的数据进行处理,采用OLED显示的方式取出订阅的字符串
if(ESP_Recv_Len>0){
MQTT_Subscrib_Message((char *)mqtt_msg,(char *)ESP_Recv_Buff,"/a1JxOUTX7DV/stm32/user/shuibeng",ESP_Recv_Len);
//temp=mqtt_msg[13];
//OLED_ShowChar(16,6,temp,16);
OLED_ShowString(32,2,mqtt_msg,16);
//È¡³öÏûÏ¢ÖнøÐÐÅжϵÄ×Ö·û
ESP_Recv_Len=0;
}
到这里我们也已经实现了云端数据的订阅。
●下一步我们要实现APP数据的云流转。
程序代码:
https://github.com/harrycomeon/IOT/blob/master/%E4%BF%AE%E6%94%B9%E7%89%88.zip