【发布时间】:2016-04-05 22:41:11
【问题描述】:
致力于为定制越野车创建数据采集系统。使用 Raspberry Pi 和自定义转速计(经过测试并确认工作)来测量 RPM。在以下代码中使用中断来获取 RPM 值。
def get_rpm():
GPIO.wait_for_edge(17, GPIO.FALLING)
start = time.time()
GPIO.wait_for_edge(17, GPIO.FALLING)
end = time.time()
duration = end - start
rpm = (1/duration)*60
return rpm
此代码仅在引擎正在运行并产生火花时才有效。如果没有火花,则代码将等待该边缘并且不会继续。在调用get_rpm() 时,如果代码正在等待边缘,这会导致其他进程挂起。
我打算解决此问题的方法是在另一个进程中获取引擎的状态。我认为它最好分为两部分。
第 1 部分,在单独的线程中运行(循环):
GPIO.wait_for_edge(17, GPIO.RISING)
last = time.time
第 2 部分,根据需要作为函数调用:
def get_state():
while time.time - last < .5:
engine_state = true
else:
engine_state = false
return engine_state
在第 1 部分将last 保存到第 2 部分可访问的内存中后,第 2 部分将根据火花塞最后一次点燃的时间确定汽车是否正在运行。使用engine_state 作为比较器,只有当engine_state 为真时,数据采集系统才会从get_rpm() 获取并存储RPM 值。
如何实现第 1 部分,以便可以在第 2 部分中使用 last 变量? last 将会非常非常快地发生变化。我不想在每次更新last 时将其存储到树莓派 SD 卡上的文本文件中。我想将last 存储在 RAM 中。
非常感谢!
【问题讨论】:
-
last已经在 RAM 中,我认为您只需将其作为变量传递给get_state(last).. -
time.time应该是time.time()我认为 -
您是在其他地方设置引脚配置还是根本不设置?你不能用中断回调代替吗?它们天生就有螺纹,不会阻塞。我认为您不必等待边缘。顺便说一句,有趣的项目。 :)
-
@jDo 是的,引脚都配置在其他地方。没有将其包含在问题中,因为它已经确定工作。您能否提供一个中断回调实现的快速示例?我是 Python 新手,非常感谢您的帮助!
-
@IronFist 感谢您重新格式化我的代码 sn-ps。您能否提供一个示例来说明“将其作为变量传递”的含义?我是 Python 新手,不熟悉所有的命名法。非常感谢!
标签: python raspberry-pi data-acquisition