使用Python线程监控传感器

时间:2016-07-05 16:37:37

标签: python multithreading python-2.7 class arduino

目标:使用线程构建独立的Python传感器类来处理Raspberry Pi和Arduino传感器之间的通信以及一些基本的数据处理。

背景

我有一个带有一些传感器的Arduino MEGA和一个运行python的Raspberry Pi 3。 Pi向Arduino发送请求以读取其传感器值之一。我的Arduino有编码器,电机,灯,泵等,所以我创建了一个通用的python类来处理每种类型的外设。

每个python类将读取原始传感器值,将其存储在日志中,并进行一些计算。

import time
import numpy as np

class Encoder(object):
    def __init__(self, hex_address):
        self.hex_address = hex_address
        self.log = []

    def read(self):
        observation = (time.time(), raw_value())
        log.append(observation)

    def raw_value(self):
        ...Communication code...
        return value

    def speed(self, over=1.0):
        times = [obs[0] for obs in self.log if time.time() - obs[0] < over]
        rates = [obs[1] for obs in self.log if time.time() - obs[0] < over]
        return np.polyfit(times, rates, 1)[0]

然后我有我的程序的主循环

enc = Encoder('\x04')

while True:
    print enc.read()
    print enc.speed()
    times.sleep(1)

问题:

在此设置中,要让Encoder()类真正正常运行,必须定期调用enc.read(),否则数据点不会被添加到日志中

此外,如果我的程序的各个部分调用enc.read(),该怎么办?现在,根据我拨打enc.read()的时间和地点,我会获得更多或更少的数据。

此外,每次拨打enc.speed()时,即使数据未发生变化,我的Pi也必须计算另一个np.polyfit

目标:实现线程以为每个传感器对象启动新线程。

这样他们独立于我的主线程运行。我想start()传感器,然后通过每隔X ms调用read()将新数据添加到日志中。此外,我可以实现一种update()方法,在每次调用时进行读取和所有计算。

我需要帮助:

我已经使用了一些线程类,但是在将线程编织到这个示例代码中时遇到了很多麻烦。

0 个答案:

没有答案