#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 выборок)
- сбор с точным таймером и прерыванием (таким образом, чтобы частота дискретизации не зависела от несвязанной логики)