上周空气不好,突发奇想要搞个个人物联网系统,检测生存环境。手头有树莓派、NodeMCU esp8266、DHT11温湿度传感器。pm2.5检测需要专门的传感器,本以为也就几块钱,结果发现淘宝还挺贵。在调研了一圈之后,最后在咸鱼花28淘了一个攀藤g7(PMS7003/G7M-攀藤G7科技高精度激光传感器链接不是带货的,只是用来看传感器介绍的)。攀藤g7需要配套的转接板,转接板直接插到传感器上,数据线用于连接转接板和usb转ttl转换器(数据线直接连树莓派的GPIO引脚进行传感器数据读取应该也可以,没有尝试)。要注意的地方:转接板接的电源是5v,RX、TX引脚分别接usb转ttl转换器的TX、RX。
我的硬件照片、连接细节
现在硬件已经准备好了,下面要做的就是用usb转ttl转换器连接电脑,测试串口通信是否能读取到数据。win10下连接后用串口调试软件读COMX端口(X是某个数字),如果能读到数据,说明硬件设备没问题,可以直接用了。
如果要监控室外空气质量,可以用Node MCU替换usb转ttl转换器,然后把硬件设备供电放到室外,可以通过Node MCU将攀藤g7采集到的数据传送给树莓派。当然这需要Node MCU和树莓派共用一个局域网。
树莓派3b不需要进行设置,只要把usb转ttl转换器插到树莓派3b的usb口,就可以直接进行读取操作了。代码如下:
#encoding=utf-8
# 参考:
# https://my.oschina.net/wangandi/blog/901648
import os
import serial
import time
from struct import *
ser = serial.Serial("/dev/ttyUSB0", baudrate=9600, timeout=2.0)
def read_pm_line(_port):
rv = b''
while True:
ch1 = _port.read()
if ch1 == b'\x42':
ch2 = _port.read()
if ch2 == b'\x4d':
rv += ch1 + ch2
rv += _port.read(38)
return rv
def main():
recv = read_pm_line(ser)
tmp = recv[4:28]
datas = unpack('>hhhhhhhhhhhh', tmp)
print('Plantower PMS7003,Updated:',time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
print('PM1.0(CF=1): {}ug/m3\n'
'PM2.5(CF=1): {}ug/m3\n'
'PM10 (CF=1): {}ug/m3\n'
'PM1.0 (STD): {}ug/m3\n'
'PM2.5 (STD): {}ug/m3\n'
'PM10 (STD): {}ug/m3\n'
'>0.3um : {}/0.1L\n'
'>0.5um : {}/0.1L\n'
'>1.0um : {}/0.1L\n'
'>2.5um : {}/0.1L\n'
'>5.0um : {}/0.1L\n'
'>10um : {}/0.1L'.format(datas[0], datas[1], datas[2],
datas[3], datas[4], datas[5],
datas[6], datas[7], datas[8],
datas[9], datas[10], datas[11]))
ser.flushInput()
time.sleep(0.1)
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
if ser != None:
ser.close()
执行效果如图(现在空气怎么这么好?当然是买了空气净化器啊):
值得注意的是,网上有一些python读取攀藤g5传感器的代码,应该也可以直接拿来用。但是攀藤g7传感器相比g5少了温湿度和甲醛的信息,这一点可以从两者的说明书(攀藤g7说明书链接:https://wenku.baidu.com/view/397c8f34856a561253d36f3d.html,攀藤g5说明书链接https://wenku.baidu.com/view/4f6a10bad5d8d15abe23482fb4daa58da0111cf2.html)看出来。下面是攀藤g7的数据传输协议,数据13保留,后面就是校验码了,而攀藤g5的数据13、14、15分别是甲醛、温度、湿度。。。
DHT11温湿度传感器比较简单,三个引脚分别是电源、数据引脚、接地。电源和接地在树莓派的VCC和GND上,选择一个GPIO引脚用于连接数据引脚,比如我用的是GPIO 4。连接完成后,树莓派接通电源,执行以下操作(忘了是pip还是pip3):
git clone https://github.com/szazo/DHT11_Python
cd DHT11_Python
pip install dht11
现在python已经有了dht11的库,可以执行以下代码读取温湿度数据:
import RPi.GPIO as GPIO
import dht11
# initialize GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
# 端口一定要跟硬件连接匹配!
# read data using pin 4
instance = dht11.DHT11(pin = 4)
result = instance.read()
if result.is_valid():
print("Temperature: %-3.1f C" % result.temperature)
print("Humidity: %-3.1f %%" % result.humidity)
else:
print("Error: %d" % result.error_code)
树莓派引脚:
所以如果装修房子后监测甲醛还要买甲醛传感器,心塞。调研不够充分啊,早知道买g5了