乐者为王

Do one thing, and do it well.

使用Raspberry Pi监控室内温湿度

机房没有温湿度监控系统,只有温湿度计,还不是数字的,只能得到个大概的读数,不是非常精确。怎么办?自己动手DIY个在线的温湿度监控系统吧!

物品清单:

  • 金士顿16G的SDHC卡1张
  • SDHC读卡器1个(可选)
  • 网线1条
  • 手机充电器(5V/1A)1个
  • MicroUSB数据线1条
  • 电脑1台
  • 1P-1P双头母杜邦线3条
  • 10K电位器一个
  • DHT11或DHT22温湿度传感器一个(可以购买已经焊好电阻的传感器模块)

让树莓派(Raspberry Pi)工作起来

http://www.raspberrypi.org/downloads 下载基于debian的wheezy镜像Raspbian。如果使用Windows系统,官方建议使用Win32DiskImager来复制image文件到SD卡(如果是Linux系统可以用工具dd)。写入系统后,把卡插到板子上,接上网线、电源,然后就启动了。等个20多秒,板上3个小灯都亮了,表明系统已经启动成功。

登录路由器后台找到raspberrypi设备分配到的IP。然后使用SSH或VNC(前者是命令行界面,后者是图形界面)连接刚才从路由器找到的IP地址。登录的默认账号是pi,密码是raspberry。登录RPi之后输入ping qq.com测试上网是否正常。

使用固定的IP访问RPi

默认情况下RPi使用的是自动分配的IP地址,每次登录都需要在路由器中查找对应IP,实在太麻烦,可以把它设置成静态的。

1
sudo vi /etc/network/interfaces

打开配置文件,看到如下内容

1
2
3
4
5
6
7
8
9
auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

将之修改成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
auto lo

iface lo inet loopback

iface eth0 inet static
  address 192.168.0.100
  netmask 255.255.255.0
  gateway 192.168.0.1
  dns-nameservers 8.8.8.8

allow-hotplug wlan0
iface wlan0 inet manual
  wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp

然后存盘退出。以后就可以通过192.168.0.100来登录RPi了。

把温湿度传感器接到RPi上

DHT11/DHT22共有4根引脚:

1
2
3
4
1 -> 3.3v 接左边第1个GPIO针脚
2 -> GPIO 数据接口,可随意连接1个GPIO针脚(第7个针脚对应的是GPIO Pin #4)
3 -> NC 不接
4 -> GND 接地(第14个针脚)

注意:在1脚和2脚间还需要并联10K的电阻,以保持读数稳定。

安装好的样子:

用C代码读取当前的温度和湿度值

用的是树莓派2红色B型,它采用Broadcom BCM2835 (CPU, GPU, DSP, and SDRAM)芯片。所以读取GPIO口需要到 http://www.open.com.au/mikem/bcm2835/index.html 获取最新的BCM2835 C语言库,然后下载,编译和安装。

1
2
3
4
5
6
wget http://www.open.com.au/mikem/bcm2835/bcm2835-1.36.tar.gz
tar -zxvf bcm2835-1.36.tar.gz
cd bcm2835-1.36
./configure
make
sudo make install

从GitHub库中获取DHT11/DHT22温湿度程序,编译测试。

1
2
3
4
5
cd /home/pi
git clone https://github.com/dohkoos/Raspberry-Pi-Code.git
cd Raspberry-Pi-Code/DHT22
make
sudo ./dht 22 4 # 数据接口接在第7针脚,所以这里是4

记录曲线图到云端

这里使用Yeelink的服务,Yeelink是国内比较知名的免费物联网数据平台。根据它的API规则,提交的数据必须为JSON格式:

1
{"timestamp": "2012-03-15 16:13:14", "value": 294.34}

将温湿度值提交到Yeelink的Ruby代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Capture temperature & humidity value from the console
output = `sudo ./dht 22 4`
mt = /Temp =\s+([0-9.]+)/.match(output)
temperature = mt[1]

mt = /Hum =\s+([0-9.]+)/.match(output)
humidity = mt[1]

# Combined temperature & humidity value into json format
json_temperature = %Q[{\\"timestamp\\": \\"#{Time.now}\\", \\"value\\": #{temperature}}]
json_humidity = %Q[{\\"timestamp\\": \\"#{Time.now}\\", \\"value\\": #{humidity}}]

# Post json data to Yeelink
`curl -X POST -d "#{json_temperature}" -H "Content-Type: application/json" -H "U-ApiKey:XXXXXXXXXXXXXXXX" http://api.yeelink.net/v1.0/device/<device_id>/sensor/<sensor_id>/datapoints`
`curl -X POST -d "#{json_humidity}" -H "Content-Type: application/json" -H "U-ApiKey:XXXXXXXXXXXXXXXX" http://api.yeelink.net/v1.0/device/<device_id>/sensor/<sensor_id>/datapoints`

将U-ApiKey:XXXXXXXXXXXXXXXX替换为自已账户的API Key,后面的URL也需要替换为自己申请的传感器URL。

添加到计划任务

使用crontab命令将以下内容添加到计划任务中:

1
2
# m h dom mon dow command
*/10 * * * * cd /home/pi/Raspberry-Pi-Code/DHT22/ && ruby yeelink.rb

重启计划任务,然后每隔10分钟就会上传一次数据到云端。

1
sudo /etc/init.d/cron restart

下面是我的曲线图:

Comments