Урок 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()