DHT11温湿度传感器

DHT11温湿度传感器
DHT11简介

本文本质为学习笔记,在B站学习后的代码总结

数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,一次通讯时间 4ms 左右,一次完整的数据传输为 40bit,高位先出,数据分小数部分和整数部分,bytel0为校验位。

  • 工作电压范围: 3.3V-5.5V

  • 工作电流 :平均 0.5mA

  • 输出:单总线数字信号

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

  • 精度 :湿度±5%,温度±2℃

  • 分辨率 :湿度 1%,温度 1℃

  • 时序图:

  • myDHT11.h代码
  • #ifndef __MYDHT11_H_ #define __MYDHT11_H_ void myDHT11_putinit(void);//输入模式 void myDHT11_getinit(void);//输出模式 unsigned char myDHT11_readbyte(void);//读取8位字节 unsigned char myDHT11_getdata(unsigned char *wen_H,unsigned char *wen_L,unsigned char *shi_H,unsigned char *shi_L);//读取温湿度高低8位,传入为指针,读取温湿度时主要使用这个函数 #endif
    myDHT11.c代码
    #include "stm32f10x.h" #include "myDHT11.h" #include "delay.h"//这个库相信你应该有的,如果没有自己写一下也不难 /**************************只需更改下面参数即可移植*******************************/ #define myDHT11_RCC RCC_APB2Periph_GPIOA //时钟线选择 #define myDHT11_GPIO GPIOA //GPIO组选择 #define myDHT11_Pin GPIO_Pin_0 //引脚号 /**************************************************************************/ void myDHT11_putinit()//输入模式 { RCC_APB2PeriphClockCmd(myDHT11_RCC,ENABLE);//开启GPIOA时钟 GPIO_InitTypeDef GPIO_initstructure; GPIO_initstructure.GPIO_Mode=GPIO_Mode_Out_OD;//推挽输出模式 GPIO_initstructure.GPIO_Pin=myDHT11_Pin;//选择引脚号为PA0 GPIO_initstructure.GPIO_Speed=GPIO_Speed_50MHz;//输入速率 GPIO_Init(myDHT11_GPIO,&GPIO_initstructure); } void myDHT11_getinit()//输出模式 { RCC_APB2PeriphClockCmd(myDHT11_RCC,ENABLE);//开启GPIOA时钟 GPIO_InitTypeDef GPIO_initstructure; GPIO_initstructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入模式 GPIO_initstructure.GPIO_Pin=myDHT11_Pin;//选择引脚号为PA0 GPIO_initstructure.GPIO_Speed=GPIO_Speed_50MHz;//输入速率 GPIO_Init(myDHT11_GPIO,&GPIO_initstructure); } unsigned char myDHT11_readbyte()//读取8位字节 { unsigned char retry=0,i,temp,data=0; for(i=0;i<8;i++) { while(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)==0 && retry<100) { Delay_us(1); retry++; } retry=0; Delay_us(30); temp=0; if(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)==1)temp=1; while(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)==1 && retry<100) { Delay_us(1); retry++; } retry=0; data<<=1; data |=temp; } return data; } unsigned char myDHT11_getdata(unsigned char *wen_H,unsigned char *wen_L,unsigned char *shi_H,unsigned char *shi_L)//读取温湿度高低8位,传入为指针 { unsigned char i,retry=0,sum=0; unsigned char arr[5]; myDHT11_putinit(); GPIO_ResetBits(myDHT11_GPIO,myDHT11_Pin); Delay_ms(20);//18=< =<30 GPIO_SetBits(myDHT11_GPIO,myDHT11_Pin); Delay_us(13);//10=< =<20 myDHT11_getinit(); Delay_us(20); if(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)==0) { while(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)==0 && retry<100) { Delay_us(1); retry++; } retry=0; while(GPIO_ReadInputDataBit(myDHT11_GPIO,myDHT11_Pin)==1 && retry<100) { Delay_us(1); retry++; } retry=0; for(i=0;i<5;i++) { arr[i]=myDHT11_readbyte(); } Delay_us(50); } sum=arr[0]+arr[1]+arr[2]+arr[3]; *shi_H=arr[0]; *shi_L=arr[1]; *wen_H=arr[2]; *wen_L=arr[3]; if(sum==arr[4]) return 1;//校验正确返回1 else return 0;//校验错误返回0 }

    main.c代码

  • #include "stm32f10x.h" #include "OLED.h" #include "DHT11.h" int main() { unsigned char wen_H,wen_L,shi_H,shi_L;//用于接收温湿度数据 OLED_Init(); while(1) { if(myDHT11_getdata(&wen_H,&wen_L,&shi_H,&shi_L)==1)//温湿度校验,返回值为1则校验正确 { OLED_ShowNum(1, 6, wen_H, 2);//显示所读取的温度数值 OLED_ShowNum(2, 6, shi_H, 2);//显示所读取的湿度数值 } OLED_ShowChinese(1,1,0);//温 OLED_ShowChinese(1,2,1);//度 OLED_ShowChar(1, 5, ':'); OLED_ShowChinese(1,5,4);//℃ OLED_ShowChinese(2,1,2);//湿 OLED_ShowChinese(2,2,1);//度 OLED_ShowChar(2, 5, ':'); OLED_ShowChar(2, 8, '%'); } }