传感器
- 1. DHT11温湿度传感器
-
- 1.1 引脚说明
- 1.2 通信原理
-
- 1.2.1 原始数据的处理
- 1.2.2 时序图
- 1.3 使用教程
-
- 1.3.1 CubeMx配置
- 1.3.2 代码的移植
- 1.3.3 引脚的修改(十分重要)
1. DHT11温湿度传感器
1.1 引脚说明
1.2 通信原理
1.2.1 原始数据的处理
DHT11数字湿温度传感器采用单总线数据格式。即,单个数据引脚端口完成输入输出双向传输。其数据包由5Byte(40Bit)组成。
-
数据分小数部分和整数部分,高位先出,校验和数据为前四个字节相加。
-
传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。如果,某次从传感器中读取如下5Byte数据:
-
由以上数据就可得到湿度和温度的值,计算方法:
humi (湿度)= byte4 . byte3=45.0 (%RH)
temp (温度)= byte2 . byte1=28.0 ( ℃)
jiaoyan(校验)= byte4+ byte3+ byte2+ byte1=73(=humi+temp)(校验正确)
注意:DHT11一次通讯时间最大3ms,主机连续采样间隔建议不小于100ms。
1.2.2 时序图
1.3 使用教程
1.3.1 CubeMx配置
由于四个引脚中两个引脚是电源,一个是空接,所以就只需要配置一个简单的GPIO即可
1.3.2 代码的移植
- 把DH11的C文件和H文件移进去就好了,然后记得在main.c中初始化延迟函数(因为使用的是原子哥的所以要初始化延迟函数)
- 关于修改引脚
(编辑于2021/11/14)
1.3.3 引脚的修改(十分重要)
前言:在之前的学习和使用中,以为只要修改上述说过的端口号和PGout什么的就好了,但是那时候的我只是把PG11改成了PA11的引脚使用而已,在某次使用中CubeMx把我的引脚换到了PC0中,然后我就懵逼了。所以这点十分值得注意,因为在修改原子哥的例程中是很值得去解决的。
- 在CubeMx中配置引脚的时候记得加上User Label的定义 这样代码的移植性会大大增加。
- 在DHT11.h文件中修改如下代码(数据引脚PG11改成PC0的操作)
//IO方向设置
//如果要修改数据IO口的话
//端口号修改,不过我用了User Label封装的较好,随后还要改引脚管脚号的设置以及模式的寄存器
//CRH为8~16的高位寄存器,CRL为0~7的低位寄存器,F表示了引脚几|=8<引脚号*4
#define DHT11_IO_IN() {
DHT11_GPIO_Port->CRL&=0XFFFFFFF0;DHT11_GPIO_Port->CRL|=8<<0;}
#define DHT11_IO_OUT() {
DHT11_GPIO_Port->CRL&=0XFFFFFFF0;DHT11_GPIO_Port->CRL|=3<<0;}//IO操作函数
//这里也要相应的更改
//同时要修改的是DHT11初始化函数那里
#define DHT11_DQ_OUT PCout(0)//数据端口 PG11
#define DHT11_DQ_IN PCin(0) //数据端口 PG11
上面的操作中IO方向设置是有关于寄存器编程的一点小知识详细可以查看
STM32寄存器编程
3. 在DHT11.c文件下修改如下代码(数据引脚PG11改成PC0的操作)
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在
u8 DHT11_Init(void)
{
GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOC_CLK_ENABLE(); //开启GPIOG时钟GPIO_Initure.Pin=DHT11_Pin; //PG11GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出GPIO_Initure.Pull=GPIO_PULLUP; //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(DHT11_GPIO_Port,&GPIO_Initure); //初始化DHT11_Rst();return DHT11_Check();
}
以上可以看出User Label设定的好处了,它会自动帮你宏定义这两个
(编辑结束)