找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2329|回复: 0
打印 上一主题 下一主题
收起左侧

ESK32-360开发板检测温湿度

[复制链接]
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2020-8-29 09:01 编辑

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为输入、输出的函数为:
  1. void DHT22_IO_IN(void)
  2. {
  3.             AFIO_GPxConfig(GPIO_PC, GPIO_PIN_12, 0);
  4.             GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_DOWN);
  5.             GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DIR_IN);
  6.             GPIO_InputConfig(HT_GPIOC, GPIO_PIN_12, ENABLE);
  7. }

  8. void DHT22_IO_OUT(void)
  9. {
  10.            GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_DISABLE);
  11.            GPIO_DriveConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DV_8MA);
  12.            GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DIR_OUT);
  13.            GPIO_InputConfig(HT_GPIOC, GPIO_PIN_12, ENABLE);
  14. }
复制代码

DHT22读取数据的函数为:
  1. u8 DHT22_Read_Data(u16 *temp,u16 *humi)
  2. {      
  3.         u8 buf[5];
  4.          u8 i;
  5.          DHT22_Rst();
  6.          if(DHT22_Check()==0)
  7.          {
  8.                    for(i=0;i<5;i++)
  9.                    {
  10.                             buf[i]=DHT22_Read_Byte();
  11.                    }
  12.                    if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  13.                    {
  14.                             *humi=(buf[0]*256+buf[1]);
  15.                             *temp=(buf[2]*256+buf[3]);
  16.                    }
  17.          } else return 1;
  18.          return 0;     
  19. }
复制代码

实现图1所示效果的主程序为:
  1. int main(void)
  2. {
  3.          u8 senflag;
  4.          SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  5.          SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000);
  6.          SYSTICK_IntConfig(ENABLE);
  7.         
  8.          HT32F_DVB_OUT_Init();
  9.          HT_GPIOD->RR = GPIO_PIN_0;      
  10.          Delayms(100);         
  11.          UxART_Configuration();
  12.          senflag=DHT22_Init();
  13.          if(senflag) gHelloString[3] = '1';
  14.          else     gHelloString[3] = '0';
  15.          UxART_TxTest();     
  16.          while(1)
  17.          {
  18.                      if(!senflag)
  19.                      {
  20.                                       DHT11_Read_Data(&temperature,&humidity);
  21.                                       gHelloString[2] = temperature/100+'0';
  22.                                       gHelloString[3] = temperature%100/10+'0';
  23.                                       gHelloString[5] = temperature%10+'0';
  24.                                       gHelloString[10] = humidity/100+'0';
  25.                                       gHelloString[11] = humidity%100/10+'0';
  26.                                       gHelloString[13] = humidity%10+'0';
  27.                      }
  28.                      Delayus(2000000);
  29.          }
  30. }
复制代码

1温湿度值输出显示

2.LCD屏显示温湿度值
显示温湿度值得主程序为:
  1. int main(void)
  2. {
  3.          u8 senflag;
  4.         
  5.          SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  6.          SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000);
  7.          SYSTICK_IntConfig(ENABLE);
  8.         
  9.          HT32F_DVB_OUT_Init();
  10.          HT_GPIOD->RR = GPIO_PIN_0;
  11.         
  12.          Delayms(100);         
  13.          LCD_Init();
  14.          LCD_Config();
  15.          LCD_BackColorSet(Black);
  16.          LCD_TextColorSet(Yellow);
  17.          senflag=DHT22_Init();
  18.          if(senflag)  LCD_StringLineDisplay8(Line0, "              NO SEN!");
  19.          else       LCD_StringLineDisplay8(Line0, "              SEN OK!");
  20.          LCD_StringLineDisplay8(Line2, "               Holtek");
  21.          LCD_StringLineDisplay8(Line3, "          HT32 Series F1654    ");
  22.          LCD_StringLineDisplay8(Line4, "          LCD DHT22 Example    ");
  23.          LCD_StringLineDisplay8(Line6, "          T=    .  C");
  24.          LCD_StringLineDisplay8(Line7, "          H=    .  %");
  25.          while(1)
  26.          {
  27.                      if(!senflag)
  28.                      {
  29.                                       DHT11_Read_Data(&temperature,&humidity);
  30.                                       LCD_ShowNum(Line6,100,temperature/10,3);
  31.                                       LCD_ShowNum(Line6,140,temperature%10,1);
  32.                                       LCD_ShowNum(Line7,100,humidity/10,3);
  33.                                       LCD_ShowNum(Line7,140,humidity%10,1);
  34.                      }
  35.                      Delayus(2000000);
  36.          }
  37. }
复制代码

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

图2  温湿度值显示

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表