目标:使用线程构建独立的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()
方法,在每次调用时进行读取和所有计算。
我需要帮助:
我已经使用了一些线程类,但是在将线程编织到这个示例代码中时遇到了很多麻烦。