草庐IT

STM32——DHT11温湿度传感器

三只树懒 2023-10-11 原文

一、DHT11介绍

1、DHT11技术性能特征

工作电压范围:3.3V~5.5V

工作电流:平均0.5mA

输出:单总线数字信号

测量范围:湿度20~90%RH,温度0~50°C

精度:湿度±5%,温度±2°C

分辨率:湿度±1%,温度±1°C

DHT11数字湿度传感器采用单总线数据格式。单个数据引脚端口完成输入输出双向传输。其中数据包由5Byte(40Bit)组成。数据分小数部分和整数部分,一次完整的数据传输为40bit,高位先出。

DHT11的数据格式为:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。其中校验和数据为前四个字节相加。传感器数据输出的是未编码的二进制数据。数据(湿度、温度、整数、小数)之间应该分开处理。例如,某次从DHT11读到的数据如图所示:

由以上数据就可得到湿度和温度的值,计算方法:

湿度=byte4.byte3=45.0(%RH)

温度=byte2.byte1=28.0(°C)

校验=byte4+byte3+byte2+byte1=73(校验正确)

二、数据发送流程

首先主机发送开始信号,即:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(20~40us)时间,然后读取DHT11的响应,正常的话,DHT11会拉低数据线,保持t3(40~50us)时间作为响应信号,然后DHT11拉高数据线,保持t4(40~50us)时间后,开始输出数据。

DHT11输出数字‘0’的时序如图:

 

DHT11输出数字‘1’的时序如图:

 

硬件连接:

 

信号线:PG9

//IO方向设置
#define DHT11_IO_IN()  {GPIOG->MODER&=~(3<<(9*2));  GPIOG->MODER|=0<<9*2;}  //PG9输入模
#define DHT11_IN_OUT() {GPIOG->MODER&~=(3<<(9*2));  GPIOG->MODER|=0<<9*2;}  //PG9输出模
//IO操作
#define DHT11_DQ_OUT PGout(9);//数据端口 PG9
#define DHT11_DQ_IN  PGin(9);//数据端口 PG9

三、代码解析

复位:拉低数据线,保持t1(至少18ms)时间,然后拉高数据线t2(20~40us)时间

 

//复位DHT11
void DHT11_Rst(void)
{
  DHT11_IO_OUT();//SET OUTPUT
  DHT11_DQ_OUT=0;//拉低DQ
  delay-ms(20);//拉低至少18ms
  DHT11_DQ_OUT=1;
  delay_us(30);//主机拉高20~40us
}

等待回应:

//等待DHT11的回应
//返回1:未检测到DHT11的存在
//返回0:存在
u8 DHT11_Check(void)
{
  u8 retry=0;
  DHT11_IO_IN();
  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;
}

读数据一个bit:

从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°C)
//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++)//
    {
      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;
}

u8 DHT11_Init(void);//初始化DHT11

u8 DHT11_Read_Data(u8 *temp,u8 *hmi);//读取温湿度

u8 DHT11_Read_Byte(void);//读出一个字节

u8 DHT11_Read_Bit(void);//读出一个位

u8 DHT11_Check(void);//检测是否存在DHT11

void DHT11_Rst(void);//复位DHT11

关于串口初始化的配置:

u8 DHT11_Init(void)
{
  GPIO_INitTypeDef GPIO_InitABC;
  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);//使能GPIO时钟
  
  GPIO_InitABC.GPIO_Pin=GPIO_Pin_9;
  GPIO_InitABC.GPIO_Mode=GPIO_Mode_OUT;//普通输出模式
  GPIO_InitABC.GPIO_OType=GPIO_OType_PP;//推挽输出
  GPIO_InitABC.GPIO_Speed=GPIO_Speed_50MHz;//50MHz
  GPIO_InitABC.GPIO_PuPd=GPIO_PuPd_UP;//上拉
  GPO_Init(GPIOG,&GPIO_InitABC);//初始化
  
  DHT11_Rst();
  return DHT11_Check();
}

有关STM32——DHT11温湿度传感器的更多相关文章

  1. ruby - 安装libv8(3.11.8.13)出错,Bundler无法继续 - 2

    运行bundleinstall后出现此错误:Gem::Package::FormatError:nometadatafoundin/Users/jeanosorio/.rvm/gems/ruby-1.9.3-p286/cache/libv8-3.11.8.13-x86_64-darwin-12.gemAnerroroccurredwhileinstallinglibv8(3.11.8.13),andBundlercannotcontinue.Makesurethat`geminstalllibv8-v'3.11.8.13'`succeedsbeforebundling.我试试gemin

  2. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  3. ruby - ri 有空文件 – Ubuntu 11.10, Ruby 1.9 - 2

    我正在运行Ubuntu11.10并像这样安装Ruby1.9:$sudoapt-getinstallruby1.9rubygems一切都运行良好,但ri似乎有空文档。ri告诉我文档是空的,我必须安装它们。我执行此操作是因为我读到它会有所帮助:$rdoc--all--ri现在,当我尝试打开任何文档时:$riArrayNothingknownaboutArray我搜索的其他所有内容都是一样的。 最佳答案 这个呢?apt-getinstallri1.8编辑或者试试这个:(非rvm)geminstallrdocrdoc-datardoc-da

  4. ruby - rails 3.2.2(或 3.2.1)+ Postgresql 9.1.3 + Ubuntu 11.10 连接错误 - 2

    我正在使用PostgreSQL9.1.3(x86_64-pc-linux-gnu上的PostgreSQL9.1.3,由gcc-4.6.real(Ubuntu/Linaro4.6.1-9ubuntu3)4.6.1,64位编译)和在ubuntu11.10上运行3.2.2或3.2.1。现在,我可以使用以下命令连接PostgreSQLsupostgres输入密码我可以看到postgres=#我将以下详细信息放在我的config/database.yml中并执行“railsdb”,它工作正常。开发:adapter:postgresqlencoding:utf8reconnect:falsedat

  5. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  6. ruby-on-rails - Rails 2.3.11 DateTime BigDecimal 精度 - 2

    我目前有一个运行Ruby1.8.7和Rails2.3.2的RubyonRails项目我有一些从数据库中读取数据的单元测试,特别是两个连续项目的日期时间列,这两个项目应该相隔24小时。在一项测试中,我将项目2的日期时间设置为与项目1的日期时间相同。当我执行断言以确保两个值相等时,测试在rails2.3.2下工作正常。当我升级到rails2.3.11时,测试失败显示两次之间的差异将关闭并出现以下错误:expectedbutwas.这两个版本的rails中似乎存在浮点转换问题。如何解决float问题? 最佳答案 这也发生在我身上,我最终这

  7. Win10 / 11新电脑最简单跳过联网激活和使用本地账户登录方法 - 2

    跳过联网激活:OOBE界面直接按Ctrl+Shift+F3进入审核模式。这样就可以直接进入系统进行一些硬件测试等,而不用联网激活导致新机无法退货。需要注意的是,在审核模式下进行的一些操作都会保留,并不会在退出后自动还原!安装的软件在正常开机进系统后还会看见!如果电脑确实没连互联网又不想强行跳过OOBE(网上很多教程会叫你直接结束OOBE进程,但这是不推荐的,因为一些厂商自带优化程序和系统初始化设置在后面都会应用,对于笔记本跳过的话你会发现驱动和内置应用都没有装上。其实这部分脚本就在系统盘的Recovery隐藏文件夹下),可以参考以下方式:https://www.landiannews.com/

  8. ESP32学习入门:WiFi连接网络 - 2

    目录一、ESP32简单介绍二、ESP32Wi-Fi模块介绍三、ESP32Wi-Fi编程模型四、ESP32Wi-Fi事件处理流程 五、ESP32Wi-Fi开发环境六、ESP32Wi-Fi具体代码七、ESP32Wi-Fi代码解读6.1主程序app_main7.2自定义代码wifi_init_sta()八、ESP32Wi-Fi连接验证8.1测试方法8.2服务器模拟工具sscom58.3测试代码8.4测试结果前言为了开发一款亚马逊物联网产品,开始入手ESP32模块。为了能够记录自己的学习过程,特记录如下操作过程。一、ESP32简单介绍ESP32是一套Wi-Fi(2.4GHz)和蓝牙(4.2)双模解决方

  9. Spring Security 6.0系列【32】授权服务器篇之默认过滤器 - 2

    有道无术,术尚可求,有术无道,止于术。本系列SpringBoot版本3.0.4本系列SpringSecurity版本6.0.2本系列SpringAuthorizationServer版本1.0.2源码地址:https://gitee.com/pearl-organization/study-spring-security-demo文章目录前言1.OAuth2AuthorizationServerMetadataEndpointFilter2.OAuth2AuthorizationEndpointFilter3.OidcProviderConfigurationEndpointFilter4.N

  10. ruby-on-rails - 在 El Capitan 上安装 Rails 时出现 -lgmp 错误的库未找到(Mac OS 10.11.1 (15B42)) - 2

    在使用Rubyv2.2.2的ElCapitan(MacOSX10.11.1)上安装Rails时,出现以下错误:ERROR:Errorinstallingnokogiri:ERROR:Failedtobuildgemnativeextension./Users/jon/.rvm/rubies/ruby-2.2.2/bin/ruby-r./siteconf20151117-26799-ux15fd.rbextconf.rb--use-system-librariescheckingiftheCcompileraccepts...***extconf.rbfailed***Couldnotc

随机推荐