Python 重复读取传感器错误的脚本

Python script to repeatedly read a sensor errors

Whosebug 社区您好!

我正在编写一个 python 脚本来重复从 PiHat 传感器检索值。我在堆栈溢出 Run a python function every second 上找到了这个答案,但我 运行 在完成一个循环后出现以下错误: ValueError: sleep length must be non-negative

这是代码

from sense_hat import SenseHat
import time

start_time = time.time()
interval = 1
sense = SenseHat()
# humidity = sense.get_humidity() *move this to loop

for i in range(20):
  humidity = sense.get_humidity()
  sense.clear()
  print(humidity)
  time.sleep(start_time + i*interval - time.time())
  # f()

*编辑了上面的代码以在循环中获取传感器值,以防有人想要 运行 类似的代码。否则,它只会重复显示相同的值我将其他所有内容都保持不变以供参考,因此您可以看到我哪里出错了。还注释掉了 f().

似乎没有人在我发现它的线程上提到这个问题。我有 运行 个数据科学项目 python,但传统程序不多,所以如果格式不正确,我深表歉意。

基本上,您能解释一下为什么会这样吗?也许还有一些可能的解决方案可以让它发挥作用。如果你能解释为什么,那将对我理解 python 很有帮助。我在上面找到的示例代码很旧,可能是一种过时的方法?我 运行 在 raspberry Pi 4 b 上执行此操作,所以它可能执行得不够快?

感谢您的帮助

如评论中所述,在 for-loop 的第一次迭代中,“i”为 0。您应该考虑到计算值可能变为负数(因此 ValueError: sleep length must be non-negative) .

您可以使用 max(0, start_time + i*interval - time.time()) 或将范围更改为 range(1,21) 来防止这种情况发生。

至于Pycharm和Raspberry上的差异,可能与两台机器的时钟精度有关(不同的时间产量time.time()

这似乎是由于范围从 0 开始,并且在任何时间 (0.1s-0.2)<0 的情况下,它都将是负数。所以改变范围,修复可能是这样的

from sense_hat import SenseHat
import time

start_time = time.time()
interval = 1
sense = SenseHat()
humidity = sense.get_humidity()

for i in range(1,21):
  sense.clear()
  print(humidity)
  time.sleep(start_time + i*interval - time.time())
  f()