STM32F407 notas de estudio-módulo DHT11 (sensor de temperatura y humedad)

STM32F407 notas de estudio-módulo DHT11 (sensor de temperatura y humedad)

1. Principio básico:
controle el sensor DHT11 y lea los datos controlando la sincronización del módulo DHT11. El estado inactivo del bus es alto. El microcontrolador baja el bus y espera a que DHT11 responda. El tiempo de bajada es mayor de 18 ms para asegurarse de que DHT11 pueda detectarlo. Señal de inicio. Cuando DHT11 recibe la señal de inicio del microcontrolador, espera el final de la señal de inicio del microcontrolador y luego envía una señal de respuesta de bajo nivel de 80us. Después de que la MCU envíe la señal de inicio, después de un retraso de 20-40us, cambie al estado de entrada, espere el final de la señal de bajo nivel de 80us de DHT11, y luego juzgue si DHT11 envía un nivel alto de 80us; si es , comience a recopilar datos.

Secuencia de 0 digital: Cuando DHT11 emite 0 digital, la señal leída por el microordenador de un solo chip es un nivel bajo de 50 us, y luego un nivel alto de 26-28 us.

Secuencia del número 1: Cuando el DHT11 emite el número 0, la señal leída por el microordenador de un solo chip es un nivel bajo de 50 us, y luego un nivel alto de 70 us.

Formato de datos: datos enteros de humedad de 8 bits + datos decimales de humedad de 8 bits + datos enteros de temperatura de 8 bits + datos decimales de temperatura de 8 bits + suma de comprobación de 8 bits

Suma de comprobación de 8 bits: datos enteros de humedad de 8 bits + datos decimales de humedad de 8 bits + datos enteros de temperatura 8bi + datos decimales de temperatura de 8 bits "para agregar los últimos 8 bits del resultado.

2. Función de código: el
módulo DHT11 es controlado por el microordenador de un solo chip para medir la temperatura y la humedad y la retroalimentación en el puerto serie.

3. Cableado:
VCC —— VCC, GND —— GND, DATA —— PF0

Cuarto, la parte del código:
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);	
	}
}

PD: probado con éxito basado en stm32f407zgt6

Referencia para este artículo: explicación detallada del principio y el controlador del sensor de temperatura y humedad DHT11

Solo para principiantes para aprender y usar

Supongo que te gusta

Origin blog.csdn.net/weixin_54121461/article/details/114118934
Recomendado
Clasificación