STM32的 DHT11温湿度模块+红外人体感应模块程序

基于物联网的智能窗户Day3

DHT11温湿度模块

STM32的 DHT11温湿度模块+红外人体感应模块程序
传感器包括一个高分子电阻式感湿度元件和一个NTC测温元件,并于一个高性能8位单片机相连,通过单总线与微处理器通信,只需要一根数据线。

STM32的 DHT11温湿度模块+红外人体感应模块程序
在相关例程基础上进行改动

//复位DHT11
void DHT11_Rst(void)    
{                 
 DHT11_IO_OUT();  //SET OUTPUT
    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();//SET INPUT  
    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:存在 

在main函数中对读取到的温湿度进行显示即可

HC_SR501红外人体感应模块

这个模块长这个样子
STM32的 DHT11温湿度模块+红外人体感应模块程序

当然也可以专业一点看它
STM32的 DHT11温湿度模块+红外人体感应模块程序
先找到它的数据手册,查看相关电气参数
STM32的 DHT11温湿度模块+红外人体感应模块程序

这个模块使用较为简单,如果检测到有异物,即输出高电平。这样只需要进行电平判断即可。
本程序下,数据引脚接PA0。VCC接5V
在.c文件中进行端口的配置(下拉输入)

u8 INFRARED_Init(void)
{  
  GPIO_InitTypeDef  GPIO_InitStructure;
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能PB端口时钟
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     //PA端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;    //下拉输入
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);     //初始化IO口
  GPIO_SetBits(GPIOA,GPIO_Pin_0);       //PA0 
       
 
} 

.h文件如下

#ifndef __INFRARED_H
#define __INFRARED_H
#include "stm32f10x.h"
#define  HC_SR501   PAin(0)
#define  HC_SR501_PIN  GPIO_Pin_0
#define  HC_SR501PORT  GPIOA
#define  HC_SR501_CLKLINE    RCC_APB2Periph_GPIOA
u8 INFRARED_Init(void);
extern void HC_SR501Configuration(void);
#endif

主程序中只需要对HC_SR501的高低电平进行判断,结合前一天的OLED显示部分相关文字内容即可。

结果展示

STM32的 DHT11温湿度模块+红外人体感应模块程序
STM32的 DHT11温湿度模块+红外人体感应模块程序

ending

桂林的回南天整天都湿哒哒的感觉空气湿度百分之67…………

最后一句话 to Z
听山河把春风酿成千言万语,吹过旧人故里

上一篇:捕获异常URL--scrapy 源码分析之retry中间件


下一篇:Spring的Retry使用