STM32F407研究ノート-DHT11モジュール(温度および湿度センサー)

STM32F407研究ノート-DHT11モジュール(温度および湿度センサー)

1.基本原理:
DHT11センサーを制御し、DHT11モジュールのタイミングを制御してデータを読み取ります。バスのアイドル状態がハイです。マイクロコントローラーがバスをローにプルし、DHT11が応答するのを待ちます。プルダウン時間が長くなります。 DHT11がそれを検出できることを保証するために18ms以上。信号を開始します。DHT11は、マイクロコントローラの開始信号を受信すると、マイクロコントローラの開始信号の終了を待ってから、80usの低レベル応答信号を送信します。MCUが開始信号を送信した後、20〜40usの遅延の後、入力状態に切り替え、DHT11の80us低レベル信号の終了を待ってから、DHT11が80usの高レベルを送信するかどうかを判断します。 、データの収集を開始します。

デジタル0のシーケンス:DHT11がデジタル0を出力する場合、シングルチップマイクロコンピューターによって読み取られる信号は50 usの低レベルであり、次に26〜28usの高レベルです。

番号1のシーケンス:DHT11が番号0を出力する場合、シングルチップマイクロコンピュータによって読み取られる信号は50 usの低レベルであり、次に70usの高レベルです。

データ形式:8ビット湿度整数データ+8ビット湿度10進データ+ 8bi温度整数データ+8ビット温度10進データ+8ビットチェックサム

8ビットチェックサム:8ビット湿度整数データ+8ビット湿度10進データ+ 8bi温度整数データ+8ビット温度10進データ」を使用して、結果の最後の8ビットを追加します。

2.コード機能:
DHT11モジュールは、シングルチップマイクロコンピューターによって制御され、温度と湿度、およびシリアルポートのフィードバックを測定します。

3.配線:
VCC——VCC、GND——GND、DATA——PF0

第四に、コード部分:
dht.h

#ifndef __DHT_H
#define	__DHT_H

#include "sys.h"
#include "delay.h"
#include "usart.h"

#define IO_DHT11 GPIO_Pin_0
#define GPIO_DHT11 GPIOF

#define DHT11_DQ_High GPIO_SetBits(GPIO_DHT11,IO_DHT11)
#define DHT11_DQ_Low GPIO_ResetBits(GPIO_DHT11,IO_DHT11)

void DHT11_IO_OUT(void);
void DHT11_IO_IN (void);
void DHT11_Init(void);
void DHT11_Rst(void);
u8 DHT11_Read_Data(u8 *temp,u8 *humi);
u8 DHT11_Read_Byte(void);
u8 DHT11_Read_Bit(void);
u8 DHT11_Check(void);

#endif

dht.c

#include "dht.h"



void DHT11_IO_IN (void)
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOF,GPIO_Pin_0);
	
}

void DHT11_IO_OUT (void)
{
    
    
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOF, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOF,GPIO_Pin_0);

}

void DHT11_Rst(void)
{
    
    
	DHT11_IO_OUT();
	DHT11_DQ_Low;
	delay_ms(20);
	DHT11_DQ_High;
	delay_us(30);

}

u8 DHT11_Check(void)
{
    
    
	u8 retry=0;
	DHT11_IO_IN();
	
	while ((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==1)&&retry<100)
	{
    
    
		retry++;
		delay_us(1);
	};
	
	if(retry>=100)
		return 1;
	else retry=0;
	
	while ((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==0)&&retry<100)
	{
    
    
		retry++;
		delay_us(1);
	};	
	if(retry>=100)
		return 1;
		return 0;
	
}

u8 DHT11_Read_Bit(void)
{
    
    
	u8 retry=0;
	while ((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==1)&&retry<100)
	{
    
    
		retry++;
		delay_us(1);
	};
	retry=0;
	while ((GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==0)&&retry<100)
	{
    
    
		retry++;
		delay_us(1);
	};	
	delay_us(50);
	if(GPIO_ReadInputDataBit(GPIO_DHT11,IO_DHT11)==1)
	return 1;
	else 
	return 0;

}

u8 DHT11_Read_Byte(void)
{
    
    
	u8 i,dat;
	dat=0;
	for (i=0;i<8;i++)
	{
    
    
		dat<<=1;
		dat|=DHT11_Read_Bit();
	}
	return dat;
}

u8 DHT11_Read_Data(u8 *temp,u8 *humi)
{
    
    
	u8 buf[5];
	u8 i;
	DHT11_Rst();
	if(DHT11_Check()==0)
	{
    
    
		for (i=0;i<5;i++)
		{
    
    
			buf[i]=DHT11_Read_Byte();		
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
    
    
			*temp=buf[2];
			*humi=buf[0];
		}		
	}
	else return 1;
	return 0;
}

void DHT11_Init(void)
{
    
    
	DHT11_Rst();
	DHT11_Check();
}


mian.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include	"led.h"
#include	"beep.h"
#include	"key.h"
#include "dht.h"

int main(void)
{
    
    
	u8 wd=0;
	u8 sd=0;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init(168);
	uart_init(115200);
	DHT11_Init();

	while(1)
	{
    
    
		DHT11_Read_Data(&wd,&sd);
		printf("ζȣº%d ¡¯C\r\n",wd);
		printf("滦飼%d %%r\n",sd);
		delay_ms(1000);
		delay_ms(1000);	
	}
}

PS:stm32f407zgt6に基づいて正常にテストされました

この記事のリファレンス:DHT11温度および湿度センサーの原理とドライバーの詳細な説明

初心者が学び、使用するためだけに

おすすめ

転載: blog.csdn.net/weixin_54121461/article/details/114118934
おすすめ