系列文章目录
01-STM32获取DHT11数据
前言
本文用于记录一下前几天完成的物联网课设,完成的效果: 实时监测温度变化,并且可以远程控制灯开关(考虑加上远程控制风扇功能 但我懒。而且其实单个ESP8266就可以实现整个功能,还简单) 代码我会上传github,请自行pull代码
网页控制开关灯:
实现思路:STM32负责接收和控制设备。ESP8266通过AT+MQTT指令和服务器进行通信(ESP8266在此次课设只用于通信),最后用Spring Boot集成Java的MQTT库实现一个MQTT的Client作为后端,后端作为订阅者订阅ESP8266的Topic并接收ESP8266发布的消息。然后通过前端发送Http请求来实现消息发布(ESP8266此时是订阅者,要订阅后端的Topic),ESP8266接收消息后通过串口发送给STM32,STM32接收并解析从而实现远程控制功能。
通信流程概念框图:
注:我并没有使用云平台,而是直接在虚拟机上用docker部署了一个emqx服务,用于模拟云平台,实际上直接使用云平台会比这个更加容易和方便。其次,本文基本不会讲原理,因为我也不会。代码都是参考其他人的博客文章,这个图也是改别人的。最后在文末会引用所有参考过的博客/文章
CSDN这个markdown居然不能改图片比例,真挺难看的
所需物理设备:USB数据线1根、LED灯1个、ESP8266模块1个、OLED显示屏1个(用于调试)、杜邦线n根、DHT11温湿度传感器1个、ST-Link 1个、STM32C8T6 1个、面包板1块,硬件准备图如下:
提示:以下是本篇文章正文内容,下面案例可供参考
一、参考别人代码
我参考的:DHT11标准库代码实现
还是比较简单的,想要了解通信原理的可以参考其他帖子,这里随便放一篇
STM32实现DHT11温湿度采集串口显示(标准库与HAL库实现)
参考代码解压后,看Hardware部分,代码都比较简单
System.h 主要是位带操作。这是他代码实现传感器工作时序的核心,不能替换。
SysTick.c 就是延时函数,换成了自己的。
dht11.c 基本没改,我将所有位带操作的参数和需要开放的引脚都分别用一个全局变量代替,方便自己修改。此为部分dht11.c代码
// System.h宏 所需的引脚参数 (0~15)
uint16_t PIN_NUM = 1;
// 初始化的引脚
#define GPIO_PIN_NUM GPIO_Pin_1
void dht11_pin_mode(GPIOMode_TypeDef pin_mode)
{
if(pin_mode == GPIO_Mode_Out_PP)
{
/* 配置GPIO为输出模式,让这根引脚具有输出高低电平的功能 */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_NUM; //指定引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚的速度最大为100MHz
}
else
{
/* 配置GPIO为输入模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_NUM; //指定引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚的速度最大为100MHz
}
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
注:这里我的使用的是GPIOA1, 如果使用了GPIOB, 记得修改对应的初始化参数。如果只是使用了其他引脚则修改上文提到的两个全局变量即可。
二、STM32获取DHT11数据
了解示例代码后, 基本就可以运行了。我个人更喜欢OLED调试, 因此复制了一个带OLED库基本模板项目, 将上文提到的dht11.c、System.h 和自己的Delay.h函数分别加进来直接运行就好了。
记得引入dht11.h库
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "dht11.h"
int main(void)
{
OLED_Init();
dht11_init();
int32_t rt=0; // 相当于状态值flag
uint8_t dht11_data[5]={0}; // 用于接收数据的数组
OLED_ShowString(1,1, "Hello LED");
while(1){
rt = dht11_read_data(dht11_data);
if(rt == 0)
{
OLED_ShowString(2,1, "temp:");
OLED_ShowNum(2,7,dht11_data[2], 2);
OLED_ShowString(2,9, ".");
OLED_ShowNum(2,10,dht11_data[3], 1);
OLED_ShowString(3,1, "humid: ");
OLED_ShowNum(3,7,dht11_data[0], 2);
OLED_ShowString(3,9, ".");
OLED_ShowNum(3,10,dht11_data[1], 1);
}
}
}
总结
例如:以上就是今天的内容,以上完成了STM32获取DHT11的温湿度数据,下一篇文章将讲解ESP8266和本地服务器通信和STM32使用串口和ESP8266通信,最终将STM32、ESP8266和服务器连接起来。完成第二个大模块
Github地址
参考文章:
STM32实现DHT11温湿度采集串口显示(标准库与HAL库实现)
STM32+DHT11 ----标准库代码 ------快来看白嫖代码!