2539|2

1510

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

【ESK32-360测评】+ DHT22与单总线检测温湿度 [复制链接]

  本帖最后由 jinglixixi 于 2020-8-29 08:53 编辑

DHT22是一种单总线的数字式温湿度传感器,它共有3个引脚,只需占用一个GPIO口接口工作。

通过这条总线既靠它发出指令,也靠它接收数据。此外,为了进行信号的识别,还需相应的时序配合。有了前面的I2C接口的基础,就可以探索一下DHT22的驱动及温湿度检测。

1. DHT22温湿度检测

DHT22与MCU的连接关系为:

DAT——PC12

其余两个引脚则接3.3V工作电源

定义GPIO口读取电位及输出高低电平的语句为:

#define DHT22_D0_H      HT_GPIOC->SRR = GPIO_PIN_12

#define DHT22_D0_L       HT_GPIOC->RR = GPIO_PIN_12

#define DHT22_D0_R      GPIO_ReadInBit(HT_GPIOC, GPIO_PIN_12)

 

设置GPIO为输入、输出的函数为:

void DHT22_IO_IN(void)
{
            AFIO_GPxConfig(GPIO_PC, GPIO_PIN_12, 0);
            GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_DOWN);
            GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DIR_IN);
            GPIO_InputConfig(HT_GPIOC, GPIO_PIN_12, ENABLE); 
}
void DHT22_IO_OUT(void)
{
      GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_DISABLE);
      GPIO_DriveConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DV_8MA);
      GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DIR_OUT);
      GPIO_InputConfig(HT_GPIOC, GPIO_PIN_12, ENABLE);
}

 

DHT22读取数据的函数为:

u8 DHT22_Read_Data(u16 *temp,u16 *humi)
{       
         u8 buf[5];
         u8 i;
         DHT22_Rst();
         if(DHT22_Check()==0)
         {
                   for(i=0;i<5;i++)
                   {
                            buf=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;     
}

实现图1所示效果的主程序为:


int main(void)
{
         u8 senflag;
         SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
         SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000);
         SYSTICK_IntConfig(ENABLE);
        
         HT32F_DVB_OUT_Init(); 
         HT_GPIOD->RR = GPIO_PIN_0;      
         Delayms(100);         
         UxART_Configuration();
         senflag=DHT22_Init();
         if(senflag) gHelloString[3] = '1';
         else     gHelloString[3] = '0';
         UxART_TxTest();     
         while(1)
         {
                     if(!senflag)
                     {
                                 DHT11_Read_Data(&temperature,&humidity);
                                 gHelloString[2] = temperature/100+'0';
                                 gHelloString[3] = temperature%100/10+'0';
                                 gHelloString[5] = temperature%10+'0';
                                 gHelloString[10] = humidity/100+'0';
                                 gHelloString[11] = humidity%100/10+'0';
                                 gHelloString[13] = humidity%10+'0';
                      }
                      Delayus(2000000);
         }
}

  

图1温湿度值输出显示

 

2.LCD屏显示温湿度值

显示温湿度值得主程序为:


int main(void)
{
         u8 senflag;
        
         SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
         SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000);
         SYSTICK_IntConfig(ENABLE);
        
         HT32F_DVB_OUT_Init(); 
         HT_GPIOD->RR = GPIO_PIN_0;
        
         Delayms(100);         
         LCD_Init();
         LCD_Config();
         LCD_BackColorSet(Black);
         LCD_TextColorSet(Yellow);
         senflag=DHT22_Init();
         if(senflag)  LCD_StringLineDisplay8(Line0, "              NO SEN!");
         else       LCD_StringLineDisplay8(Line0, "              SEN OK!");
         LCD_StringLineDisplay8(Line2, "               Holtek");
         LCD_StringLineDisplay8(Line3, "          HT32 Series F1654    ");
         LCD_StringLineDisplay8(Line4, "          LCD DHT22 Example    ");
         LCD_StringLineDisplay8(Line6, "          T=    .  C");
         LCD_StringLineDisplay8(Line7, "          H=    .  %");
         while(1)
         {
                     if(!senflag)
                     {
                                 DHT11_Read_Data(&temperature,&humidity);
                                 LCD_ShowNum(Line6,100,temperature/10,3);
                                 LCD_ShowNum(Line6,140,temperature%10,1);
                                 LCD_ShowNum(Line7,100,humidity/10,3);
                                 LCD_ShowNum(Line7,140,humidity%10,1);
                     }
                     Delayus(2000000);
         }
}

下载后,其执行效果如图2所示。

图2  温湿度值显示

最新回复

评测的好详细   详情 回复 发表于 2020-8-29 22:22
点赞 关注
 
 

回复
举报

7608

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 

评测的好详细

点评

哈哈,能在开发板上实现的就与大家分享一下,以后用的时候知道该功能能实现,而有些功能是不能随便添加的。  详情 回复 发表于 2020-8-30 00:01
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

1510

帖子

1

TA的资源

五彩晶圆(初级)

板凳
 

哈哈,能在开发板上实现的就与大家分享一下,以后用的时候知道该功能能实现,而有些功能是不能随便添加的。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表