树莓派+DHT11温湿度传感器实现室内温湿度监控

一、硬件准备

1、树莓派(Raspberry Pi)一个
2、DHT11温湿度传感器一个(淘宝大概5元左右)
3、4.7kΩ电阻一个 或 DHT11温湿度传感器模块一个(笔者用,淘宝1.5元一个,其实就是店家帮忙把电阻焊好了,接线稍好看些)。
4、杜邦线三根(双头母)

二、接线方式(如图所示)

先贴一张树莓派3b的引脚图:
20161108083724411.png

在连线的时候注意树莓派引脚图的方向,如上图所示。我用的是三个头的dht11传感器,因此连线方式是:

VCC(或正极) --- 树莓派的3v电源

GND (地线或者负极)--- 树莓派的gnd接口

DATA (D或者out) ---树莓派的GPIO引脚

注意自己的传感器的接口的顺序。

三、确认硬件接线是否正确并生效

1、首先升级内核(可忽略,但如果版本较老,可能影响设备读取)

apt-get update
apt-get upgrade

修改配置:

sudo nano /boot/config.txt

在最后一行手动添加这个,保存并重启树莓派。

dtoverlay=w1-gpio-pullup,gpiopin=4

四、用python读取温度值

import RPi.GPIO as GPIO  
import time  
  
channel =4   
data = []  
j = 0  
  
GPIO.setmode(GPIO.BCM)  
  
time.sleep(1)  
  
GPIO.setup(channel, GPIO.OUT)  
GPIO.output(channel, GPIO.LOW)  
time.sleep(0.02)  
GPIO.output(channel, GPIO.HIGH)  
GPIO.setup(channel, GPIO.IN)  
  
while GPIO.input(channel) == GPIO.LOW:  
  continue  
while GPIO.input(channel) == GPIO.HIGH:  
  continue  
  
while j < 40:  
  k = 0  
  while GPIO.input(channel) == GPIO.LOW:  
    continue  
  while GPIO.input(channel) == GPIO.HIGH:  
    k += 1  
    if k > 100:  
      break  
  if k < 8:  
    data.append(0)  
  else:  
    data.append(1)  
  
  j += 1  
  
print "sensor is working."  
print data  
  
humidity_bit = data[0:8]  
humidity_point_bit = data[8:16]  
temperature_bit = data[16:24]  
temperature_point_bit = data[24:32]  
check_bit = data[32:40]  
  
humidity = 0  
humidity_point = 0  
temperature = 0  
temperature_point = 0  
check = 0  
  
for i in range(8):  
  humidity += humidity_bit[i] * 2 ** (7-i)  
  humidity_point += humidity_point_bit[i] * 2 ** (7-i)  
  temperature += temperature_bit[i] * 2 ** (7-i)  
  temperature_point += temperature_point_bit[i] * 2 ** (7-i)  
  check += check_bit[i] * 2 ** (7-i)  
  
tmp = humidity + humidity_point + temperature + temperature_point  
  
if check == tmp:  
  print "temperature :", temperature, "*C, humidity :", humidity, "%"  
else:  
  print "wrong"  
  print "temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp  
  
GPIO.cleanup()

五、上报到yeelink

yeelink是国内比较知名的免费物联网数据平台,国外有COSM(https://cosm.com)。
申请yeelink账号及添加设备和传感器,以及API的学习,本文跳过,请大家自行去学习一下。

根据yeelink API的规则,我们需要提供一个文本文件,内容为一段JSON,如下:
{
“timestamp”:”2012-03-15T16:13:14″,
“value”:294.34
}

若未指定timestamp, 服务器会自动加上当前时间,所以本文的操作不添加该字段

1、修改python,将温度值用JSON格式保存到一个文本文件,全部如下:

import RPi.GPIO as GPIO  
import time  
  
channel =4   
data = []  
j = 0  
  
GPIO.setmode(GPIO.BCM)  
  
time.sleep(1)  
  
GPIO.setup(channel, GPIO.OUT)  
GPIO.output(channel, GPIO.LOW)  
time.sleep(0.02)  
GPIO.output(channel, GPIO.HIGH)  
GPIO.setup(channel, GPIO.IN)  
  
while GPIO.input(channel) == GPIO.LOW:  
  continue  
while GPIO.input(channel) == GPIO.HIGH:  
  continue  
  
while j < 40:  
  k = 0  
  while GPIO.input(channel) == GPIO.LOW:  
    continue  
  while GPIO.input(channel) == GPIO.HIGH:  
    k += 1  
    if k > 100:  
      break  
  if k < 8:  
    data.append(0)  
  else:  
    data.append(1)  
  
  j += 1  
  
print "sensor is working."  
print data  
  
humidity_bit = data[0:8]  
humidity_point_bit = data[8:16]  
temperature_bit = data[16:24]  
temperature_point_bit = data[24:32]  
check_bit = data[32:40]  
  
humidity = 0  
humidity_point = 0  
temperature = 0  
temperature_point = 0  
check = 0  
  
for i in range(8):  
  humidity += humidity_bit[i] * 2 ** (7-i)  
  humidity_point += humidity_point_bit[i] * 2 ** (7-i)  
  temperature += temperature_bit[i] * 2 ** (7-i)  
  temperature_point += temperature_point_bit[i] * 2 ** (7-i)  
  check += check_bit[i] * 2 ** (7-i)  
  
tmp = humidity + humidity_point + temperature + temperature_point  
  
if check == tmp:  
  print "temperature :", temperature, "*C, humidity :", humidity, "%"  
else:  
  print "wrong"  
  print "temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp  
  
GPIO.cleanup()

res = '{"value":%f}' %temperature
output = open('/home/pi/datafile.txt', 'w')
output.write(res)
output.close

python将温度值写入:/home/pi/datafile.txt

2、新增yeelink.sh脚本
文件位置:/home/pi/yeelink.sh
内容如下:

sudo python /home/pi/temperature.py
curl --request POST --data-binary @"/home/pi/datafile.txt" --header "U-ApiKey:XXXXXXXXXXXXXXXX" http://api.yeelink.net/v1.0/device/1969/sensor/2533/datapoints

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

3、添加到计划任务

#为脚本增加可执行权限
sudo chmod +x yeelink.sh
#将脚本加入cronjob(计划任务)
sudo crontab -e
#在cornjob文件中添加下面一行,并保存(表示2分钟执行一下脚本,时间可自行修改)
*/2 * * * * /home/pi/yeelink.sh

大功告成!

最后修改:2017 年 08 月 22 日 11 : 55 PM
如果觉得我的文章对你有用,请随意赞赏