STM32F103ZET6を使用して、DHT11の温度と湿度のシリアルポートディスプレイを収集します

DHT11について

DHT11はデジタル温度および湿度センサーであり、DHT11は校正されたデジタル信号出力を備えた温度および湿度複合センサーです。専用のデジタルモジュール取得技術と温度および湿度検知技術を使用して、製品が信頼できる安定性、高速応答、および強力な干渉防止能力を備えていることを保証します。センサーは、高分子抵抗性湿度検知素子とNTC温度測定素子を含み、高性能8ビットシングルチップマイクロコンピューターと接続され、1本のバスでマイクロプロセッサーと通信します。必要なワイヤーは1本だけです。
ここに画像の説明を挿入

関連パラメータ

1.DHT11データ構造
DHT11デジタル湿度温度センサーはシングルバスデータフォーマットを採用しています。つまり、単一のデータピンポートが入力と出力の双方向伝送を完了します。そのデータパケットは5バイト(40ビット)で構成されています。データは小数部と整数部に分かれています。具体的な形式を以下に説明します。
完全なデータ転送は40ビットで、上位が最初に出力されます。
データ形式:8ビット湿度整数データ+8ビット湿度10進データ+8ビット温度整数データ+8ビット温度10進データ+8ビットチェック
サムチェックサムデータは、最初の4バイトを加算したものです。
センサーデータの出力は、コード化されていないバイナリデータです。データ(湿度、温度、整数、小数)
は個別に処理する必要があります。ある時点で、センサーから次の5バイトのデータを読み取る場合:
ここに画像の説明を挿入
温度と湿度の計算方法は、上記のデータ形式
humi(湿度)=バイト4から取得できます。バイト3 = 45.0(%RH)
温度(温度)= byte2。Byte1 = 28.0(℃)
jiaoyan(check)= byte4 + byte3 + byte2 + byte1 = 73(= humi + temp)(
checkcorrect 2。DHT11送信データタイミング
ホストが開始信号を送信した後、20us-40us待ってから読み取りますDH11Tの応答信号、読み取りバスをローレベルとすると、DHT11が応答信号を送信します。DHT11が応答信号を送信した後、バスをハイにプルしてデータ送信の準備をします。データの各ビットはローレベルから始まります。
ここに画像の説明を挿入
3.DHT11の番号「0」と番号「1」は方法を示します
DHT11の番号0と番号1は一般的なものとは異なります。一般的なデータは0が低レベルで1が高レベルであることを意味します。DHT11は異なります。データ送信開始後、番号0は高レベルを意味します。26-28us、番号1の表現は高レベル116-118usです。
ここに画像の説明を挿入

ここに画像の説明を挿入

コード記事

この実験で定義されたIOポートはPB11であり、送信データはシリアルポート
1です。ホストは開始信号をDHT11に送信します。つまり、マイクロコントローラーは18msの間プルダウンされ、次に20〜40usの間プルアップされます。

static void DHT11_Rst(void)
{
    
                    
		GPIO_SETOUT();											//配置成输出模式
    GPIO_ResetBits(DHT11_IO,DHT11_PIN); //拉低数据线
    Delay_ms(20);    										//拉低至少18ms
    GPIO_SetBits(DHT11_IO,DHT11_PIN); 	//拉高数据线 
	  Delay_us(30);     									//主机拉高20~40us
		GPIO_ResetBits(DHT11_IO,DHT11_PIN);
}

2. DHT11はホスト(32個のシングルチップマイクロコンピューター)に応答信号を送信し、DHT11のデータラインは40-50usだけプルダウンされ、40-50usまでにシングルチップコンピューターのIOポートが検出します。信号。

函数名:static u8 DHT11_Check(void)
参数说明:无
返回值:检测到回应-->返回1,否则0
函数作用:检测DHT11的响应信号
***********************************************/
static u8 DHT11_Check(void) 	   
{
    
       
	u8 retry=0;
	GPIO_SETIN();			//设置为输入模式	
	
  while (!GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//DHT11会拉低40~50us
	{
    
    
		retry++;
		Delay_us(1);
	}
	if(retry >= 100)	//超时未响应/未收到开始信号,退出检测
		return 0;
	else 
		retry = 0;
  while (GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//DHT11拉低后会再次拉高40~50us
	{
    
    
		retry++;
		Delay_us(1);
	}
	if(retry>=100)		//超时,DHT11工作出错,退出检测
		return 0;
	return 1;					//设备正常响应,可以正常工作
}

3. DHT11はシングルチップマイクロコンピュータへのデータ転送を開始します。データ転送機能は2つあります。1つはバイトを送信する機能で、もう1つはバイトを送信する機能によって8ビット文字列を送信する機能です。

函数名:static u8 DHT11_Read_Bit(void)
参数说明:无
返回值:返回从DHT11上读取的一个Bit数据
函数作用:从DHT11上读取一个Bit数据
***********************************************/
static u8 DHT11_Read_Bit(void)
{
    
    
 	u8 retry = 0;
	//DHT11的Bit开始信号为12-14us低电平
	while(GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//等待变为低电平(等待Bit开始信号)
	{
    
    
		retry++;
		Delay_us(1);
	}
	retry = 0;
	while(!GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN) && retry<100)//等待变高电平(代表数据开始传输)
	{
    
    
		retry++;
		Delay_us(1);
	}
	Delay_us(30);//等待30us
	//0信号为26-28us,1信号则为116-118us,所以说超过30us去读取引脚状态就可以知道传输的值了
	if(GPIO_ReadInputDataBit(DHT11_IO,DHT11_PIN)) return 1;
	else return 0;		   
}


/***********************************************************************
函数名:static u8 DHT11_Read_Byte(void)
参数说明:无
返回值:返回从DHT11上读取的一个byte数据
函数作用:从DHT11上读取一个byte数据
************************************************************************/
static u8 DHT11_Read_Byte(void)    
{
    
            
  u8 i,dat;
  dat=0;
	
	for (i=0;i<8;i++) 
	{
    
    
   	dat<<=1; 
	  dat|=DHT11_Read_Bit();
  }	
	
  return dat;
}

4. DHT11データ収集が完了すると、メイン機能を介してシリアルポートに表示されます。

函数名:int main(void)
参数说明:无
返回值:无
函数作用:主函数
***************************************************************************/
 int main(void)
 {
    
    	
	 
   clock_init();
	 uart_init(115200);		//初始化串口
	 printf("wecome to DHT11");
	 
	 
	 //初始化DHT11(有BUG,第一次上电总是失败,按一下复位按钮又能进了)
	 if(!DHT11_Init()){
    
    
		 printf("\r\n EEROR! THE DHT11 HAS NO RESPOND...");
		 //while(1);
	 }
	 printf("\r\n THE DHT11 HAS RESPOND");
	 Delay_ms(10);		//这里延时10ms主要是因为,刚刚接收到响应信息,要等DHT11发送完信息
	 
	 while(1)
	 {
    
    
		 if(DHT11_Read_Data(&temp,&humi))
			printf("\r\n temp:%d,humi:%d",temp,humi);
		 else
		 //printf("\r\n EEROR! THE DHT11 HAS NO RESPOND...");//由于是库函数编程,不能准确把握函数的执行时间,
																													//所以会经常出现这条警告信息
		 Delay_ms(100);
	 }
	  
 }
 

配線と実験結果

ここに画像の説明を挿入

ここに画像の説明を挿入

総括する

DHT11は、コストパフォーマンスが比較的高い温湿度モジュールです。シリアルポートで温度と湿度を表示するのは比較的直感的です。このような記事を長期間公開する場合は、注意してください。

おすすめ

転載: blog.csdn.net/qq_42250136/article/details/112963129