[STM32] Stm32f103c8t6+ESP8266-01s+DHT11 实现向服务器上传温湿度数据(超详细,零基础,初学者,小白直接上手,我都怎么标题党了还是没人看吗)

啦啦啦啦(这句是为了保存草稿用的,心情不错就不删了)

首先要感谢博主 @明天多云转雨 的文章 基于stm32f1的esp01s的驱动库及使用 提供可直接使用的ESP8266的驱动,以及常用方法

我是在该博主代码基础上对部分功能新增与调优

本篇文章内容总结下来就是

ESP8266-01s

1.常用AT指令

2.TTL串口使用AT指令上传数据

3.STM32利用串口2操作ESP8266-01s上传数据

DHT11

1.打印温湿度信息

2.通过STM32利用串口2操作ESP8266-01s上传DHT11读取到的温湿度数据这行字最多所以在多写一点反正没人会在意我写的文章有多水哈哈哈哈

这篇文章篇幅不小,是根据我亲身经历从刚刚接触ESP8266到能够熟练用单片机上传数据,其中遇到的问题解决办法,以及收集各种参考资料,最后总结出来的,虽然事无巨细但整理出来可能会有些水,所以我开心就好

这段是自我介绍与本文关系不大请各位酌情阅读

有两年JavaWeb开发经验的程序员,闲暇之余会自己开发些方便又实用的项目,因为有趣所以开发的大部分是java爬虫,在2020年对树莓派感兴趣还玩过一段时间用树莓派作为服务器部署Springboot项目,并为树莓派制作一个UPS电源用于24小时运行,之后就对单片机以及嵌入式开发产生兴趣,通过连接不同传感器,不同模块,做到与现实搭建连接,从现实中获取数据并进行交互,因为有趣作为动力所以才能有这篇文章的诞生,但话说回来我还是个Java开发,可以的话私信一下相互学习分享一下技术.

 没用的前言,看干货跳过这段

想必看到这篇文章的人都是已经翻阅了大量的文章资料,已经厌倦了那种通篇都是百度百科,通篇都是复制官方资料,通篇都是怎样点亮led灯的没有多少营养的文章

本篇文章就如同他的标题写的一样标题党适合初学者上手,因为我就是从无到有开始使用的

ESP8266模块,机缘巧合下接触8266模块,得知该模块可以无线联网真是又惊又喜,价格极其廉价功能十分强大,不愧是物联网入门首选的设备(自认为),在自学8266时是从TTL串口连接8266发送AT指令,一点点对AT指令有所了解,当必要指令都掌握后就开始查找使用STM32发送AT指令控制8266的资料

DHT11模块,对这个模块的了解不多,因为只需要它获取到的温湿度信息,所以没有多做了解,只是调试好驱动程序后就作为工具,哪里用到就直接移植,这里是用于获取温湿度数据上传服务器用(如果上传的是烧录前就写死的值,那太没趣了)

目录

一.前期准备

1.模块

2.软件工具

3.接线图

二.ESP8266-01s模块从入门到入土

1.模块简介

2.常用AT指令

3.STM32操作8266

4.ESP8266向Springboot项目上传数据

三.DHT11模块

1.模块简介

2.STM32操作DHT11

四.成品展示

1.程序运行展示

2.代码

五.源码


一.前期准备

1.模块

    1.Stm32f103c8t6开发板

    2.ESP8266-01s

    3.DHT11

    4.ST-LINK V2 或 CH340(比较推荐CH340还可以用于8266的串口调试)

    5.另外我使用了一块0.91寸的4针脚OLED屏用于打印进度,只是辅助作用,不会影响主要功能

2.软件工具

  1. Keil5编译器

    链接: https://pan.baidu.com/s/10jR0g10jxdosawc49IOazQ

    提取码: uizh

  2. 串口烧录程序

    链接: https://pan.baidu.com/s/11VCAXnfmO1FCQQVjirIkrQ

    提取码: h1uz

  3. 网络调试助手

    链接: https://pan.baidu.com/s/10symiEf79iHxF_kx7WhRBg

    提取码: gdbv

3.接线图

//ESP8266连接STM32
ESP8266_TX ======  GPIOA_Pin_3(RX2)  
ESP8266_RX ======  GPIOA_Pin_2(TX2)

//DHT11连接STM32
DHT11_out ====== GPIOA_Pin_0

//0.91寸OLED四针脚屏幕连接STM32
0.91OLED_SDA ====== GPIOB_Pin_15
0.91OLED_SCL ====== GPIOB_Pin_13

 

二.ESP8266-01s模块从入门到入土

1.模块简介

2.常用AT指令

恢复出厂设置 AT+RESTORE 
查看模块状态 AT+RST
查看附近无线网络 AT+CWLAP
设置客户端模式
AT+CWMODE=1	客服端 Station
AT+CWMODE=2 用户端 AP
AT+CWMODE=3	双端
查询网络连接状态 AT+CIPSTATUS
开启传透模式 AT+CIPMODE=1
关闭穿透模式 AT+CIPMODE=0
连接WIFI AP
AT+CWJAP="wifi名","密码"
获取ip地址 AT+CIFSR

UDP连接
AT+CIPSTART="UDP","目标IP",目标端口号,本机端口号,0
如:AT+CIPSTART="UDP","192.168.1.1",8080,9000,0

TCP连接
AT+CIPSTART="TCP","目标IP",目标端口号
如:AT+CIPSTART="TCP","192.168.1.1",8080

开启发送 AT+CIPSEND
指定发送长度 AT+CIPSEND=num
退出发送 +++

 推荐第一次使用8266模块用TTL串口连接,用来学习AT指令,也能熟悉8266不同指令需要执行的时间,熟悉这个时间很重要,下面会讲,再有有些wifi名8266会识别为乱码,也会影响连接,下面也会讲

还有一个问题,之前出现过TCP方式突然连不服务器,上,初始化恢复出厂设置都试过还是不能连服务器,但连UDP是秒连,我在网上找到看到好多都出现同样问题的,还没有准确的解决方案,我试过的的很多方法都没有奏效,过一段时间就可以使用,很迷,所以也在尝试找寻解决办法

 

大家好我叫下面

因为8266不同指令执行的时间不同,状态码返回的时间也是不同,如果在程序里没有定义好读取串口返回值的时间,就会导致指令明明没有问题,TTL都能执行,但烧录到板子里每到这个指令发送时程序提前读取返回码,由于指令没有执行结束,没有返回码,导致指令失败,往往就是对这个时间不够熟悉,需要对个别指令增加读取返回值的延时

大家好我叫下面也

推荐先用TTL的原因还有一点,由于8266模块内置的语言编码不同,如果遇到wifi名中带有中文或有特殊符号,就会显示为乱码,所以会出现代码里wifi名和密码都没有问题但就是连不上,推荐先使用AT+CWLAP(查看附近无线网络) 来获取目标wifi名称.

UDP方法发送数据到服务器全流程指令

连接服务器
1.	AT+CWMODE=1 客服端
2.	AT+CIPMODE=1 透传模式1
3.	AT+CWJAP="wifi名","密码"
4.	AT+CIFSR 获取ip地址
5.	AT+CIPSTART="UDP","目标ip地址",目标端口,8266端口默认9000,0
发送数据有两种方法
一  1.	AT+CIPSEND (开启传输数据)
    2.  >  (这个符号代表等待输入,回车发送,在程序里用\r\n转义发送)
    3.  +++  (发送+++代表退出发送,串口助手里需要关闭发送新行才能关闭发送,程序里用+++\r\n关闭)
二  1.  AT+CIPSEND=num (指定发送数据长度,由于指定长度,达到长度后会自动发送,并退出发送)
    2.  >  (这个符号代表等待输入,回车发送,在程序里用\r\n转义发送)

多次发送只需要循环发送数据方法

TCP方法发送数据到服务器全流程指令

1.	AT+CWMODE=1 客服端
2.	AT+CIPMODE=0 透传模式0
3.	AT+CWJAP="wifi名","密码"
4.	AT+CIFSR 获取ip地址
5.	AT+CIPSTART="TCP","目标ip地址",目标端口
发送数据有两种方法
一  1.	AT+CIPSEND (开启传输数据)
    2.  >  (这个符号代表等待输入,回车发送,在程序里用\r\n转义发送)
    3.  +++  (发送+++代表退出发送,串口助手里需要关闭发送新行才能关闭发送,程序里用+++\r\n关闭)
二  1.  AT+CIPSEND=num (指定发送数据长度,由于指定长度,达到长度后会自动发送,并退出发送)
    2.  >  (这个符号代表等待输入,回车发送,在程序里用\r\n转义发送)

3.STM32操作8266

上面讲的都是AT指令,真正应用都要在STM32中,STM32连接ESP8266也是使用串口发送AT指令,与串口助手用法是一样的,我这里使用的是c8t6的串口2 PA2 PA3针脚

这里我就讲一下一些注意事项,具体实现看下面代码

STM32通过串口发送AT指令需要在最后加"\r\n"作为回车

4.ESP8266向Springboot项目上传数据

因为我对嵌入式项目的服务端不熟悉,但对web向服务端的Springboot很熟,所以想用Springboot项目来接收8266发送的数据,试了几次找了很多资料才使得Springboot能接收8266的访问,因为通常浏览器在访问目标地址时会自动拼接web访问响应头,而8266之后发送所给数据,所以需要手动把响应头拼接上,才能使目标服务器能识别访问

通常的web响应头,可以通过浏览器F12查看,访问目标地址时会自动拼接在地址后面

拼接后效果

GET /STM32/stm32esp8266/name/12345678/111111 HTTP/1.1\r\nContent-Type: text/html;charset=utf-8\r\nHost:9000\r\nUser-Agent: BuildFailureDetectorESP8266\r\nConnection: keep-alive\r\n\r\n

换行显示

GET /STM32/stm32esp8266/name/12345678/111111     //目标地址,路由地址以及参数
HTTP/1.1\r\n                                     //响应头内容
Content-Type: text/html;charset=utf-8\r\n        //响应头内容
Host:9000\r\n                                    //响应头内容
User-Agent: BuildFailureDetectorESP8266\r\n      //响应头内容
Connection: keep-alive\r\n                       //响应头内容
\r\n                                             //最后的换行不要忘记

最终效果

可以看到,只有第一次发送数据成功了,之后不管通过什么方式都不能再发送出数据,重新连接服务器也不行,穿透0+重连服务器也不行

并且在能连接服务器后也是不能发送出数据,项目后台报错

还在想办法解决这个问题, 如果解决就可以收集数据再用花里胡哨的界面显示了,最好在来个空气质量监测,天气实时状况监测,温湿度监测,有什么传感器上什么传感器,那就完美了

三.DHT11模块

1.模块简介

向来我都是不太介绍模块详细参数的,但多少也要写一写

要注意的是该模块是单总线输出,一次传回40位数据,每8位一组,共5组数据,前两组是湿度参数,在后面两组温度参数,最后一组是校验参数

通过前四组参数计算并与最后的校验参数进行验证来判断数据是否正确

由于我很容易就找到demo,没有浪费我太多时间,所以对该模块没有过多了解,只要返回参数就可以直接用

2.STM32操作DHT11

DHT11模块读取温湿度并校验

DHT11模块读到温湿度用OLED显示并传给ESP8266发送

四.成品展示

1.程序运行展示

2.代码

1.检测模块是否连接

2.设置模式

3.连接wifi

4.穿透模式0

5.连接服务器

6.发送数据

五.源码

发送温湿度只是体现数据上传服务器,如果上传其他数据只需要将要上传的值传给上传方法即可,方便二次加工

闲聊到这里,想要源码的两种途径

1.积分下载 链接我会放上来

https://download.csdn.net/download/qq_41873771/15226194

2.私信我 聊聊技术谈谈趣闻 陪我聊聊天好么 秋梨膏

后记

前前后后用10天时间从无到有使用ESP8266模块,从刚开始的TTL连接8266学习AT指令到STM32连接8266发送数据,找了很多资料看了很多文章

模块连接图,RC522不算在这篇文章

这个是我第一次整合好测试时拍视频中的截图,当时兴奋的不得了

可能有人注意到RC522射频模块了,我也尝试写了将IC卡数据上传到服务器的方法,这里是上传卡ID,如果想了解可以私信我,这篇文章没有提供RC522的整合

这是使用TTL连接8266,出现能连服务器但不能发送数据时服务器返回的

玩完了

猜你喜欢

转载自blog.csdn.net/qq_41873771/article/details/113754679