Verwenden Sie STM32F103ZET6, um die Anzeige der seriellen Schnittstelle für Temperatur und Luftfeuchtigkeit nach DHT11 zu erfassen

Über DHT11

DHT11 ist ein digitaler Temperatur- und Feuchtigkeitssensor, DHT11 ist ein zusammengesetzter Temperatur- und Feuchtigkeitssensor mit kalibriertem digitalem Signalausgang. Es verwendet eine spezielle Technologie zur Erfassung digitaler Module sowie eine Temperatur- und Feuchtigkeitssensortechnologie, um sicherzustellen, dass das Produkt zuverlässige Stabilität, schnelle Reaktion und starke Entstörungsfähigkeit aufweist. Der Sensor enthält ein Sensorelement mit hoher Polymerwiderstandsfeuchtigkeit und ein NTC-Temperaturmesselement. Er ist mit einem Hochleistungs-8-Bit-Einzelchip-Mikrocomputer verbunden und kommuniziert mit dem Mikroprozessor über einen einzelnen Bus. Es wird nur ein Draht benötigt.
Fügen Sie hier eine Bildbeschreibung ein

Verwandte Parameter

1. DHT11-Datenstruktur
Der digitale Feuchtigkeitstemperatursensor DHT11 verwendet das Datenformat für einen einzelnen Bus. Das heißt, ein einzelner Daten-Pin-Port vervollständigt die bidirektionale Eingabe- und Ausgabeübertragung. Sein Datenpaket besteht aus 5Byte (40Bit). Die Daten sind in Dezimalteil und Ganzzahlteil unterteilt. Das spezifische Format wird unten erläutert.
Eine vollständige Datenübertragung ist 40 Bit, und die hohe Ordnung kommt zuerst heraus.
Datenformat: 8-Bit-Feuchtigkeits-Integer-Daten + 8-Bit-Feuchtigkeits-Dezimaldaten + 8-Bit-Temperatur-Integer-Daten + 8-Bit-Temperatur-Dezimaldaten + 8-Bit-Prüfsumme Die
Prüfsummen-Daten sind die Addition der ersten vier Bytes.
Die Ausgabe von Sensordaten sind nicht codierte Binärdaten. Daten (Luftfeuchtigkeit, Temperatur, Ganzzahl, Dezimalzahl)
sollten separat behandelt werden. Wenn zu einem bestimmten Zeitpunkt die folgenden 5-Byte-Daten vom Sensor gelesen werden: Die
Fügen Sie hier eine Bildbeschreibung ein
Berechnungsmethode für Temperatur und Luftfeuchtigkeit kann aus dem obigen Datenformat
Humi (Luftfeuchtigkeit) = Byte4 erhalten werden. Byte3 = 45,0 (% relative Luftfeuchtigkeit)
Temp (Temperatur) = Byte2. Byte1 = 28,0 (℃)
Jiaoyan (Prüfung) = Byte4 + Byte3 + Byte2 + Byte1 = 73 (= Humi + Temp) (Prüfung korrekt)
2. Timing der DHT11-Übertragungsdaten Nachdem der
Host das Startsignal gesendet hat, warten Sie vor dem Lesen auf 20us-40us Das Antwortsignal von DH11T lautet: Wenn der Bus als niedriger Pegel verwendet wird, sendet DHT11 ein Antwortsignal. Nachdem DHT11 ein Antwortsignal gesendet hat, ziehen Sie den Bus nach oben und bereiten Sie das Senden von Daten vor. Jedes Datenbit beginnt mit einem niedrigen Pegel.
Fügen Sie hier eine Bildbeschreibung ein
3. Die Nummer "0" und die Nummer "1" von DHT11 geben die Methode an
Die Nummer 0 und Nummer 1 von DHT11 unterscheiden sich von den üblichen. Die allgemeinen Daten bedeuten, dass 0 ein niedriger Pegel und 1 ein hoher Pegel ist. DHT11 ist unterschiedlich. Nach dem Start der Datenübertragung bedeutet die Nummer 0 einen hohen Pegel Darstellung von Nummer 1 ist High Level 116-118us.
Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Code-Artikel

Der in diesem Experiment definierte E / A-Port ist PB11, und die übertragenen Daten sind serielle Schnittstelle
1. Der Host sendet das Startsignal an DHT11, dh der Mikrocontroller wird für 18 ms heruntergezogen und dann für 20-40us hochgezogen.

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 sendet ein Antwortsignal an den Host (32 Einzelchip-Mikrocomputer), die Datenleitung von DHT11 wird um 40-50us heruntergezogen, und um 40-50us erkennt der E / A-Port des Einzelchip-Computers das Signal.

函数名: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 beginnt mit der Übertragung von Daten an den Einzelchip-Mikrocomputer. Es gibt zwei Datenübertragungsfunktionen, eine zum Übertragen von Bytes, und die Funktion zum Übertragen einer 8-Bit-Zeichenfolge wird durch die Funktion zum Übertragen von Bytes geschrieben.

函数名: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. Nachdem die DHT11-Datenerfassung abgeschlossen ist, wird sie über die Hauptfunktion an der seriellen Schnittstelle angezeigt

函数名: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);
	 }
	  
 }
 

Verdrahtung und experimentelle Ergebnisse

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

um zusammenzufassen

DHT11 ist ein Temperatur- und Feuchtigkeitsmodul mit einer relativ hohen Kostenleistung. Es ist relativ intuitiv, Temperatur und Luftfeuchtigkeit über eine serielle Schnittstelle anzuzeigen. Wenn Sie solche Artikel über einen längeren Zeitraum veröffentlichen, beachten Sie dies bitte.

Ich denke du magst

Origin blog.csdn.net/qq_42250136/article/details/112963129
Empfohlen
Rangfolge