STM32F103RC通过DHT11获取温湿度

简介: STM32F103RC通过DHT11获取温湿度

bsp_dht1.c

/**
  ******************************************************************************
  * @file    bsp_TimBase.c
  * @author  stylle
  * @version V1.0
  * @date    2021-xx-xx
  * @brief   DTH11温湿度获取
  ******************************************************************************
  */ 
#include "bsp_DTH11.h" 
#include "bsp_usart1.h"
uint8_t temp=0;
uint8_t humi=0;
//DHT11驱动
void DHT11_Init (void)
{    
        GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(DHT11_CLK, ENABLE);
    
    GPIO_InitStruct.GPIO_Pin=DHT11_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;        /*设置引脚模式为通用推挽输出*/  
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;       /*设置引脚速率为50MHz */  
    GPIO_Init(DHT11_PORT,&GPIO_InitStruct);
}
//输入模式
void DHT11_MODE_IN(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(DHT11_CLK, ENABLE);
    
    GPIO_InitStruct.GPIO_Pin=DHT11_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;        /*设置引脚模式为通用推挽输出*/ 
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;       /*设置引脚速率为50MHz */  
    GPIO_Init(DHT11_PORT,&GPIO_InitStruct);
}
//输出模式
void DHT11_MODE_OUT(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    RCC_APB2PeriphClockCmd(DHT11_CLK, ENABLE);
    
    GPIO_InitStruct.GPIO_Pin=DHT11_PIN;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;        /*设置引脚模式为通用推挽输出*/  
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;       /*设置引脚速率为50MHz */  
    GPIO_Init(DHT11_PORT,&GPIO_InitStruct);
}
//读取一个字节    
uint8_t DHT11_Read_Byte(void)
{
    uint8_t i,data;
    for(i=0;i<8;i++)
    {
        if(DHT11_READ==0)
        {
            while(DHT11_READ==0);
        }
        delay_us(40);   //40us
        if(DHT11_READ==1)
        {
            while(DHT11_READ==1);//这里要等待高电平结束,否者读取下一位的时候会因为高电平没有结束而跳过上一个if
            data|=(uint8_t)0x01<<(7-i);
        }
        else
            data&=(uint8_t)~0x01<<(7-i);
                     
    }
    return data;
}
//读五个字节
uint8_t DHT11_ReadData(uint8_t *temp,uint8_t *humi)
{
    uint8_t buf[5];
    uint8_t i;
    for(i=0;i<5;i++)
    {
        buf[i]=DHT11_Read_Byte();
        
    }
    if(buf[0]+buf[1]+buf[2]+buf[3]==buf[4])
    {
        *temp=buf[2];
        *humi=buf[0];
        return 1;
    }
    else
        return 0;    
}
//DHT11 更新数据
void upDate_DHT11(void)
{
//    DHT11_Init ();
    DHT11_OUT_L;
    delay_us(20000);
    DHT11_OUT_H;
    delay_us(20);
    DHT11_MODE_IN();
    if(DHT11_READ==0)
    {
        while(DHT11_READ==0);
        while(DHT11_READ==1);
        DHT11_ReadData(&temp,&humi);
//        printf("温度:%d   湿度:%d\r\n",temp,humi);
    }
    DHT11_MODE_OUT();
    DHT11_OUT_H;
}    
/*********************************************END OF FILE**********************/

bsp_dht1.h

#ifndef _DTH11_H
#define _DTH11_H
#include "stm32f10x.h"
#include "utility.h"
//DATA线引脚为PC14
#define DHT11_OUT_H  GPIO_SetBits(GPIOC,GPIO_Pin_14)
#define DHT11_OUT_L  GPIO_ResetBits(GPIOC,GPIO_Pin_14)
#define DHT11_READ   GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_14)
#define DHT11_CLK    RCC_APB2Periph_GPIOC
#define DHT11_PIN    GPIO_Pin_14
#define DHT11_PORT   GPIOC
void DHT11_Init (void);
void DHT11_MODE_IN(void);
void DHT11_MODE_OUT(void);
uint8_t DHT11_Read_Byte(void);
uint8_t DHT11_ReadData(uint8_t *temp,uint8_t *humi);
void upDate_DHT11(void);
#endif  /* _DTH11_H */
#include "bsp_dht11.h"
extern uint8_t temp;
extern uint8_t humi;
int main(void)
{
  char sendData[48];
  uint8_t tmp[2];
  DHT11_Init();
  USART1_Config(); 
  while(1)
  {
    upDate_DHT11();
    if (tmp[0] != temp || tmp[1] != humi)
    {
         tmp[0] = temp;
         tmp[1] = humi;
         sprintf(sendData, "当前温度:%d 当前湿度:%d",temp,humi);
         send(SOCK_TCPS,(uint8 *)sendData,strlen(sendData));
         printf("%s\r\n",sendData);
    }
  }
}

例子下载

通过STM32F103开发板通过驱动W5500发送温湿度到上位机例子下载:链接直达

我用阿里云盘分享了「STM32F1+W5500+DHT11」,你可以不限速下载🚀

复制这段内容打开「阿里云盘」App 即可获取

链接:https://www.aliyundrive.com/s/QRhPAuWuBbY

相关文章
|
30天前
|
传感器 算法
【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪
【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪
|
30天前
|
传感器 存储 缓存
STM32--MPU6050与I2C外设
STM32--MPU6050与I2C外设
|
30天前
|
存储
STM32--ADC模数转换
STM32--ADC模数转换
|
30天前
|
芯片
|
8月前
|
传感器 数据格式
STM32外设系列—DHT11
本文详细介绍了什么是DHT11,介绍了DHT11使用的单总线通信,并详细分析了与DHT11进行数据交互时的时序图。此外,给出了DHT11初始化,接收温湿度信息并校验的程序设计。
193 0
STM32外设系列—DHT11
|
10月前
|
传感器
STM32(HAL库)驱动SHT30温湿度传感器通过串口进行打印
STM32(HAL库)驱动SHT30温湿度传感器通过串口进行打印
|
10月前
|
传感器
STM32+ESP8266+QT客户端上位机显示DHT11温湿度与点灯
STM32+ESP8266+QT客户端上位机显示DHT11温湿度与点灯
|
11月前
|
传感器 芯片 数据格式
stm32读取DHT11温湿度传感器
stm32读取DHT11温湿度传感器
203 1
|
传感器
STM32通过IIC协议控制MPU6050
根据B站UP主“江科大自动化协”的教程总结
79 0

热门文章

最新文章