ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-03-12 18:32:03  阅读:247  来源: 互联网

标签:retry u8 温湿度 void STM32 模块 GPIO DQ DHT11


基于物联网的智能窗户Day3

DHT11温湿度模块

在这里插入图片描述
传感器包括一个高分子电阻式感湿度元件和一个NTC测温元件,并于一个高性能8位单片机相连,通过单总线与微处理器通信,只需要一根数据线。

在这里插入图片描述
在相关例程基础上进行改动

//复位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红外人体感应模块

这个模块长这个样子
在这里插入图片描述

当然也可以专业一点看它
在这里插入图片描述
先找到它的数据手册,查看相关电气参数
在这里插入图片描述

这个模块使用较为简单,如果检测到有异物,即输出高电平。这样只需要进行电平判断即可。
本程序下,数据引脚接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显示部分相关文字内容即可。

结果展示

在这里插入图片描述
在这里插入图片描述

ending

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

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

标签:retry,u8,温湿度,void,STM32,模块,GPIO,DQ,DHT11
来源: https://blog.csdn.net/onewingone/article/details/114702025

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有