【AT32F421测评】+ DHT22温湿度检测
[复制链接]
本帖最后由 jinglixixi 于 2021-5-20 23:36 编辑
DHT22是一种常见的数字式温湿度传感器,它采用单总线方式进行工作,故较为节省GPIO口资源。将它与OLED屏组合在一起即可形成一个小巧而便捷的温湿度检测装置,其起始界面和工作界面分别如图1和图2所示。
图1 起始界面
图2 工作界面
DHT22与MCU的连接关系为:
Dat---PB11
VCC---5V
GND--- GND
实现DHT22输出高低电平及读取的语句定义为:
#define DHT22_D0_H GPIOB->BSRE= GPIO_Pins_11
#define DHT22_D0_L GPIOB->BRE= GPIO_Pins_11
#define DHT22_D0_R GPIO_ReadInputDataBit(GPIOB,GPIO_Pins_11)
DHT22的初始化函数为:
- uint8_t DHT22_Init(void)
- {
- GPIO_InitType GPIO_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
- GPIO_StructInit(&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OutType = GPIO_OutType_PP;
- GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- DHT22_Rst();
- return DHT22_Check();
- }
DHT22读取模式的设置函数为:
- void DHT22_IO_IN(void)
- {
- GPIO_InitType GPIO_InitStructure;
- RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
- GPIO_StructInit(&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pins = GPIO_Pins_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_Pull = GPIO_Pull_PD;
- GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- }
DHT22位读取函数为:
- uint8_t DHT22_Read_Bit(void)
- {
- uint8_t retry=0;
- while(DHT22_D0_R&&retry<100)
- {
- retry++;
- Delay_us(2);
- }
- retry=0;
- while(!DHT22_D0_R&&retry<100)
- {
- retry++;
- Delay_us(2);
- }
- Delay_us(40);
- if(DHT22_D0_R) return 1;
- else return 0;
- }
DHT22字节读取函数为:
- uint8_t DHT22_Read_Byte(void)
- {
- uint8_t i,dat;
- dat=0;
- for (i=0;i<8;i++)
- {
- dat<<=1;
- dat|=DHT22_Read_Bit();
- }
- return dat;
- }
实现显示效果的主程序为:
- int main(void)
- {
- uint8_t senflag;
- AT32_Board_Init();
- AT32_OLED_Init();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,0,"AT32F421",16);
- OLED_ShowString(0,2,"OLED & DHT22",16);
- senflag=DHT22_Init();
- Delay_ms(2000u);
- if(!senflag) OLED_ShowString(100,0,"NO",16);
- else OLED_ShowString(100,0,"OK",16);
- OLED_ShowString(0,2,"T= C H= %RH",16);
- while(1)
- {
- if(senflag)
- {
- DHT22_Read_Data(&temperature,&humidity);
- OLED_ShowNum(16,2,temperature,2,16);
- OLED_ShowNum(64,2,humidity,2,16);
- }
- Delay_ms(500u);
- AT32_LEDn_Toggle(LED2);
- }
- }
|