jinglixixi 发表于 2021-5-20 23:30

【AT32F421测评】+ DHT22温湿度检测

本帖最后由 jinglixixi 于 2021-5-20 23:36 编辑

<p style="text-align:justify">DHT22是一种常见的数字式温湿度传感器,它采用单总线方式进行工作,故较为节省GPIO口资源。将它与OLED屏组合在一起即可形成一个小巧而便捷的温湿度检测装置,其起始界面和工作界面分别如图1和图2所示。</p>

<p></p>

<p>图1 起始界面</p>

<p>图2 工作界面</p>

<p>&nbsp;</p>

<p>DHT22与MCU的连接关系为:</p>

<p>Dat---PB11</p>

<p>VCC---5V</p>

<p>GND--- GND</p>

<p>&nbsp;</p>

<p>实现DHT22输出高低电平及读取的语句定义为:</p>

<p>#define DHT22_D0_H&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPIOB-&gt;BSRE= GPIO_Pins_11</p>

<p>#define DHT22_D0_L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPIOB-&gt;BRE= GPIO_Pins_11</p>

<p>#define DHT22_D0_R&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GPIO_ReadInputDataBit(GPIOB,GPIO_Pins_11)</p>

<p>&nbsp;</p>

<p>DHT22的初始化函数为:</p>

<pre>
<code class="language-cpp">uint8_t DHT22_Init(void)
{
    GPIO_InitType GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
    GPIO_StructInit(&amp;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, &amp;GPIO_InitStructure);
    DHT22_Rst();
    return DHT22_Check();
}</code></pre>

<p>DHT22读取模式的设置函数为:</p>

<pre>
<code class="language-cpp">void DHT22_IO_IN(void)
{
  GPIO_InitType GPIO_InitStructure;
  RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOB, ENABLE);
  GPIO_StructInit(&amp;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, &amp;GPIO_InitStructure);
}</code></pre>

<p>&nbsp;</p>

<p>DHT22位读取函数为:</p>

<pre>
<code class="language-cpp">uint8_t DHT22_Read_Bit(void)
{
    uint8_t retry=0;
    while(DHT22_D0_R&amp;&amp;retry&lt;100)
    {
        retry++;
        Delay_us(2);
    }
    retry=0;
    while(!DHT22_D0_R&amp;&amp;retry&lt;100)
    {
        retry++;
        Delay_us(2);
    }
    Delay_us(40);
    if(DHT22_D0_R) return 1;
    else return 0;
}</code></pre>

<p>DHT22字节读取函数为:</p>

<pre>
<code class="language-cpp">uint8_t DHT22_Read_Byte(void)
{
    uint8_t i,dat;
    dat=0;
    for (i=0;i&lt;8;i++)
    {
        dat&lt;&lt;=1;
        dat|=DHT22_Read_Bit();
    }
    return dat;
}</code></pre>

<p>&nbsp;</p>

<p>实现显示效果的主程序为:</p>

<pre>
<code class="language-cpp">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 &amp; 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(&amp;temperature,&amp;humidity);
          OLED_ShowNum(16,2,temperature,2,16);
          OLED_ShowNum(64,2,humidity,2,16);
       }
       Delay_ms(500u);
       AT32_LEDn_Toggle(LED2);
    }
}</code></pre>

<p>&nbsp;</p>

w494143467 发表于 2021-5-21 10:39

<p>不错不错,期待后续哈~</p>

jinglixixi 发表于 2021-5-21 20:41

w494143467 发表于 2021-5-21 10:39
不错不错,期待后续哈~

<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>

freebsder 发表于 2021-5-21 22:46

<p>谢谢分享</p>

Albert.G 发表于 2021-5-24 11:22

<p>谢谢分享,话说楼主后面还有测评吗,今天就结束了。</p>

jinglixixi 发表于 2021-5-24 11:36

Albert.G 发表于 2021-5-24 11:22
谢谢分享,话说楼主后面还有测评吗,今天就结束了。

<p>哈哈,计划的任务已全部完成!</p>

huo_hu 发表于 2021-5-26 12:06

<p>AM2302这个传感器以前弄过,当时的程序能用,但是数据偶尔会有错误很是奇怪.</p>

<p>直到最近用定时器通道捕获方式才看出当时的问题,那个传感器在发送完一个字节后会有一个超长的低电平,手册上并没有说清楚.</p>
页: [1]
查看完整版本: 【AT32F421测评】+ DHT22温湿度检测