Начнем с алгоритма работы нашей программы!
1. Если кратковременно нажать кнопку КН1, подключенную к порту D4, то светодиод загорится.
2. В противном случае светодиод остается выключенным.
3. Удерживая кнопку нажатой дольше 0,5 секунды, мы вызываем мигание светодиода.
Перейдем к написанию программы и рисованию электрической схемы!
И так схема у нас есть, на ней обозначены микроконтроллер,ножки gnd и питания 3,3В, к порту D4 подключена кнопка КН1, вернемся к программе.
Практически к каждому материалу есть видеоролик на YouTube и RUTUBE каналах, теорию можно прочитать в статье, а как работает устройство в железе, посмотреть в видеоролике!
Светодиод у нас подключен к порту D2, настроим в программе ножки порта D2 на выход, допишем в программе led = Pin(2, Pin.OUT), так как кнопка у нас подключена к порту D4 настроим его ножку на вход button = Pin(4, Pin.IN, Pin.PULL_UP), по алгоритму наш микроконтроллер должен понимать, что когда мы подали минус замкнув кнопку, для этого подтянем ножки порта D4 к +3,3в через внутренний резистор микроконтроллера командой Pin.PULL_UP, можно использовать внешние подтягивающие резисторы, но об этом поговорим в другой раз когда будем бороться с дребезгом контактов.
После настройки портов можно приступить к написанию самой программы. Для начала следует добавить модуль import machine, который содержит все необходимые функции для работы платы. Чтобы избежать постоянного повторения слова «machine» в коде, введём строку:
from machine import Pin;
Далее подключим функции, которые будут использоваться для формирования задержек. Для этого используем строку:
from time import sleep_ms, ticks_ms;
Вот такой получился код:
В начале создадим переменные для функции, которая будет обрабатывать нажатие кнопки. По умолчанию установим их значение равным 0.
led_state = False
blinking = False
start_time = 0
Теперь определим функцию обработчика нажатия кнопки:
def button_klik():
В этой функции мы перечислим переменные, которые будут отслеживать состояние кнопки:
global led_state, blinking, start_time
Затем мы зафиксируем время нажатия кнопки:
start_time = ticks_ms()
Теперь будем ждать, пока кнопка не будет отпущена или не истечет время удержания. Если кнопка нажата (значение равно 0):
while button.value() == 0:
Наконец, добавим небольшую задержку, чтобы кнопка была в состоянии ожидания:
sleep_ms(10).
Вычисляем время удержания кнопки:
holding_time = ticks_ms() - start_time.
Теперь мы сформулируем несколько условий:
* если удерживание кнопки длится менее 0,5 секунды, то есть holding_time < 500, и при этом светодиод не мигает, то есть if not blinking:
* инвертируем состояние светодиода, то есть led_state = not led_state;
* устанавливаем новое состояние светодиода, вызвав метод led.value(led_state);
* в противном случае, если мигание происходит, то есть if blinking:
* инвертируем состояние мигания, то есть blinking = not blinking;
* выключаем светодиод, когда мигание меняется, вызвав метод led.value(False).
Таким образом, мы можем контролировать работу светодиода в зависимости от длительности нажатия и режима мигания.
В нашем бесконечном цикле while True мы введём код, который будет опрашивать порт, к которому подключена кнопка:
Если кнопка нажата, то есть если button.value() == 0, то вызывается функция button_klik(). Затем мы проверяем, мигает ли светодиод, и управляем им. Если светодиод мигает, то мы изменяем его состояние на противоположное, используя led.value(not led.value()), и устанавливаем задержку в 500 миллисекунд с помощью sleep_ms(500). В противном случае, если светодиод не мигает, мы устанавливаем его состояние на исходное, используя led.value(led_state), и задаём задержку в 10 миллисекунд с помощью sleep_ms(10).
Опрашивать порты микроконтроллера довольно просто. В этом примере мы рассмотрели самый базовый способ опроса одной из ножек порта микроконтроллера, а также реализовали функцию включения и выключения светодиода с помощью кнопки. Нажатие кнопки можно делать коротким или длинным — это зависит от вашей задачи.
Исходный код программы Скачать архив
Понравился проект? Не забудь поделиться им с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube и RUTUBE !
- СПАСИБО ЗА ПРОСМОТР.
- С уважением.
- Электроника и Робототехника!