Урок 16. Сирена

На этом уроке будем мигать всеми светодиодами, и сопровождать всё звуками сирены. Также как это делается на машинах скорой помощи, или пожарных.

Поставим задачу следующим образом: при нажатии на кнопку должна включаться сирена, которая будет меняться 10 раз. Под сменой считаем изменение цветов светодиодов (красный - синий и наоборот) и частоты звучания зуммера. По окончании сирена и световая индикация отключаются до следующего нажатия кнопки.

Соберите сирену следующим образом:

В этом уроке нам понадобится один из полезных методов списков - reverse(). Данный метод разворачивает список наоборот. То есть последний элемент списка станет первым, предпоследний вторым и так далее. Например, определим список для цветов нашего модуля светодиодов:

colors = [red, blue, red, blue] # список цветов для каждого из 4 светодиодов

В виде таблицы с одной колонкой, можно представить список так:

red
blue
red
blue

Для того чтобы в очередном проходе цикла цвета сменились на противоположные, мы используем метод reverse(). Тогда список станет выглядеть так:

blue
red
blue
red

Таким образом при каждом проходе цикла мы сможем менять цвета на светодиодах модуля.

Итак, основная функция будет выглядеть следующим образом:

# функция включения сирены
def turn_on():
    for i in range(times): # цикл по количеству раз смены цветов
        colors.reverse() # развернуть список с цветами светодиодов
        freqs.reverse() # развернуть список с частотами нот
 
        for led_number in range(4): # цикл для установки цвета каждого светодиода
            leds[led_number] = colors[led_number] 
 
        leds.write() # включить светодиоды
        buz.freq(freqs[0]) # установить частоту зуммера
        buz.duty(512) # установить заполнение зуммера в 512
        sleep(0.7) # задержка на 0,7 секунд
        buz.duty(0) # установить заполнение в 0
        sleep(0.3) # задержка на 0,3 секунды
 
    turn_off() # выключить светодиоды и звук

Начинает функцию цикл, который запустится 10 раз. Каждый раз в цикле мы будем разворачивать элементы списка с цветами светодиодов и частотами звуков. После того, как списки развёрнуты, каждому светодиоду модуля присваиваются цвета, зуммеру устанавливается частота звука. С этой частотой зуммер звучит 0,7 секунды, и затем 0,3 секунды тишины. После этого цикл заканчивается. Пройдя цикл 10 раз, функцию завершает вызов другой функции turn_off() - которая выключит все светодиоды и зуммер.

Данную функцию будем вызывать в основном цикле программы. Целиком код программы будет выглядеть следующим образом:

# импорт модулей
from neopixel import NeoPixel
from machine import Pin, PWM
from time import sleep
 
# выводы к которым подключены платы:
but = Pin(13, Pin.IN)  # кнопка 
addr_leds = Pin(12)  # адресные светодиоды
buz = PWM(Pin(5, Pin.OUT)) # зуммер
 
# переменные для определения цветов
dark = (0, 0, 0)  # не горит ничего
red = (255, 0, 0)  # красный цвет
blue = (0, 0, 255)  # синий цвет
colors = [red, blue, red, blue] # список цветов для каждого из 4 светодиодов
 
# создание списка светодиодов
leds = NeoPixel(addr_leds, 4)
 
# вспомогательные переменные
times = 10 # количество раз смены цветов
freqs = [494, 262] # список с частотами нот для зуммера
 
# функция включения сирены
def turn_on():
    for i in range(times): # цикл по количеству раз смены цветов
        colors.reverse() # развернуть список с цветами светодиодов
        freqs.reverse() # развернуть список с частотами нот
 
        for led_number in range(4): # цикл для установки цвета каждого светодиода
            leds[led_number] = colors[led_number] 
 
        leds.write() # включить светодиоды
        buz.freq(freqs[0]) # установить частоту зуммера
        buz.duty(512) # установить заполнение зуммера в 512
        sleep(0.7) # задержка на 0,7 секунд
        buz.duty(0) # установить заполнение в 0
        sleep(0.3) # задержка на 0,3 секунды
 
    turn_off() # выключить светодиоды и звук
 
 
# функция выключения светодиодов и зуммера
def turn_off():
    for led_number in range(4): # цикл по светодиодам
        leds[led_number] = dark
 
    leds.write() # включить светодиоды   
    buz.duty(0) # установить заполнение в 0
 
# основной цикл программы
while True:
    if but.value():
        turn_on()

Предыдущий урок

Следующий урок