首页 > 解决方案 > 在 python 上,如何将 CurrentValue 与 previousValue 进行比较并输出最大值

问题描述

我一直使用 Arduino IDE,但现在我使用的是 MuEditor。我使用了 Arduino IDE,它更容易将当前值与之前的值进行比较,并在一段时间后输出最大值。来自 Arduino 的代码如下所示。

int sample1 = 0; 
void loop() {
  int sensorValue = 0;
  sensorValue = analogRead(A0);
  for (int i = 0; i <= 100; i++) {
    if (sensorValue > sample1) {
      sample1 = sensorValue;
    }
  }
  Serial.println(sample1 * (5.0 / 1023.0));
}

我想在 Mu Editor 上使用相同的概念,但我似乎无法正确完成它。我想不断地将当前值与以前的值进行比较,并在一段时间后输出最大值。这就是我在 MuEditor 上提出的。我会很感激你在这方面的帮助。

import time
import board
from analogio import AnalogIn

analog_in = AnalogIn(board.A1)
Sample = 0


def get_voltage(pin):
    return (pin.value * 3.3) / 65536


while True:
    for x in range(1000):
        if Sample < analog_in:
            Sample = analog_in
    print((get_voltage(Sample1),))
    time.sleep(0.1)

结果:

带结果的代码显示

标签: pythonloopsarduinocompareadc

解决方案


使用circuitpythonanalogio.AnalogIn()需要引用实例的.value属性AnalogIn

import analogio
with analogio.AnalogIn(board.A1) as pin_sensor:
    pin_sensor.value  # voltage
# pin_sensor is closed when leaving the above scope

max()如果您要丢弃其他值,只需在每个循环中获取

...
result = 0
with analogio.AnalogIn(board.A1) as pin_sensor:
    for x in range(..):
        result = max(result, pin_sensor.value)
print(result)

但是,请注意,特别是对于电子产品,您更可能需要更复杂的机制 -

  • 尽可能频繁地收集以捕获您正在采样的频率(请参阅Nyquist-Shannon 定理),理想情况下尽可能多地收集(但是,如果您有数字逻辑的集合,这可能是不可行的,或者驱动更快的处理器选择, ETC。)
  • 小心丢弃异常值(可能是瞬态/静态/接触反弹..)
  • 参考移动平均值(取最后 N 个样本的平均值)
  • 使用精确的计时器和中断收集(这样您的采样率不依赖于不相关的逻辑)

推荐阅读