IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266

5.2 利用stm32搭建起一个自动浇花系统

●硬件准备: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。
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第1张图片
与程序中的对应
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第2张图片

取字模软件:
链接:https://pan.baidu.com/s/1Y0f9gZBOKTuCMvjuDK9DxQ
提取码:pk4d

使用说明在oled使用手册有说明。

2,DHT11程序
主程序:
while(DHT11_Init()); //初始化
DHT11_Read_Data(&DHT11_Temp,&DHT11_Hum);//读取温湿度
由于程序已经集成好,自己只是修改了想用的端口来用。

3,实验效果图:
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第3张图片

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,土壤湿度程序
子程序:

IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第4张图片
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第5张图片
主程序:
在这里插入图片描述
2,实验效果图
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第6张图片
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秒
在这里插入图片描述
检测程序,同时变量可以调整加水时间和检测时间
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第7张图片
子程序:
外部变量:
在这里插入图片描述
中断程序
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第8张图片
3,实验效果图
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第9张图片
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
加了可以调用外部的函数,就是在另一个文本上编译的函数可以在这个文本里调用

5.3 底层ESP8266与阿里云利用MQTT协议进行通讯

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模块是3.3V供电! 切记请勿接5V !

与电脑串口助手串口连接图:
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第10张图片
ESP8266-01引脚图:
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第11张图片
想进一步了解可以参考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服务看看。
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第12张图片
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中
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第13张图片

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底层设备。在这个基础上进行下面的操作。

●首先打开云端的设备,复制三元数组,
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第14张图片
●然后复制技小新软件中产生我们想要的参数,修改SN/MAC码,任意,但要和程序中一致
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第15张图片
●复制内部参数,替换stm32中的参数
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第16张图片
●然后回到主程序中,修改成自己要连接路由器的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
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第17张图片

●然后下载程序,这里我用的是ST-Link下载的
驱动包下载:
链接:https://pan.baidu.com/s/1cVxPI6FOZ5Qtdr9qr7uFpA
提取码:tm0g

●等待一下,等esp8266联网成功后,刷新阿里云端,这时候看到设备在线,说明我们的设备连接成功了,可以进行下一步的数据通讯(第一次连接尽量靠近路由器)
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第18张图片

6,STM32上报数据到阿里云(发布话题)

●首先在产品中自定义了三个关于温度,湿度,水泵的话题,权限设为发布和订阅
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第19张图片
●然后在stm32设备中找到这三个话题topic,

IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第20张图片
●复制到stm32程序的函数中
在这里插入图片描述
●定义三个变量,作为温度,湿度输入量,实际应该由传感器取出后进行上传
在这里插入图片描述
●传入到话题中,进行发布
在这里插入图片描述
●显示设备在线
在这里插入图片描述
●打开云端查看发布话题
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第21张图片
●查看话题内容:
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第22张图片
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第23张图片
●这样我们可以实现设备信息的上报。

到这里我们可以看出来其实云端设备更像是实际设备的虚拟版,达到与云端交互的目的。

7,STM32接受阿里云的数据(订阅话题)

●找到订阅话题
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第24张图片
●复制到程序中
在这里插入图片描述
●对订阅到的数据进行处理,采用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;

		}

●发布消息
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第25张图片
●OLED显示
IOT(阿里云)-智慧花卉 - 2,底层的stm32和ESP8266_第26张图片

到这里我们也已经实现了云端数据的订阅。

●下一步我们要实现APP数据的云流转。

程序代码:
https://github.com/harrycomeon/IOT/blob/master/%E4%BF%AE%E6%94%B9%E7%89%88.zip

你可能感兴趣的:(物联网,阿里云,stm32)