DHT22是一款數字式溫濕度傳感器,它采用單總線方式工作。為此,在使用時需占用一個I/O口,來進行信息的收發處理,這里選用PF2來完成。 為進行溫濕度的檢測與顯示,對引腳的配置如圖1所示。
1.jpg (24.72 KB, 下載次數: 52)
下載附件
2020-8-25 12:04 上傳
圖1引腳配置
DHT22的初始化函數為: - unsigned char DHT22_Init(void)
- {
- DHT22_Rst();
- return DHT22_Check();
- }
復制代碼
讀取DHT22溫濕度的函數為: - unsigned char DHT22_Read_Data(unsigned int *temp,unsigned int *humi)
- {
- unsigned char buf[5];
- unsigned char i;
- DHT22_Rst();
- if(DHT22_Check()==0)
- {
- for(i=0;i<5;i++)
- {
- buf[i]=DHT22_Read_Byte();
- }
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
- {
- *humi=(buf[0]*256+buf[1]);
- *temp=(buf[2]*256+buf[3]);
- }
- }else return 1;
- return 0;
- }
復制代碼
相應的數值顯示函數為: - void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len)
- {
- uint8_t t,temp;
- uint8_t enshow=0;
- uint8_t size2=16;
- for(t=0;t<len;t++)
- {
- temp=(num/oled_pow(10,len-t-1))%10;
- if(enshow==0&&t<(len-1))
- {
- if(temp==0)
- {
- OLED_ShowChar(x+(size2/2)*t,y,' ');
- continue;
- }else enshow=1;
-
- }
- OLED_ShowChar(x+(size2/2)*t,y,temp+'0');
- }
- }
復制代碼
實現溫濕度顯示的主程序為: - int main(void)
- {
- unsigned char senflag;
- /* Initializes MCU, drivers and middleware */
- SYSTEM_Initialize();
- OLED_Init();
- OLED_CLS();
- OLED_P8x16Str(0,0,"ATmega4809");
- OLED_P8x16Str(0,2,"OLED Display");
- OLED_P8x16Str(0,4,"T= . C H= . %");
- DELAY_milliseconds(100);
- senflag=DH22_Init();
- /* Replace with your application code */
- while (1){
- if(senflag)
- {
- OLED_P8x16Str(64,0," SEN OK!");
- DHT22_Read_Data(&temperature,&humidity);
- OLED_ShowNum(16,4,temperature/10,2);
- OLED_ShowNum(40,4,temperature%10,1);
- OLED_ShowNum(80,4,humidity/10,2);
- OLED_ShowNum(104,4,humidity%10,1);
- }
- else
- {
- OLED_P8x16Str(64,0," NO SEN!");
- }
- //PORTF_toggle_pin_level(5);
- LED_Toggle();
- DELAY_milliseconds(1000);
- }
- }
復制代碼
經編譯下載,其運行效果如圖2所示。
2.jpg (18.78 KB, 下載次數: 50)
下載附件
2020-8-25 12:04 上傳
圖2 溫濕度顯示
|