前两天在箱子里发现还有一颗闲置的DHT11没用过,暑假没啥事就顺便折腾一下。期间遇到不少问题,分享分享。
DHT11的数据手册就不传了,网上很容易找到 , 通信协议也比较简单。
Arduino用的是ATmega328的板子.
网上也有DHT11的现成的库文件,大概看了一下,发现网上对这个库函数有好几种说法,并且说的函数和arduino里面下载库函数并不一样,乱不清楚干脆自己写一个,顺便练习练习。
————————————————————
正文:
截图自DHT11数据手册
以主机将数据io拉低至少18ms为起始信号,之后DHT11在等待20-40us之后再次将io拉低80us再拉高80us作为响应。之后开始发送数据.
数据 0 的电平
数据 1 的电平
在DHT11响应之后开始发送数据,高位在前。依次是8位湿度整数,8位湿度整数,8位温度整数,8位温度小数,8位校验值,共40位。校验值为温度和湿度的和。
下面是程序:
NormalText Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
int out=2; //2号IO口作为通信接口
void setup() { Serial.begin(115200); //波特率115200 pinMode(out,INPUT); //IO口设为输入模式 } void loop() { begin(); //起始函数,向DHT11发送起始信号 int* b=read1();//读取传感器数据 display_1(b);//串口显示数据 } void begin() { pinMode(out,OUTPUT);//io 设为输出模式,是因为测量发现DHT11的上拉电流有5mA, //远大于输入模式下ATmega328的 io 的下拉电流,便无法得到 起始的至少28ms的低电平。 digitalWrite(out,HIGH);//io置高 delay(1400); //等待1.4s,因为DHT11的采样周期为1s,这里取的稍长一些。 digitalWrite(out,LOW);//io拉低,发送起始信号 delay(30); //延时至少28ms,这里取30ms digitalWrite(out,HIGH);//拉高 pinMode(out,INPUT);//切换到输入模式,准备读数据 } int* read1() { int a[6]={0,0,0,0,0,0};//定义数组,存放数据 int i,j;//变量,下面用到 int* b=new int[5];//用b将数据返回给loop()**此处将传感器数据传递出去用全局变量也行,但想试试其他方法*** delayMicroseconds(40);//延时40us,等待DHT11将io拉低 if(digitalRead(out)==0)//io读取值为0,说明DHT11已响应,io已经被拉低 { while(digitalRead(out)==0);//等待80us的低电平结束 delayMicroseconds(90);//等待80us的高电平结束 for(i=0;i<5;i++)//5个元素,依次存放温度、湿度、校验值数据 { for(j=0;j<8;j++)//依次读取各二进制位 { while(digitalRead(out)==0);//等待50us的低电平结束 |