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

相关文章
|
6月前
|
传感器 数据采集 数据处理
基于STM32的温湿度监测系统设计与实现
基于STM32的温湿度监测系统设计与实现
889 1
|
3月前
|
传感器
手把手在STM32F103C8T6上构建可扩展可移植的DHT11驱动
【8月更文挑战第29天】本文详细介绍在STM32F103C8T6上构建可扩展且可移植的DHT11温湿度传感器驱动的步骤,包括硬件与软件准备、硬件连接、驱动代码编写及测试。通过这些步骤,可根据实际项目需求优化和扩展代码。
|
4月前
|
传感器 数据安全/隐私保护 数据格式
STM32CubeMX DHT11温湿度传感器
STM32CubeMX DHT11温湿度传感器
232 11
|
4月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
156 0
|
5月前
|
传感器 数据格式
【STM32】DHT11温湿度模块传感器详解&代码
【STM32】DHT11温湿度模块传感器详解&代码
|
6月前
|
传感器 监控 C#
使用STM32实现一个简单的温湿度监控系统
使用STM32实现一个简单的温湿度监控系统
187 0
|
传感器 数据格式
STM32外设系列—DHT11
本文详细介绍了什么是DHT11,介绍了DHT11使用的单总线通信,并详细分析了与DHT11进行数据交互时的时序图。此外,给出了DHT11初始化,接收温湿度信息并校验的程序设计。
328 0
STM32外设系列—DHT11
|
传感器 安全
嵌入式 STM32 SHT31温湿度传感器
嵌入式 STM32 SHT31温湿度传感器
|
传感器 智能硬件
STM32cubemx配置驱动DHT11模块
STM32cubemx配置驱动DHT11模块
148 0
|
5月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
423 2