一、DHT11產(chǎn)品介紹
DHT11是數(shù)字溫濕度傳感器,測(cè)量范圍:濕度20%-95%,溫度0-50℃,廣泛應(yīng)用于加濕器、溫濕度計(jì)、空調(diào)、汽車等領(lǐng)域。
二、典型應(yīng)用電路
如上圖DATA引腳用于MCU與DHT11之間的通訊和同步,采用單總線數(shù)據(jù)格式,一次通訊時(shí)間4ms左右(超時(shí)時(shí)間的判斷)。一次完整的數(shù)據(jù)傳輸為40bit,高位先出(MSB最高有效位有線傳輸)
數(shù)據(jù)傳送正確時(shí)校驗(yàn)和數(shù)據(jù)等于:8bit濕度整數(shù)數(shù)據(jù)+8bit濕度小數(shù)數(shù)據(jù)+8bit溫度整數(shù)數(shù)據(jù)+8bit溫度小數(shù)數(shù)據(jù),所得結(jié)果的末8位。
如:
濕度:60.5% 60 05
溫度:26.7℃ 26 07
60+5+26+7=98
98&0xFF=98=1001 1000
三、DHT11溫濕度模塊的通信過(guò)程
四、示例代碼
顯示室內(nèi)溫度和濕度
效果圖:
1、DHT11初始化
void dht11_init(void)
{
//打開端口G的硬件時(shí)鐘,就是供電
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //9號(hào)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //開漏
GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,響應(yīng)越快,但是功耗會(huì)更高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不使能上下拉電阻
GPIO_Init(GPIOG,&GPIO_InitStructure);
//只要有輸出模式,肯定會(huì)有初始電平的狀態(tài),看連接設(shè)備的說(shuō)明書
PGout(9)=1;
}
2、文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-523661.html
int32_t dht11_read(uint8_t *buf)
{
uint32_t t=0;
int32_t i=0,j=0;
uint8_t d=0;
uint8_t *p=buf;
uint8_t check_sum=0;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //9號(hào)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //輸出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //開漏
GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,響應(yīng)越快,但是功耗會(huì)更高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不使能上下拉電阻
GPIO_Init(GPIOG,&GPIO_InitStructure);
PGout(9)=0;
delay_ms(18);
PGout(9)=1;
delay_us(30);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //9號(hào)引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //輸入模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //開漏
GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,響應(yīng)越快,但是功耗會(huì)更高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不使能上下拉電阻
GPIO_Init(GPIOG,&GPIO_InitStructure);
//等待低電平出現(xiàn)
t=0;
while(PGin(9))
{
t++;
delay_us(1);
if(t >= 4000)
return -1;
}
//用超時(shí)檢測(cè)的方法測(cè)量低電平的合法性
t=0;
while(PGin(9)==0)
{
t++;
delay_us(1);
if(t >= 100)
return -2;
}
//用超時(shí)檢測(cè)的方法測(cè)量高電平的合法性
t=0;
while(PGin(9))
{
t++;
delay_us(1);
if(t >= 100)
return -3;
}
for(j=0; j<5; j++)
{
//接收一個(gè)字節(jié)的數(shù)據(jù)
for(d=0,i=7; i>=0; i--)
{
//用超時(shí)檢測(cè)的方法測(cè)量低電平的合法性
t=0;
while(PGin(9)==0)
{
t++;
delay_us(1);
if(t >= 100)
return -4;
}
//延時(shí)40us (延時(shí)時(shí)間在28us ~ 70us)
delay_us(40);
if(PGin(9))
{
d|=1<<i; //將d變量對(duì)應(yīng)的bit置1
//等待高電平持續(xù)完畢
t=0;
while(PGin(9))
{
t++;
delay_us(1);
if(t >= 100)
return -5;
}
}
}
p[j]=d;
}
//延時(shí)50us,可以忽略通訊結(jié)束的低電平
delay_us(50);
//計(jì)算校驗(yàn)和,檢查接收到的數(shù)據(jù)是否準(zhǔn)確
check_sum = (p[0]+p[1]+p[2]+p[3])&0xFF;
if(check_sum == p[4])
return 0;
return -6;
}
3、main函數(shù)實(shí)現(xiàn)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-523661.html
int main(void)
{
uint8_t buf[5];
int32_t rt;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
/* 初始化串口1波特率為115200bps,若發(fā)送/接收數(shù)據(jù)有亂碼,請(qǐng)檢查PLL */
usart1_init(115200);
dht11_init();
printf("this is dht11 test\r\n");
printf("1<<6=%X \r\n",1<<6);
printf("1<<3=%X \r\n",1<<3);
while(1)
{
rt = dht11_read(buf);
if( rt == 0)
{
printf("T:%d.%d H:%d.%d\r\n",buf[2],buf[3],buf[0],buf[1]);
}
else
{
printf("dht11 read error code is %d\r\n",rt);
}
//官方要求,每6秒
delay_ms(6000);
}
}
到了這里,關(guān)于【STM32】DHT11溫濕度模塊傳感器詳解&代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!