#156Новичок

Переключение светодиода кнопкой на Pico

Кнопка + светодиод — следующий уровень! В отличие от базового проекта с кнопкой, держать кнопку не нужно. Нажми и отпусти → светодиод горит. Нажми и отпусти ещё раз → гаснет (переключение). Схема та же (светодиод GP14, кнопка GP2), но код сильно отличается. Изучи определение фронта (ловлю момента спада 1→0), отслеживание состояния и антидребезг (фильтр механического дребезга). Метод led.toggle() в MicroPython меняет состояние одной строкой.

0.0(0)
9 собрано
Переключение светодиода кнопкой на Pico
Нажми один раз — свет загорится, нажми ещё раз — погаснет, совсем как выключатель в твоей комнате. Каждый раз, когда ты нажимаешь и отпускаешь кнопку, Raspberry Pi Pico переключает светодиод из выключенного во включённое состояние или обратно, так что держать кнопку не нужно. Эта маленькая схема также показывает, как не дать крошечному дребезгу внутри кнопки засчитываться лишними нажатиями.

Видео

Схема

Переключение светодиода кнопкой на Pico - Circuit

Исходный код

MicroPython
1# ─────────────────────────────────────────
2#   BlueGrays · bluegrays.com
3#   Переключение светодиода кнопкой на Pico
4# ─────────────────────────────────────────
5# Каждое нажатие кнопки переключает светодиод (режим переключения): одно
6# нажатие — горит, следующее — не горит. Код ждёт отпускания, а
7# антидребезг 50 мс защищает от ложных срабатываний.
8#
9# Пины:
10#   GP14 -> Красный светодиод (с резистором 220 ohm)
11#   GP2  -> Кнопка (другая ножка к GND)
12
13from machine import Pin
14from time import sleep_ms
15
16led    = Pin(14, Pin.OUT)
17button = Pin(2, Pin.IN, Pin.PULL_UP)   # PULL_UP: нажата = 0
18
19while True:
20    # Ждать нажатия кнопки
21    while button.value() == 1:
22        sleep_ms(10)
23
24    # Нажата: переключить светодиод
25    led.toggle()
26    sleep_ms(50)   # Пропустить дребезг при нажатии
27
28    # Ждать отпускания кнопки
29    while button.value() == 0:
30        sleep_ms(10)
31
32    # Подождать после дребезга (антидребезг)
33    sleep_ms(50)
34

Частые вопросы

Что такое определение фронта?

Вместо проверки, зажата ли кнопка, ищется момент смены её состояния. С подтяжкой мгновение, когда пин падает с 1 до 0, считается одним нажатием, поэтому удержание кнопки не переключает снова и снова.

Какой должна быть длительность антидребезга?

Текущий код после обнаружения отпускания кнопки ждёт sleep_ms(50); время с последнего правильного нажатия он не измеряет. Более надёжный антидребезг требует проверки, что вход остаётся стабильным заданное время.

Почему состояние светодиода не всегда меняется правильно?

Без антидребезга одно нажатие может засчитаться несколько раз, и светодиод переключится дважды, вернувшись туда же. Убедись, что прежнее состояние сохраняется правильно, а пауза достаточно длинная.

led.toggle() и led.value(not led.value()) — одно и то же?

Да, оба переворачивают состояние светодиода. toggle() просто короче и понятнее.