DHT11数字温 湿度传感器 是一款含有已校准 数字信号 输入的温湿度复合 传感器 。其老本低、常年稳固、可以测量相对湿度和温度测量,并可以只经常使用一根数据线启动温湿度采集。
模块实物展现:
资料下载 链接: 资料 提取码:2sgq
2. 规格 参数
模块的厂家资料下载见百度网盘链接
上班电压:3-5.5V
上班 电流 :1MA
测量分辨率:8 bit
湿度量程: 20 - 90 %RH
湿度精度:±5 %RH
温度量程: 0 - 50 ℃
温度精度:±2 ℃
通讯 协定:单总线
管脚数量:3n(2.54mm间距 排针 )
3.移植环节
咱们的指标是在立创·地文星·CW32F030C8T6开发板上成功读取温湿度的性能。首先要失掉资料,检查数据手册应如何成功读取数据,再移植至咱们的工程。
3.1检查资料
DHT11经常使用的是单总线通讯,即发送数据与接纳数据都在一根数据线上,经过规则的时序启动控制。
从左向右看,时序一开局,服务器 信号 就坚持着高电平,所以引脚初始化终了时,及时给引脚输入高电平。由于 模块的数据线要求闲暇时,要坚持高电平形态。(其实模块上曾经接了上拉 电阻 ,使数据线不时坚持高电平)
依据时序图可以知道,服务器(开发板)发送一次性开局信号,待服务器开局信号完结后,DHT11 发送照应信号,送出 温湿度数据,并触发一次性数据采集给下一次性数据读取作预备。因此成功一次性数据读取须要启动起始信号、照应信号、数据接纳、完结信号。
读取数据步骤:
起始信号:服务器(开发板)接入数据线的I/O输入低电平,且低电平坚持期间不能小于 18ms
DATA_GPIO_OUT(0);//数据线输入低电平delay_1ms(19);//起始信号坚持期间19msDATA_GPIO_OUT(1);//服务器监禁总线delay_uus( 20 );//拉高期待
2.照应信号:期待模块的照应信号来到。将数据线改为输入形式,假设接入到低电平,说明接纳到模块的照应。
DHT11_GPIO_Mode_IN();//数据线转为输入形式//假设前面没有失误,则模块会收回低电平的应对信号,//所以间接期待DHT11拉高,83usmeout = 5000;while( (! alt="wKgaombezDCAPKz1AAAOIPxofP859.webp">#define CHECK_TIME 28 //超越0值的高电平期间f(i=0;i<40;i++)//循环接纳40位数据{timeout = 5000;//期待低电平过去while( ( !DATA_GPIO_IN ) && (timeout > 0) ) timeout--; //54usdelay_uus(CHECK_TIME);//期待超越位数据0值的高电平期间if ( alt="wKgaombezDGAWixvAAAD0rhXYR424.webp">DHT11_GPIO_Mode_OUT();//转为输入形式DATA_GPIO_OUT(1);//服务器监禁总线数据接纳成功,然而这40位数据要如何转化为温湿度数据?并如何保障传输的数据没有失误?
DHT11模块一次性完整的数据传输为40bit,高位先出。数据格局:
8bit湿度整数数据 + 8bit湿度小数数据 + 8bi温度整数数据 + 8bit温度小数数据 + 8bit校验和
留意
湿度小数局部数据不时为0。
数据传送正确时,校验和数据等于“8bit湿度整数数据+8bit湿度小数数据 +8bi温度整数数据+8bit温度小数数据”所得结果的末8位。举几个例子。
示例一:接纳的40位数据区分为:
湿度高8位 | 湿度低8位 | 温度高8位 | 温度低8位 | 校验位 |
校验和为 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 = 0101 0001,与接纳的数据分歧
湿度为 0011 0101 + 0000 0000 = 35 + 0 = 35%RH
温度为 0001 1000 0000 0100 = 24 + 4 = 24.4℃
示例二:接纳的40位数据区分为:
湿度高8位 | 湿度低8位 | 温度高8位 | 温度低8位 | 校验位 |
校验和为 0011 0101 + 0000 0000 + 0001 1000 + 0000 0100 = 0101 0001,与接纳的数据不分歧 计算的数据为0101 0001,接纳的数据为0100 1001,两者不分歧说明数据不准确,摈弃这次数据,从新接纳。
以下为数据处置的实现代码:
//val为接纳到的40位数据。//湿高8+ 湿低8+ 温高8+ 温低8verify_num = (val>>32) + (val>>24) + (val>>16) + (val>>8);//计算的校验和 与 接纳的校验和 的差为0说明分歧,不为0说明不分歧//(val&0xff)是由于val的大小为64位,咱们只有要val的最后8位校验和verify_num = verify_num - (val&0xff);//启动校验if( verify_num )//假设不为0,说明校验失败{//校验失误return 0;}else //校验成功{//数据处置humidity = (val>>32)&0xff;//湿度前8位(小数点前数据)small_point = (val>>24)&0x00ff;//湿度后8位(小数点后数据)small_point = small_point * 0.1;//换算为小数点humidity = humidity + small_point; //小数前+小数后printf("湿度:%.2frn",humidity);mperature = (val>>16)&0x0000ff;//温度前8位(小数点前数据)small_point = (val>>8)&0x000000ff; //温度后8位(小数点后数据)small_point = small_point * 0.1;//换算为小数点temperature = temperature + small_point;//小数前+小数后printf("温度:%.2frn",temperature);return val>>8; //前往未处置的数据}
3.2引脚选用
该模块有3个引脚,详细引脚衔接见 表 各引脚衔接。
3.3移植至工程
工程模板下载请检查入门手册百度链接
而后咱们关上空白工程,新建两个文件dht11.c和dht11.h
在文件dht11.c中,编写如下代码。
/* * Change Logs: * DateAuthorNotes * 2024-06-19LCKFB-LPfit version */#include "dht11.h"#include "stdio.h"float temperature = 0;float humidity = 0;/****************************************************************** * 函 数 名 称:DHT11_GPIO_Init * 函 数 说 明:DHT11温湿度传感器初始化 * 函 数 形 参:无 * 函 数 返 回:无 * 作者:LC * 备注:无******************************************************************/void DHT11_GPIO_Init(void){GPIO_InitTypeDefGPIO_InitStruct; // GPIO初始化结构体RCC_DHT11_GPIO_ENABLE();// 使能GPIO时钟GPIO_InitStruct.Pins = GPIO_DHT11;// GPIO引脚GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;// 推挽输入GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;// 输入速度高GPIO_Init(PORT_DHT11, &GPIO_InitStruct);// 初始化DATA_GPIO_OUT(1);}/****************************************************************** * 函 数 名 称:DHT11_GPIO_Mode_OUT * 函 数 说 明:性能DHT11的数据引脚为输入形式 * 函 数 形 参:无 * 函 数 返 回:无 * 作者:LC * 备注:无******************************************************************/void DHT11_GPIO_Mode_OUT(void){GPIO_InitTypeDefGPIO_InitStruct; // GPIO初始化结构体GPIO_InitStruct.Pins = GPIO_DHT11;// GPIO引脚GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;// 推挽输入GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;// 输入速度高GPIO_Init(PORT_DHT11, &GPIO_InitStruct);// 初始化}/****************************************************************** * 函 数 名 称:DHT11_GPIO_Mode_IN * 函 数 说 明:性能DHT11的数据引脚为输入形式 * 函 数 形 参:无 * 函 数 返 回:无 * 作者:LC * 备注:无******************************************************************/void DHT11_GPIO_Mode_IN(void){GPIO_InitTypeDefGPIO_InitStruct; // GPIO初始化结构体GPIO_InitStruct.Pins = GPIO_DHT11;// GPIO引脚GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;// 上拉输入GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;// 输入速度高GPIO_Init(PORT_DHT11, &GPIO_InitStruct);// 初始化}/****************************************************************** * 函 数 名 称:DHT11_Re_Data * 函 数 说 明:依据时序读取温湿度数据 * 函 数 形 参:无 * 函 数 返 回:0=数据校验失败其余=温湿度未处置的数据 * 作者:LC * 备注:无******************************************************************/unsigned int DHT11_Read_Data(void){int i;long long val=0;int timeout=0;float small_point=0;unsigned char verify_num = 0;//验证值DATA_GPIO_OUT(0);//数据线输入低电平delay_ms(19);//起始信号坚持期间19msDATA_GPIO_OUT(1);//服务器监禁总线delay_us( 20 );//拉高期待DHT11_GPIO_Mode_IN();//数据线转为输入形式//假设前面没有失误,则模块会收回低电平的应对信号,所以间接期待DHT11拉高,80ustimeout = 5000;while( (! target="_blank">.h"#include "dht11.h"int32_t main(void){board_init();// 开发板初始化uart1_init(115200);// 串口1波特率115200DHT11_GPIO_Init();//DHT11引脚初始化delay_ms(1000);printf("DHT11 demo startrn");while(1){//读取模块数据DHT11_Read_Data();//显示读取后的温度数据printf("temperature = %.2frn", Get_temperature() );//显示读取后的湿度数据printf("humidity = %.2frn", Get_humidity() );delay_ms(1000);}}
上电成果:
模块移植成功案例代码:
链接:提取码:LCKF审核编辑 黄宇