本帖最后由 tsaiwn 于 2015-4-29 01:49 编辑
其实读取 DHTxx 没啥学问, 可以不使用DHTxx 庫 !
Arduino 每次与 DHT11 沟通可读取 40 bits == 也就是 5 bytes,
其中 2 bytes 是湿度, 2 bytes 是温度,
然后这 4 bytes 加起来除以 256取余数(称 checkSum)必须等於第 5 bytes
否则表示接收资讯错误 !
可忽略第 5 byte,
仍然拿湿度温度来用!
不过大部分的 DHTxx 库是如果发现 第 5 byte 不等於4 bytes的 checksum ,
那就不使用收到的湿度温度资讯!
至於只有一条信號线要如何读取呢:
看看以下这我从淘宝网抄来, 我修改过並加入注释的 DHT11 范例:
(不能用於 DHT22, 因为DHT11 只有整数, DHT22 有小数, 格式不同)
- //Test the DHT11 -- Modified by [email][email protected][/email]
- int dhPin = 8; // 温溼度讯號接脚连入 Arduino 的 Pin 8
- byte dat[5]; // 存放湿度2byte, 温度 2 byte, checksum 1 byte
- byte readData( ) { // 每次读取 8 bits ( one byte)
- byte data;
- for(int i=0; i<8; i++) {
- if(digitalRead(dhPin) == LOW) { // 一开始要 LOW 才表示要传过来
- while(digitalRead(dhPin) == LOW); //等待 50us;
- // 现在已经变成 HIGH 了
- delayMicroseconds(30); //判断高电平持续时间,以判定资料是‘0’还是‘1’;
- if(digitalRead(dhPin) == HIGH) // 持续了 30 us 以上就是 1
- data |= (1<<(7-i)); //高位在前,低位元在后;
- //如果这时已经是 LOW, 表示这 bit 是 0, 不必塞入 data
- //..而且以下的 while 也会立即结束(因为 LOW), 准备接收下一个 bit
- while(digitalRead(dhPin) == HIGH); // 等待下一bit的接收;
- //这时一定已经变成 LOW 了
- }// if
- }// for(
- return data; // 收完 8 bit = one byte = one char
- } // readData(
- void start_test( ) { // 每次要与 DHT11 沟通
- digitalWrite(dhPin,LOW); //拉低到 LOW,发表示要开始沟通的信號;
- delay(30); //延时要大於 18ms,以便 DHT11 能检测到开始信號;我们用30ms
- digitalWrite(dhPin,HIGH); // 拉高HIGH, 让 DHT11 拉低到 LOW 告诉我们要传送
- delayMicroseconds(40); // 给40us等待 DHT11 响应;
- pinMode(dhPin,INPUT); // 改为输入 mode 准备 digitalRead( )
- while(digitalRead(dhPin) == HIGH); // 必须等到 LOW
- delayMicroseconds(80); //DHT11 发出响应,会拉低 80us;所以至少等80us
- while(digitalRead(dhPin) == LOW); // 继续等到变 HIGH
- delayMicroseconds(80); //DHT11 会拉高到HIGH 80us 后开始发送资料;
- /// 以下连续读入 5 bytes (40 bits), 最后的 byte 是 checksum 校验值
- for(int i=0;i < 5;i++) dat[i] = readData( ); //接收温湿度资料,校验位元;
- pinMode(dhPin,OUTPUT); // 改为 Output mode, 准备拉高HIGH
- digitalWrite(dhPin,HIGH); //发送完一次资料后释放bus,等待下一次开始信號;
- }
- void setup( ) { Serial.begin(9600); pinMode(dhPin, OUTPUT); }
- void loop( ) {
- start_test( ); // 读取湿度温度和检核位到 dat[ ]; 其中dat[4]是checkSum
- // 根据datasheet规定, dat[4] 要 == (dat[0]+dat[1]+dat[2]+dat[3]) %256
- // 否则表示沟通有错误 !!
- Serial.print("Current humdity = ");
- Serial.print(dat[0], DEC); //显示湿度的整数部分;
- Serial.print('.');
- Serial.print(dat[1],DEC); //显示湿度的小数位;(其实是 0)
- Serial.println(" %"); // 注意有空格要用 " %" 不可用 ' %'
- Serial.print("Current temperature = ");
- Serial.print(dat[2], DEC); //显示温度的整数部分;
- Serial.print('.');
- Serial.print(dat[3],DEC); //显示温度的小数位;(其实是 0)
- Serial.println(" C");
- delay(1985);
- } /// [url]http://keyes-arduino.taobao.com[/url]
- // Also see [url]http://playground.arduino.cc/main/DHT11Lib[/url]
复制代码 |