Начнем с алгоритма работы нашей программы!

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 !

  • СПАСИБО ЗА ПРОСМОТР.
  • С уважением.
  • Электроника и Робототехника!