На python, как мне сравнить текущее значение с предыдущим значением и вывести максимальное

#python #loops #arduino #compare #adc

Вопрос:

Я всегда использовал 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, и, похоже, я не могу сделать это правильно.
Я хотел бы постоянно сравнивать текущее значение с предыдущим значением и выводить максимальное значение через определенный период. Вот что я придумал на 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)
 

Результат:

Отображение кода с результатом

Комментарии:

1. Какой результат вы получаете? Разве вы не должны получать аналоговое считывание, делая analog_in = AnalogIn(доска. A1) на каждой итерации внутри цикла for? Я верю, что вам этого не хватает…

2. В настоящее время вывод, который я получаю, — это значения, которые непрерывно считываются с вывода A1. То, что я хочу на выходе, — это непрерывное обновление максимального значения по показаниям аналогового входа. Например: если аналоговый вход считывает 3 В, он выводит 3 В непрерывно, пока не увидит более высокое напряжение. Затем он будет непрерывно выводить более высокое напряжение. Надеюсь, в этом есть смысл.

Ответ №1:

С помощью analogio.AnalogIn() circuitpython вам нужно обратиться к .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)
 

Однако обратите внимание, что, особенно в случае с электроникой, вам, скорее всего, понадобится более сложный механизм-

  • собирайте достаточно часто, чтобы уловить частоту того, что вы отбираете (см. Теорему Найквиста-Шеннона), в идеале как можно чаще (однако, если у вас есть коллекция цифровой логики, это может быть невыполнимо или использовать более быстрый выбор процессора и т. Д.)
  • тщательно отбрасывайте выбросы (которые могут быть переходными процессами/статическими/контактными отскакиваниями..)
  • обратитесь к скользящей средней (возьмите среднее значение последних N выборок)
  • сбор с точным таймером и прерыванием (таким образом, чтобы частота дискретизации не зависела от несвязанной логики)