前言
利用python读取传感器的室内环境数据,并在微信做到查询和定时发送室内环境数据,一些方法的使用可以参考我之前的三篇博文,这篇博文将介绍直接介绍微信实时监测室内环境。
开发环境:python3.5,软件:PyCharm2016,Arduino IDE
Arduino读取室内环境
利用CCS811+HDC1080模块,可以获得室内的温湿度、CO2和TVOC数据值。这里我们先要将Arduino烧录好程序,参考前言的第二篇文章有详细介绍Arduino读取CSS811+HDC1080的程序。
Python读取串口数据
完成Arduino的程序的烧录之后,我们利用串口通信,将数据传送到我们PC上,什么是串口通信,可参考这篇博文串口通信的基本知识,这篇博文介绍的很详细。我们需要知道串口通信的传送速率是没有那么快,但对于读取我们需要的环境数据已经绰绰有余。串口传输速率计算可参考串口通信-传输速率与传输距离。
掌握这些基本知识后,我们便可以利用串口通信来读取Arduino的数据。
import serial #导入serial模组
port = "COM4" #Arduino串口地址
rates = 9600 #设置波特率
ser = serial.Serial(port, rates, timeout=1) #设置串口
ser.flushInput() #清空缓存器
try:
while True:
data = ser.readline().decode() #读取串口数据,转换为'utf-8'解码
print(data)
except KeyboardInterrupt:
ser.close() # 关闭串口
print('close!')
pycharm读取并打印结果
数据保存到本地
将数据以txt格式保存到本地。
import serial #导入serial模组
import time
port = "COM4" #Arduino串口地址
rates = 9600 #设置波特率
ser = serial.Serial(port, rates, timeout=1) #设置串口
ser.flushInput() #清空缓存器
f = open('data.txt','w') #每次执行,重新建立data.txt文件,抛弃原来文件的内容
while True:
data = ser.readline()
t = time.time()
ct = time.ctime(t)
f = open('data.txt', 'a')
f.writelines(ct + ':\n') #写入当前时间
f.writelines(data.decode('utf-8')) #写入数据
通过这个方法之后我们会在程序所在文件地址看到data.txt文件
微信查询
这里我们新建一个新的程序,不用多线程,保持之前的程序继续运行下去,让文件一直写下去。利用itchat接入微信,发送查询信息获取当前室内环境数据。
import itchat
import time
from itchat.content import PICTURE, RECORDING, ATTACHMENT, VIDEO, TEXT, MAP
def getdata():
f = open('E:\PyCharm\室内检测\串口通信\data.txt', 'r') #只能用r方式读
datas = f.readlines()
f.close()
last_data = datas[-2] #最新写入的数据在倒数第三行
return last_data
@itchat.msg_register([TEXT])
def text_reply(msg):
text = getdata()
if (msg.text == "室内环境"):
time.sleep(2) #延迟2s
itchat.send(text,toUserName="filehelper")
if __name__ == '__main__':
itchat.login()
itchat.run()
在文件助手发送“室内环境”,便会送到当前环境温度。
定时发送
BackgroundScheduler 后台调度器:适用于非阻塞的情况,调度器会在后台独立运行。
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
# 因为是非阻塞的后台调度器,所以程序会继续向下执行
添加一个定时发送的任务, 保证执行定时任务的时候,查询依然能够进行,因此可以将定时任务挂起。
def job_function():
text1=getdata()
itchat.send(text1, toUserName="filehelper")
scheduler = BackgroundScheduler()
#1分钟发送一次室内环境数据
scheduler.add_job(job_function, 'interval', minutes=10)
防止文件过曝
为了防止写入程序一直运行导致文件过曝,我们添加多一个定时任务,让文件每隔一个时间删掉原有数据,重新写入新的数据。
def job_function2():
#重新写入文件,抛弃原有数据,防止内存写满!
f = open('E:\PyCharm\室内检测\串口通信\data.txt', 'w')
f.close()
scheduler.add_job(job_function2, 'interval', hours=12)
因为数据设置的是每秒写入一次,一次大概写入60bytes左右,一个小时大概写入200kb左右的数据,设置12个小时重写对内存造成的影响不大。