stm32F4使用温湿度传感器模块-->DHT11

最新更新时间:2021-10-14来源: eefocus关键字:stm32F4  温湿度传感器模块  DHT11 手机看文章 扫描二维码
随时随地手机看文章

就是 雁凌家的模块,测好了,弄了很久吧发现是他们家的杜邦线不行,以后买模块要看杜邦线质量,还是买点好的

太耽误开发周期了

在这里插入图片描述

我们用的模块是四线 转三线的(dht11从四线的引脚变成三线的输出)


线路连接

dht11 有三根线连出来,vcc,gnd,还有一个负责输入和输出

所以最后一根线可以连接到没有被占用的gpio口就能获得数据

连接到板子的 pb2上面

在这里插入图片描述

程序编写

唤醒dht11 ->检测dht11是否存在 -> 读取数据


唤醒dht11

输出低电平 20ms 再输出 高电平 30us


//复位DHT11

void DHT11_Rst(void)    

{                 

DHT11_IO_OUT(); //设置为输出

DHT11_DQ_OUT=0; //拉低DQ

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

DHT11_DQ_OUT=1; //DQ=1 

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

}


检测dht11

唤醒后dht11 会拉低电频40,80us 拉低后会再次拉高40~80us


读取数据

读取一位数据

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;

}


读取一个byte数据

就是循环读取八个位


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;     

}


对所有数据进行拼装,得到温度值

从总共的40byte里拿出我们的数据,小数部分就不要了,好像是不支持


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.c


#include "dht11.h"

#include "delay.h"

//  

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

//ALIENTEK STM32F429开发板

//DHT11驱动代码    

//正点原子@ALIENTEK

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

//创建日期:2016/1/16

//版本:V1.0

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

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

//All rights reserved   

//


//复位DHT11

void DHT11_Rst(void)    

{                 

DHT11_IO_OUT(); //设置为输出

DHT11_DQ_OUT=0; //拉低DQ

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

DHT11_DQ_OUT=1; //DQ=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;

}


//从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)

{

    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟

    GPIO_Initure.Pin=GPIO_PIN_2;           //PB12

    GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

    GPIO_Initure.Pull=GPIO_PULLUP;          //上拉

    GPIO_Initure.Speed=GPIO_SPEED_HIGH;     //高速

    HAL_GPIO_Init(GPIOB,&GPIO_Initure);     //初始化

 

    DHT11_Rst();

return DHT11_Check();

}


dht11.h


#ifndef __DS18B20_H

#define __DS18B20_H

#include "sys.h"


//IO方向设置

#define DHT11_IO_IN()  {GPIOB->MODER&=~(3<<(2*2));GPIOB->MODER|=0<<(2*2);} //PB12输入模式

#define DHT11_IO_OUT() {GPIOB->MODER&=~(3<<(2*2));GPIOB->MODER|=1<<(2*2);} //PB12输出模式

 

IO操作函数    

#define DHT11_DQ_OUT    PBout(2)//数据端口 PB12

#define DHT11_DQ_IN     PBin(2) //数据端口 PB12 

   

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

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

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

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

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

void DHT11_Rst(void);//复位DHT11  

#endif


main.c


#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "led.h"

#include "key.h"

#include "lcd.h"

#include "sdram.h"

#include "dht11.h"

#include "pcf8574.h"



int main(void)

{

u8 t=0;      

u8 temperature;      

u8 humidity;    

    HAL_Init();                     //初始化HAL库   

    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz

    delay_init(180);                //初始化延时函数

    uart_init(115200);              //初始化USART

    LED_Init();                     //初始化LED 

    KEY_Init();                     //初始化按键

    SDRAM_Init();                   //初始化SDRAM

    LCD_Init();                     //初始化LCD

    PCF8574_Init();                 //初始化PCF8574

    POINT_COLOR=RED;

LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7"); 

LCD_ShowString(30,70,200,16,16,"DHT11 TEST");

LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");

LCD_ShowString(30,110,200,16,16,"2016/1/16");

    PCF8574_ReadBit(BEEP_IO);       //由于DHT11和PCF8574的中断引脚共用一个IO,

                                    //所以在初始化DHT11之前要先读取一次PCF8574的任意一个IO,

                                    //使其释放掉中断引脚所占用的IO(PB12引脚),否则初始化DS18B20会出问题    

  while(DHT11_Init()) //DHT11初始化

{

LCD_ShowString(30,130,200,16,16,"DHT11 Error");

delay_ms(200);

LCD_Fill(30,130,239,130+16,WHITE);

  delay_ms(200);

}    

LCD_ShowString(30,130,200,16,16,"DHT11 OK");

POINT_COLOR=BLUE;//设置字体为蓝色 

  LCD_ShowString(30,150,200,16,16,"Temp:  C");  

  LCD_ShowString(30,170,200,16,16,"Humi:  %");

while(1)

{         

  if(t%10==0)//每100ms读取一次

{

            PCF8574_ReadBit(BEEP_IO);   //读取一次PCF8574的任意一个IO,使其释放掉PB12引脚,

                                        //否则读取DHT11可能会出问题            

DHT11_Read_Data(&temperature,&humidity); //读取温湿度值     

LCD_ShowNum(30+40,150,temperature,2,16); //显示温度        

LCD_ShowNum(30+40,170,humidity,2,16); //显示湿度    

}    

delay_ms(10);

t++;

if(t==20)

{

t=0;

LED0=!LED0;

}

}     

}

关键字:stm32F4  温湿度传感器模块  DHT11 编辑:什么鱼 引用地址:stm32F4使用温湿度传感器模块-->DHT11

上一篇:STM32F103C8T6+温湿度传感器DHT11实现温湿度采集
下一篇:STM32驱动dht11温湿度传感器

推荐阅读

STM32F4 新建标准库函数工程
前言在 STM32 开发中,库函数开发相比寄存器方式具有开发周期短、代码可读性好、便于移植等优点,而使用 Keil 环境的第一步就是新建工程。本文以 STM32F401CE 芯片为例,介绍使用标准库函数新建工程的步骤。材料准备STM32F4xx 固件库:STM32F4xx_DSP_StdPeriph_Lib_V1.4.0.rarKeil-MDK一点耐心新建库函数工程注意事项不同芯片在新建工程时的配置略有区别,主要体现在以下几点:工程目标 Device 选择的芯片型号不同。添加的启动文件不同。要根据芯片型号在arm目录下选择相应的.s文件。C/C++ 选项卡的芯片型号宏定义不同。具体有哪些选择可在stm32f4xx.h头文件中的条件编
发表于 2023-01-12
STM32+DHT11 读取温湿度数据显示
一、环境介绍MCU:STM32F103C8T6温湿度模块:DHT11开发软件:Keil5二、DHT11 介绍DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术, 确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个 NTC 测温元件,并与一个高性能 8 位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个 DHT11 传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在 OTP 内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口, 使系统集成变得简易快捷。超小的体积
发表于 2022-12-08
msp430g2553+pcf8574+dht11+lcd1602
先放硬件连接图DHT11驱动子程序模块功能:检测温湿度信息DHT11.h#ifndef DHT11_H_#define DHT11_H_#include <msp430g2553.h>#define delay_us(x) __delay_cycles((long)(((double)8000000)*((double)x)/1000000.0))#define delay_ms(x) __delay_cycles((long)(((double)8000000)*((double)x)/1000.0))//输出数据P1.5#define SET_DATA P1OUT |= BIT5 //拉高数据线#define
发表于 2022-10-20
msp430g2553+pcf8574+dht11+lcd1602
【51单片机STC89C52】DHT11温湿度传感器的使用
一、DHT11概述数据传送逻辑模块一次完整的数据传输为40bit,高位在前数据格式8bit湿度整数数据+8bit 湿度小数数据 +8bi 温度整数数据 +8bit 温度小数数据 +8bit 校验和通讯过程时序图二、检测模块是否存在根据如下时序图,做通信初始化,并检测模块是否存在,功能是否正常时序逻辑分析a : dht = 1b :dht = 0延时至少18msc: dht = 1卡d点:while(dht)卡e点:while(!dht)卡f点:while(dht)代码实现void DHT11_Start(){ dht = 1; dht = 0; //延时30ms Delay30ms(); dht = 1; //卡d点:while(
发表于 2022-10-20
【51单片机STC89C52】<font color='red'>DHT11</font><font color='red'>温湿度</font><font color='red'>传感器</font>的使用
STM32F4系列HAL库配置定时器实验——输入捕获
输入捕获简单讲解输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量周期和频率为例,用一个简图来说明输入捕获的原理假定定时器工作在向上计数模式,图中 t1~t2 时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x 为上升沿捕获,这样,t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道 x为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。在 t1~t2 之间,可能产生 N 次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。如图15
发表于 2022-10-18
<font color='red'>STM32F4</font>系列HAL库配置定时器实验——输入捕获
STM32+DHT11读取温湿度数据显示
一、环境介绍MCU: STM32F103C8T6温湿度模块: DHT11开发软件: Keil5源码下载地址: https://download.csdn.net/download/xiaolong1126626497/18263569二、DHT11介绍DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术, 确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形
发表于 2022-10-17
STM32+DHT11读取<font color='red'>温湿度</font>数据显示

推荐帖子

用于便携式工业设备的小型高效降压-升压转换器
几乎每一个便携式系统都需要一个3.3V电压轨。而对于那些由单节锂电池供电的系统,用户总会问到如何实现这个电源轨。将电池电压(通常情况下在3V至4.2V之间变化)升压至5V,然后将5V降压至3.3V,这会使电源经历双重转换。两次电源转换步骤的效率是这些转换步骤中每次转换的效率的乘积,所以,我所描述情况下的总体效率是比较低的。例如,如果升压转换器的效率为90%,降压转换器的效率为95%,那么总体效率只有85.5%。一定有一个耗能更低的好方法来生成这个3.3V电压。使用TPS63025降压-升压转换
maylove 模拟与混合信号
再下一城,EP868已支持STM32F全系列JTAG/SWD脱机下载
下表为截至2009.10.15EP868对ST的支持情况一览表,以及将补强的内容。再下一城,EP868已支持STM32F全系列JTAG/SWD脱机下载
探索者 stm32/stm8
无线数据通信协议制定
我们用电台做数据的传输,电台属于半双工,所以设备在一个信道上。所以当有2个以上的设备同时发送时,数据会产生碰撞,发送失败。 我们是一个主站,多个从站(140台左右)。主站下发信息,从站收到后回复ACK,表示通讯成功。从站也有主动上传的时候。原来我们用的时分复用方式,给从站分配不同的ID号。主站先发送信息,过2秒后,发送同步信号,从站收到后在自己的时间片内(通过从站ID得到)上传数据。这种方式数据传输比较可靠,但实时性上不好。所以想采用CSMA/CA的方式,检测信道,空闲后发送。 现在用的电台
xinxi 嵌入式系统
大学生电子设计竞赛指南(资源下载)
大学生电子设计竞赛指南: 大学生电子设计竞赛指南(资源下载)
sigma 电子竞赛
2015电设各种讨论
为了梦想我们选择了同样的专业,为了兴趣我们选择了同样的比赛。虽然有的是神,有的是人,有的是鬼。但可以肯定我们都是一群放弃治疗的孩子。或许为了梦醒,或许为了尊严,或许为了证明自己,但我们都来到了同一个精神病院。不放假不睡觉明知道前边有老虎就还就是想把老虎的牙隔断。有什么想说的有什么想问的来这里一起聊聊吧!!!”病友们“!!! 2015电设各种讨论
123liulang321 电子竞赛
为什么BUCK的电路效率一般比较高呢?
为什么BUCK的电路效率一般比较高呢?BUCk电路效率的高低是不是也取决于负载如果轻负载的情况效率是不是也不会高? 为什么BUCK的电路效率一般比较高呢?
小太阳yy 开关电源学习小组
小广播
设计资源 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2023 EEWORLD.com.cn, Inc. All rights reserved