[STM32] Stm32f103c8t6+ESP8266-01s+DHT11 实现向服务器上传温湿度数据

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

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

成功的通过esp创建了一个多路连接的服务器并对数据进行收发;但是既然是使用stm32配置,我们最主要的目的还是通过esp32给单片机进行联网,并进行远程控制。控制方法同传统的蓝牙,串口方法没什么区别,我们只需要对usart2端口接收到的数据进行分析并完成相应判断即可,具体的代码及方法以后会慢慢更新。

完整代码在我的github里,下载后](https://github.com/zhanglu-2001/esp01s),可以直接烧录到stmf103c8t6中使用。
github地址:https://github.com/zhanglu-2001/esp01s


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

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

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.模块

1.Stm32f103c8t6开发板

2.ESP8266-01s

3.DHT11

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

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

2.软件工具

  1. Keil5编译器链接
  2. 串口烧录程序链接
  3. 网络调试助手链接

获取工具请关注“单片机”公众号,回复资源标识:调试工具001

3.接线图

  1. ESP8266_TX ====== GPIOA_Pin_3(RX2)

  2. ESP8266_RX ====== GPIOA_Pin_2(TX2)

  3. DHT11_out ====== GPIOA_Pin_0

  4. 0.91OLED_SDA ====== GPIOB_Pin_15

  5. 0.91OLED_SCL ====== GPIOB_Pin_13

 

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

1.模块简介

2.常用AT指令

  1. AT+CIPSTART="UDP","目标IP",目标端口号,本机端口号,0

  2. 如:AT+CIPSTART="UDP","192.168.1.1",8080,9000,0

  3. AT+CIPSTART="TCP","目标IP",目标端口号

  4. 如:AT+CIPSTART="TCP","192.168.1.1",8080

 

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

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

大家好我叫下面

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

大家好我叫下面也

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

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

  1. 5. AT+CIPSTART="UDP","目标ip地址",目标端口,8266端口默认9000,0

  2. 一 1. AT+CIPSEND (开启传输数据)

  3. 2. > (这个符号代表等待输入,回车发送,在程序里用\r\n转义发送)

  4. 3. +++ (发送+++代表退出发送,串口助手里需要关闭发送新行才能关闭发送,程序里用+++\r\n关闭)

  5. 二 1. AT+CIPSEND=num (指定发送数据长度,由于指定长度,达到长度后会自动发送,并退出发送)

  6. 2. > (这个符号代表等待输入,回车发送,在程序里用\r\n转义发送)

 

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

  1. 5. AT+CIPSTART="TCP","目标ip地址",目标端口

  2. 一 1. AT+CIPSEND (开启传输数据)

  3. 2. > (这个符号代表等待输入,回车发送,在程序里用\r\n转义发送)

  4. 3. +++ (发送+++代表退出发送,串口助手里需要关闭发送新行才能关闭发送,程序里用+++\r\n关闭)

  5. 二 1. AT+CIPSEND=num (指定发送数据长度,由于指定长度,达到长度后会自动发送,并退出发送)

  6. 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

换行显示

  1. GET /STM32/stm32esp8266/name/12345678/111111 //目标地址,路由地址以及参数

  2. HTTP/1.1\r\n //响应头内容

  3. Content-Type: text/html;charset=utf-8\r\n //响应头内容

  4. Host:9000\r\n //响应头内容

  5. User-Agent: BuildFailureDetectorESP8266\r\n //响应头内容

  6. Connection: keep-alive\r\n //响应头内容

  7. \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,出现能连服务器但不能发送数据时服务器返回的

玩完了

版权声明:本文为张德仁原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41873771/article/details/113754679

 

 

 

 

生成海报
点赞 1

创世纪

单片机学习,电子制作DIY学习与分享,各种新鲜的,有趣的,好玩的,一起来吧!机器人、无人机、树莓派/Raspberry Pi、arduino、极客、创客等

相关推荐

ESP8266与STM32

ESP8266与STM32通信 最近想实现esp8266-01s系列和stm32f103c8t6之间进行串口通信,然后在网上看了好多这方面的资料最终都以失败告终。不断尝试下还是实现该功能,同时非常感谢这位博主。 博主

51单片机+ LCD1602+PCF8574转IIC接口+DHT11数据显示

51单片机+ LCD1602+PCF8574转IIC接口+DHT11数据显示 在做这个实验的时候又一次被自己的不注意,掉坑里面去了,调试了好久都不出数据,结果在延时函数和引脚定义上被自己坑了一把。希望大家在写代码的时候多加注意。 LCD1602