[GD32L233C-START 评测] 【GD32L233C-START评测】+DHT11传感器使用【2】

流行科技   2022-2-27 19:48 楼主

拿到板子几天了,原板已经有一个Arduino接口了,今天我用一块传感器拓展板开发下DHT11这款单总线的温湿度传感器。

image.png  

 

拓展板上蓝色的就是传感器了,后续还可以测试其他东西。

image-20220227194715-2.png  

其中二脚就是其数据通信口,我们只要测试下其与板子上相接的是哪个口就可以了,目前数据口是接到了PB1上。

所以接下来就是代码了。

image-20220227194715-3.png  

#include "dht11.h"





 //////////////////////////////////////////////////////////////////////////////////   

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//ALIENTEK战舰STM32开发板

//DHT11数字温湿度传感器驱动代码   

//正点原子@ALIENTEK

//技术论坛:www.openedv.com

//修改日期:2012/9/12

//版本:V1.0

//版权所有,盗版必究。

//Copyright(C) 广州市星翼电子科技有限公司 2009-2019

//All rights reserved                                                              

//////////////////////////////////////////////////////////////////////////////////

     

//复位DHT11

void DHT11_Rst(void)     

{                

       DHT11_IO_OUT();        //SET OUTPUT

    DHT11_DQ_OUT_LOW;       //拉低DQ

    delay_ms(20);    //拉低至少18ms

    DHT11_DQ_OUT_HIGH;      //DQ=1

       delay_us(30);            //主机拉高20~40us

}

//等待DHT11的回应

//返回1:未检测到DHT11的存在

//返回0:存在

u8 DHT11_Check(void)          

{  

       u8 retry=0;

       DHT11_IO_IN();//SET INPUT

    while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us

       {

              retry++;

              delay_us(1);

       };    

       if(retry>=100)return 1;

       else retry=0;

    while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us

       {

              retry++;

              delay_us(1);

       };

       if(retry>=100)return 1;     

       return 0;

}

//从DHT11读取一个位

//返回值:1/0

u8 DHT11_Read_Bit(void)                  

{

      u8 retry=0;

       while(DHT11_DQ_IN&&retry<100)//等待变为低电平

       {

              retry++;

              delay_us(1);

       }

       retry=0;

       while(!DHT11_DQ_IN&&retry<100)//等待变高电平

       {

              retry++;

              delay_us(1);

       }

       delay_us(40);//等待40us

       if(DHT11_DQ_IN)return 1;

       else return 0;           

}

//从DHT11读取一个字节

//返回值:读到的数据

u8 DHT11_Read_Byte(void)   

{       

    u8 i,dat;

    dat=0;

       for (i=0;i<8;i++)

       {

            dat<<=1;

           dat|=DHT11_Read_Bit();

    }                                            

    return dat;

}

//从DHT11读取一次数据

//temp:温度值(范围:0~50°)

//humi:湿度值(范围:20%~90%)

//返回值:0,正常;1,读取失败

u8 DHT11_Read_Data(u8 *temp,u8 *humi)   

{       

      u8 buf[5];

       u8 i;

       DHT11_Rst();

       if(DHT11_Check()==0)

       {

              for(i=0;i<5;i++)//读取40位数据

              {

                     buf[i]=DHT11_Read_Byte();

              }

              if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])

              {

                     *humi=buf[0];

                     *temp=buf[2];

              }

       }else return 1;

       return 0;     

}

//初始化DHT11的IO口 DQ 同时检测DHT11的存在

//返回1:不存在

//返回0:存在     

u8 DHT11_Init(void)

{     

       rcu_periph_clock_enable(RCU_GPIOB);

       gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1);

    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1);

       gpio_bit_set(GPIOB,GPIO_PIN_1);      





       DHT11_Rst();  //复位DHT11

       return DHT11_Check();//等待DHT11的回应

}



这个是初始化,在此次的库中,GD给的是比较节省配置的,没有以前的那种复杂。

其余代码按照原子给的即可。

image-20220227194715-4.png  

头上面配置的输入输出也不一样了。

变成了现在这样。

image-20220227194715-5.png  

Main函数中读取即可。

image-20220227194715-6.png  

在仿真界面中可以看到数据了。

对着吹口气也是会变化的。

image-20220227194715-7.png  

这样就完成此次测试了。

回复评论 (1)

有Arduino扩展板就是方便哈!

点赞  2022-2-28 15:57
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复