Использование ШИМ для мигания светодиода на 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)
Другие вопросы по тегам