微信实时监测室内环境

前言

利用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文件
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个小时重写对内存造成的影响不大。

发布了31 篇原创文章 · 获赞 22 · 访问量 9483

猜你喜欢

转载自blog.csdn.net/richowe/article/details/105405834