最近温度比较高,好多人都开启了空调模式,今天使用手头上的DHT11模块来实时测试一下当前室内的温度。CW32饭盒派提供了许多传感器的扩展接口,这里使用到H2电子秤的接口,因为这样的接口能够与DHT11模块的四脚无缝对接。
我们来认识一下DHT11模块的实物吧
由上图可知,模块的第3脚是空的,其它三个脚的分布与H2母座接口相匹配。
部分代码如下:
#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"
void DHT11_Rst(void)
{
PB08_DIR_OUTPUT();
PB08_SETLOW();
delay1ms(20);
PB08_SETHIGH();
delay10us(3);
}
uint8_t DHT11_Check(void)
{
uint8_t retry=0;
PB08_DIR_INPUT();
while (PB08_GETVALUE()&&retry<10)
{
retry++;
delay10us(1);
};
if(retry>=10)return 1;
else retry=0;
while (!PB08_GETVALUE()&&retry<10)
{
retry++;
delay10us(1);
};
if(retry>=10)return 1;
return 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);
if(PB08_GETVALUE())return 1;
else return 0;
}
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;
}
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++)
{
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;
}
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();
return DHT11_Check();
}
工程编译后,下载到开发板中。TFT屏上展现的是室内实时的温湿度数值。
此时再将手握住DHT11模块的表面,等待3s左右,TFT屏上显示的温度值由原来的31℃更新为32℃。
这里暂且不能确定采集的湿度值是否准确,但温度采集的数值是比较准确的,因为此时此刻的温度在智能手环上也属这个范围。此次评测到此告一段落,感谢武汉芯源提供的CW32饭盒派开发板,也感谢发烧友提供的试用平台。