Использование ШИМ для мигания светодиода на ESP32 Huzzah (MicroPython)
Я написал следующую программу, чтобы светодиод на плате ESP32 Huzzah мигал. Я подключил к плате ультразвуковой датчик расстояния, и если объект находится на расстоянии более 30 см (или датчик выдает значения мусора) от датчика, то я хочу, чтобы светодиод мигал с частотой 1 Гц. В противном случае светодиод должен мигать с частотой 2 Гц.
Код вычисляет среднее расстояние, используя 5 последовательных отсчетов, а также вычисляет дисперсию этих отсчетов. Если среднее расстояние меньше 30 см, а отклонение меньше 2 см ^2, частота ШИМ должна составлять 2 Гц, в противном случае - 1 Гц. Дисперсия помогает отфильтровать показания мусора.
Математическая часть работает нормально, я могу распечатать среднее расстояние и дисперсию, но светодиод не мигает. Это происходит, когда я останавливаю REPL (я использую IDE Thonny Python), частота зависит от того, какое условие было истинным непосредственно перед остановкой REPL.
Что мне нужно, чтобы изменить режим мигания светодиода (и изменить частоту в зависимости от расстояния) без остановки REPL?
Любая помощь будет принята с благодарностью.
# Import required modules.
from machine import Pin, PWM
import time
from hcsr04 import HCSR04
# Define hardware output pin.
# Pin 13 is the onboard LED.
# Initialize distance sensor, the trigger pin is 26 and the echo pin is 25.
frequency = 1
led_board = Pin(13, Pin.OUT)
led_pwm = PWM(led_board, freq = frequency, duty = 512)
sensor = HCSR04(trigger_pin = 26, echo_pin = 25)
temp_0 = [0, 0, 0, 0, 0]
# Main never ending loop which makes the onboard LED blink at 1 Hz (ON for 500 milliseconds...
# ... and OFF for 500 milliseconds) if an object is more than 30 cm away from the sensor,...
# ...otherwise the LED blinks at 2 Hz (ON for 250 milliseconds and OFF for 250 milliseconds).
while True:
for i in range(5):
temp_0[i] = sensor.distance_cm()
mean_distance = sum(temp_0)/5
temp_1 = [j - mean_distance for j in temp_0]
temp_2 = [k**2 for k in temp_1]
var_distance = sum(temp_2)/5
if mean_distance < 30 and var_distance < 2:
frequency = 2
else:
frequency = 1
print(mean_distance, ' ', var_distance)
led_pwm.freq(frequency)
1 ответ
Из того, что я вижу, звоню PWM.freq(frequency)
фактически сбрасывает таймер LEDC, поэтому, вызывая его каждый цикл, вы не позволяете контроллеру запускаться и мигать светодиодом. Попробуйте вызвать этот метод, только если частота изменится:
# Check if the frequency has changed, if so, set the new frequency of the LED
if (led_pwm.freq() != frequency):
led_pwm.freq(frequency)