企业宣传,产品推广,广告招商,广告投放联系seowdb

DHT11温湿度传感器 CW32模块经常使用

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审核编辑 黄宇

© 版权声明
评论 抢沙发
加载中~
每日一言
不怕万人阻挡,只怕自己投降
Not afraid of people blocking, I'm afraid their surrender