Arduino+DHT11监测室内温湿度

目的:通过新购置的XBee传感器扩展板及温湿度传感器测量室内温湿度参数,并将数据通过RasPi上传至Yeelink;
材料:Arduino Uno R3、RasPi、XBee传感器扩展板、DHT11温湿度传感器、 母对母连接线若干;
环境:通过SSH连接RasPi,由RasPi控制Arduino并编程,并将Arduino采集到的数据存储上传;

传感器与扩展板间的连接,需将DHT11的S口(信号)连接XBee版A0对应S口,负极连对应GND、中间为电源输入口,连接5V口。

重点回到软件环境配置,需要先将DHT11的库文件导入Arduino IDH环境中,先找到Arduino的安装路径及对应的库目录,执行以下命令:

whereis arduino //使用whereis命令查找程序安装路径

从结果中挨个寻找,看哪个目录下有libraries文件夹,找到后cd进入,执行:

wget http://www.mobile20.com.cn/cubie/Dht11.zip //下载DHT11库文件
unzip Dht11.zip //解压ZIP

OK,删除掉zip原文件后打开Arduino IDH,粘贴以下代码,来让DHT11温湿度传感器开工:

#define dht_dpin A0
byte bGlobalErr;
byte dht_dat[5];

void setup(){
InitDHT();
Serial.begin(9600);
delay(300);
Serial.println("Humidity and temperaturenn");
delay(700);
}

void loop(){
ReadDHT();
switch (bGlobalErr){
case 0:
Serial.print("H:");
Serial.print(dht_dat[0], DEC);
Serial.print(".");
Serial.print(dht_dat[1], DEC);
Serial.print("");
Serial.print("T");
Serial.print(dht_dat[2], DEC);
Serial.print(".");
Serial.print(dht_dat[3], DEC);
Serial.println(".");
break;
case 1:
Serial.println("Error 1: DHT start condition 1 not met.");
break;
case 2:
Serial.println("Error 2: DHT start condition 2 not met.");
break;
case 3:
Serial.println("Error 3: DHT checksum error.");
break;
default:
Serial.println("Error: Unrecognized code encountered.");
break;
}
delay(800);
}

void InitDHT(){
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,HIGH);
}

void ReadDHT(){
bGlobalErr=0;
byte dht_in;
byte i;
digitalWrite(dht_dpin,LOW);
delay(20);

digitalWrite(dht_dpin,HIGH);
delayMicroseconds(40);
pinMode(dht_dpin,INPUT);
//delayMicroseconds(40);
dht_in=digitalRead(dht_dpin);

if(dht_in){
bGlobalErr=1;
return;
}
delayMicroseconds(80);
dht_in=digitalRead(dht_dpin);

if(!dht_in){
bGlobalErr=2;
return;
}
delayMicroseconds(80);
for (i=0; i<5; i++)
dht_dat[i] = read_dht_dat();
pinMode(dht_dpin,OUTPUT);
digitalWrite(dht_dpin,HIGH);
byte dht_check_sum =
dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
if(dht_dat[4]!= dht_check_sum)
{bGlobalErr=3;}
};

byte read_dht_dat(){
byte i = 0;
byte result=0;
for(i=0; i< 8; i++){
while(digitalRead(dht_dpin)==LOW);
delayMicroseconds(30);
if (digitalRead(dht_dpin)==HIGH)
result |=(1<<(7-i));
while (digitalRead(dht_dpin)==HIGH);
}
return result;
}

将代码上传至Arduino,此时传感部分已正常工作。接下来,需要通过RasPi存储并上传上一部分采集到的数据。整体原理与《Arduino+Raspi+GP2Y1010+Yeelink空气质量监测方案》文中所述一致,但由于传感器最终输出的内容格式如下(可以通过Arduino串口工具实时查看):

H35.0T28.0.
H35.0T28.0.
H35.0T28.0.
H35.0T29.0.
......

所以,对应的上传到Yeelink的.sh代码要修改为:

SDWD=`tail /home/pi/TR.log -n 1` //读取日志文件最后一行
SD=`expr substr $SDWD 2 4`
WD=`expr substr $SDWD 7 4`
printf $SD
curl --request POST --data '{"value":'$SD'}' --header "U-ApiKey:你的API" http://api.yeelink.net/v1.0/device/*** //替换为自己的API及传感器接口地址
sleep 5s
printf $WD
curl --request POST --data '{"value":'$WD'}' --header "U-ApiKey:你的API" http://api.yeelink.net/v1.0/device/*** //替换为自己的API及传感器接口地址

保存后,别忘了给该.sh文件设置执行权限、测试执行,如无问题,即可加入定时任务,每分钟上传一次数据。

本文温湿度监测页面Demo:http://www.yeelink.net/devices/6189

附XBee传感器扩展板介绍:

XBee传感器扩展板(Arduino Sensor Shield)是为解决Arduino开源平台连接电路比较麻烦的问题,方便连接各类传感器而生,对爱好电子制作的同学很实用。国内较常见的是FUNDUINO、DFRobot、OpenJumper等生产的板子,最新版本为V5.0。

V5性能描述(FUNDUINO出品):

1、扩展14个数字IO口(12个舵机接口)及电源;
2、6个模拟IO口及电源;
3、1个数字端口外接电源接线柱;
4、数字端口外部供电和板载电源自动切换;
5、1个外接电源输入接线柱和1个输入插针;
6、RS485接口;
7、复位按钮;
8、xbee/Bluetooh Bee蓝牙无线数传接口;
9、APC220/Bluetooh V3蓝牙无线数传接口;
10、IIC/I2C/TWI接口;
11、3.3V输出端口;
12、SD卡模块接口;