LoRa终端设备ASR6505驱动DHT11

在本篇将使用普通GPIO来驱动DHT11,不过本篇使用STM8L的库函数。

1、DHT11

DHT11是一款比较典型的温湿度传感器,温度0-50°±2°,湿度:20-90%RH。几乎是开发板绕不开的东西,读写时序也是比较经典的。

2、接线

DHT11 开发板

VCC <-----------> +5V

GND <-----------> GND

DOUT <------------>GPIO4(PE7)

这里要注意一下:DHT11如果接3.3V,在线较长的时候,驱动能力不足,因此建议接5V)。

3、STM8L库函数

使用的是标准库函数,这也是ST最开始推广的时候用的库,于HAL库是有区别的。

4、应用

间隔5s读取DHT11的数据,计算出当前温湿度,并通过串口打印。

5、代码实现

periph_dht11.h/c部分代码:

#define DHT11_PORT   (GPIOE)
#define DHT11_PIN    (GPIO_Pin_7)   //可通过这两句宏定义,修改引脚

#define DHT11_CLR     GPIO_ResetBits(DHT11_PORT,DHT11_PIN);
#define DHT11_SET     GPIO_SetBits(DHT11_PORT,DHT11_PIN);
#define DHT11_IN      GPIO_Init(DHT11_PORT,DHT11_PIN, GPIO_Mode_In_PU_No_IT);
#define DHT11_OUT     GPIO_Init(DHT11_PORT,DHT11_PIN, GPIO_Mode_Out_PP_High_Fast);
//us延时函数,误差不能太大
void DelayUs(  uint32_t nCount)  
{
  volatile uint8_t  i=0; //加了volatile关键字,防止编译器优化
  do
  {
    i++;
  }
  while (i<(nCount*2));
}

void DHT11_Start(void)
{ 
  DHT11_OUT;      //设置端口方向
  DHT11_CLR;      //拉低端口  
  DelayMs(19);    //持续最低18ms
  DHT11_SET;      //释放总线
  DelayUs(30);    //总线由上拉电阻拉高,主机延时30uS;
  DHT11_IN;       //设置端口方向

  while(!GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN));//DHT11   等待80us低电平响应信号结束
  while(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)); //DHT11   将总线拉高80us
}

uint8_t DHT11_ReadValue(void)
{ 
  uint8_t i,sbuf=0;
  for(i=8;i>0;i--)
  {
    sbuf<<=1; 
    while((!GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN)));//50us的开始低电平
    DelayUs(30);// 延时 30us 后检测数据线是否还是高电平 
    if(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN))
    {
      sbuf|=1;  
    }
    else
    {
      sbuf|=0;
    }
    while(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_PIN));
  }
  return sbuf;   
}

uint8_t DHT11_ReadTemHum(uint8_t *buf)
{
  uint8_t check;

  buf[0]=DHT11_ReadValue();
  buf[1]=DHT11_ReadValue();
  buf[2]=DHT11_ReadValue();
  buf[3]=DHT11_ReadValue();

  check =DHT11_ReadValue();

  if(check == buf[0]+buf[1]+buf[2]+buf[3])
    return 1;
  else
    return 0;
}

主函数部分代码:

uint8_t DHT11Data[4]={0};
uint8_t Temp, Humi;

int main( void )
{       
    BoardInitMcu( );
    BoardInitPeriph( );

    printf("ASR6505 DHT11 test!\r\n");

    while(1)
    {
      DHT11_Start();
      if(DHT11_ReadTemHum(DHT11Data))
      {
        Temp=DHT11Data[2];
        Humi=DHT11Data[0];      
        printf("Temp=%d, Humi=%d\r\n",Temp,Humi);
      }
      else
      {
        printf("DHT11 Error!\r\n");
      }  
      Delay(5);
    }
}

6、实验现象

《从0到1搭建LoRa物联网》系列文章:

LoRa物联网的架构

LoRaWAN终端开发

LoRa终端设备之国产ASR6505软硬件

LoRa终端设备ASR6505普通GPIO操作

下一篇
举报

扫码关注云+社区

领取腾讯云代金券

,,