芯源半导体CW32
直播中

yinwuqing

12年用户 2548经验值
擅长:MEMS/传感技术,嵌入式技术,接口/总线/驱动
私信 关注

【CW32饭盒派开发板试用体验】DHT11温湿度检测

最近温度比较高,好多人都开启了空调模式,今天使用手头上的DHT11模块来实时测试一下当前室内的温度。CW32饭盒派提供了许多传感器的扩展接口,这里使用到H2电子秤的接口,因为这样的接口能够与DHT11模块的四脚无缝对接。
我们来认识一下DHT11模块的实物吧
DHT11引脚.png

由上图可知,模块的第3脚是空的,其它三个脚的分布与H2母座接口相匹配。
H2接口原理图.png

部分代码如下:

#include "main.h"
#include "Lcd_Driver.h"
#include "LCD_calculate.h"
#include "dht11.h"

unsigned int counttime=0;
float temperature;  	    
uint8_t humidity; 
char buff_1[15];
char buff_2[15];

void GPIO_Configuration(void);
void RCC_Configuration(void);
void BTIM_init(void);

int main()
{	
	RCC_Configuration();  
	GPIO_Configuration();
	BTIM_init();
	
	Lcd_Init();
	Lcd_Clear(GRAY0); 
	Redraw_Mainmenu();
	
	while(DHT11_GPIO_Config())
	{
	}
	
	while(1)
	{
		if(counttime>200)                         
		{
			counttime=0;
		 	DHT11_Read_Data(&temperature,&humidity);	
			sprintf(buff_1,"%0.1f",temperature);
			sprintf(buff_2,"%d",humidity);  
		    Gui_DrawFont_GBK16(90,25,BLUE,GRAY0,buff_1);	
		    Gui_DrawFont_GBK16(90,47,BLUE,GRAY0,buff_2);
		}
	}
}


void RCC_Configuration(void)
{
  RCC_HSI_Enable(RCC_HSIOSC_DIV6);
  RCC_HCLKPRS_Config(RCC_HCLK_DIV1);
  RCC_PCLKPRS_Config(RCC_PCLK_DIV1);
  
  RCC_PLL_Enable(RCC_PLLSOURCE_HSI, 8000000, 8); 
  
  __RCC_FLASH_CLK_ENABLE();
  FLASH_SetLatency(FLASH_Latency_3);   
    
  RCC_SysClk_Switch(RCC_SYSCLKSRC_PLL);
  RCC_SystemCoreClockUpdate(64000000);	
}


void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
  __RCC_GPIOB_CLK_ENABLE();

  GPIO_InitStruct.IT = GPIO_IT_NONE; 
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pins = GPIO_PIN_0;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
  GPIO_WritePin(CW_GPIOB,GPIO_PIN_1,GPIO_Pin_SET);
}

void BTIM_init(void)
{
   BTIM_TimeBaseInitTypeDef BTIM_InitStruct;
   __RCC_BTIM_CLK_ENABLE();
   __disable_irq(); 
  NVIC_EnableIRQ(BTIM1_IRQn); 
  __enable_irq();
	
  BTIM_InitStruct.BTIM_Mode = BTIM_Mode_TIMER;
  BTIM_InitStruct.BTIM_OPMode = BTIM_OPMode_Repetitive;
  BTIM_InitStruct.BTIM_Period = 9000;
  BTIM_InitStruct.BTIM_Prescaler = BTIM_PRS_DIV8;
  BTIM_TimeBaseInit(CW_BTIM1, &BTIM_InitStruct);
	
  BTIM_ITConfig(CW_BTIM1, BTIM_IT_OV, ENABLE);
  BTIM_Cmd(CW_BTIM1, ENABLE);
}

void BTIM1_IRQHandler(void)
{
 static unsigned int count2=0;
 if(BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
  {
    BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);
		count2++;
		counttime++;
		if(count2>=500)
		{
				count2=0; 
				PB00_TOG();
		}
	}
}
#include "dht11.h"
	
//复位DHT11
void DHT11_Rst(void)	   
{                 
		PB08_DIR_OUTPUT(); 	//PB12配置成输出
		PB08_SETLOW(); 	    //拉低DQ
	        delay1ms(20);
		PB08_SETHIGH(); 	  //DQ=1 
	        delay10us(3);
}
//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
uint8_t DHT11_Check(void) 	   
{   
	uint8_t retry=0;
  PB08_DIR_INPUT();  //PB12配置成输入
  while (PB08_GETVALUE()&&retry<10)//DHT11会拉低40~80us
	{
		retry++;
		delay10us(1);
	};	 
	
	if(retry>=10)return 1;
	else retry=0;
  while (!PB08_GETVALUE()&&retry<10)//DHT11拉低后会再次拉高40~80us
	{
		retry++;
		delay10us(1);
	};

	if(retry>=10)return 1;	    
	return 0;
}
//从DHT11读取一个位
//返回值:1/0
uint8_t DHT11_Read_Bit(void) 			 
{
 	uint8_t retry=0;
	while(PB08_GETVALUE()&&retry<10)//等待变为低电平
	{
		retry++;
		delay10us(1);
	}
	retry=0;
	while(!PB08_GETVALUE()&&retry<10)//等待变高电平
	{
		retry++;
		delay10us(1);
	}
	delay10us(4);//等待40us
	if(PB08_GETVALUE())return 1;
	else return 0;		   
}
//从DHT11读取一个字节
//返回值:读到的数据
uint8_t DHT11_Read_Byte(void)    
{        
    uint8_t i,dat;
    dat=0;
	for (i=0;i<8;i++) 
	{
   		dat<<=1; 
	    dat|=DHT11_Read_Bit();
    }						    
    return dat;
}
//从DHT11读取一次数据
//temp:温度值(范围:0~50°)
//humi:湿度值(范围:20%~90%)
//返回值:0,正常;1,读取失败
uint8_t DHT11_Read_Data(float *temp,uint8_t *humi)    
{        
	char buf[5];
	uint8_t i;
	DHT11_Rst();
	if(DHT11_Check()==0)
	{
		for(i=0;i<5;i++)//读取40位数据
		{
			buf[i]=DHT11_Read_Byte();
		}
		if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
		{
			*humi=buf[0];
			*temp=buf[2];
		}
	}else return 1;
	return 0;	    
}
//初始化DHT11的IO口 DQ 同时检测DHT11的存在
//返回1:不存在
//返回0:存在    	 
uint8_t DHT11_GPIO_Config ( void )
{		
   GPIO_InitTypeDef GPIO_InitStruct;
	
   __RCC_GPIOB_CLK_ENABLE();

  GPIO_InitStruct.IT = GPIO_IT_NONE; 
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pins = GPIO_PIN_8;
  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
  DHT11_Rst();  //复位DHT11
  return DHT11_Check();//等待DHT11的回应
}

工程编译后,下载到开发板中。TFT屏上展现的是室内实时的温湿度数值。
DHT11实测1.jpg

此时再将手握住DHT11模块的表面,等待3s左右,TFT屏上显示的温度值由原来的31℃更新为32℃。
DHT11实测2.jpg

这里暂且不能确定采集的湿度值是否准确,但温度采集的数值是比较准确的,因为此时此刻的温度在智能手环上也属这个范围。此次评测到此告一段落,感谢武汉芯源提供的CW32饭盒派开发板,也感谢发烧友提供的试用平台。
手环报温度值.jpg

更多回帖

发帖
×
20
完善资料,
赚取积分