Raspberry Pi:Примеры/Включение и выключение светодиода с помощью кнопки
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
Включение и выключение светодиода с помощью кнопки
Данный пример демонстрирует подключение кнопки, при нажатии на которую, подключенный светодиод будет включаться и выключаться.
При нажатии кнопки 12-ый вывод GPIO(18-ый по нумерации BCM) подтягивается к земле(GND). При отпущенной же кнопке 12-ый вывод GPIO(18-ый по нумерации BCM) подтягивается к шине 3,3В, благодаря третьему параметру функции RPi.GPIO.setup():
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
Каждый вывод GPIO Raspberry Pi имеет подтягивающие к шине питания и земле резисторы, которыми можно управлять программно. При установке вывода как входа, к нему можно подключить оба, один или ни одного подтягивающего резистора. Если при этом опустить третий параметр функции RPi.GPIO.setup(), внутренние подтягивающие резисторы не будут использованы, что приведет к "плавающему" потенциалу на входе(на входе будет периодически появляться сигнал высокого или низкого уровня).
Если третьему параметру функции присвоить значение RPi.GPIO.PUD_UP, то внутренний подтягивающий резистор будет соединен с шиной питания, а при значении RPi.GPIO.PUD_DOWN с шиной заземления.
В программе текущее состояние светодиода хранится в переменной led_state(значение True - светодиод включен, False -выключен). Переменная old_input_state хранит предыдущее состояние кнопки, а new_input_state текущее состояние кнопки.
Выполнение программы начинается с состояния: светодиод выключен, кнопка была отжата(внутренний резистор подтянут к шине питания):
led_state = False
old_input_state = True # подтянута к шине питания
Дальше в бесконечном цикле мы считываем значение(текущее состояние кнопки) с 12 вывода GPIO(18ый по нумерации BCM):
new_input_state = GPIO.input(switch_pin)
Если мы нажали кнопку(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле и мы считываем значение False) и до этого кнопка была отжата(внутренний резистор, подключенный к 12 выводу GPIO(18ый по нумерации BCM) подтянут к шине питания и мы считываем значение True):
if new_input_state == False and old_input_state == True:
Мы инвертируем состояние светодиода с выключенного на включенный:
led_state = not led_state
Сохраняем текущее состояние кнопки как предыдущее:
old_input_state = new_input_state
Подаем высокий уровень сигнала на 16 вывод GPIO(23ый по нумерации BCM), светодиод горит:
GPIO.output(led_pin, led_state)
Выполнение программы продолжается с состоянием: светодиод включен, кнопка была нажата(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле, мы считали значение False):
led_state = True
old_input_state = False
Считываем значение(текущее состояние кнопки) с 12 вывода GPIO(18ый по нумерации BCM):
new_input_state = GPIO.input(switch_pin)
Так как мы не нажимали на кнопку(12 вывод GPIO(18ый по нумерации BCM) подтянут к шине питания через внутренний подтягивающий резистор и мы считываем значение True) и прошлый раз кнопка была нажата(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле, мы считали значение False), условие не будет выполнено:
if new_input_state == False and old_input_state == True:
И данный код выполняться не будет:
old_input_state = new_input_state
Сохраняем текущее состояние кнопки как предыдущее:
old_input_state = new_input_state
Продолжаем подавать высокий уровень сигнала на 16 вывод GPIO(23ый по нумерации BCM), светодиод горит:
GPIO.output(led_pin, led_state)
Выполнение программы продолжается с состоянием: светодиод включен, кнопка была отжата(внутренний резистор подтянут к шине питания):
led_state = True
old_input_state = True # подтянута к шине питания
Считываем значение(текущее состояние кнопки) с 12 вывода GPIO(18ый по нумерации BCM):
new_input_state = GPIO.input(switch_pin)
Если мы нажали кнопку(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле и мы считываем значение False) и до этого кнопка была отжата(внутренний резистор, подключенный к 12 выводу GPIO(18ый по нумерации BCM) подтянут к шине питания и мы считываем значение True):
if new_input_state == False and old_input_state == True:
Мы инвертируем состояние светодиода с включенного на выключенный:
led_state = not led_state
Сохраняем текущее состояние кнопки как предыдущее:
old_input_state = new_input_state
Подаем низкий уровень сигнала на 16 вывод GPIO(23ый по нумерации BCM), светодиод не горит:
GPIO.output(led_pin, led_state)
Выполнение программы продолжается с состоянием: светодиод выключен, кнопка была нажата(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле, мы считали значение False)::
led_state = False
old_input_state = False
И так в бесконечном цикле мы можем включать и выключать светодиод.
Выполняя данный пример вы могли заметить, что светодиод не всегда с первого раза включается и также не всегда в первого раза выключается. Это объясняется дребезгом контакта механической кнопки.
Необходимое оборудование
- плата Raspberry Pi - 1шт.;
- макетная плата - 1шт.;
- резистора на 470 Ом - 1шт.;
- светодиод - 1шт.;
- кнопка - 1шт.;
- пара перемычек;
Схема
![]() |
Будьте осторожны при обращении с портами GPIO вашего Raspberry Pi. Помните входы и выходы GPIO расссчитаны на напряжение +3,3В |

Несмотря на то,что у кнопки 4 вывода, как 2 левых так и 2 правых вывода соединены между собой.

![]() |
Все манипуляции по подключению производите только при отключенном питании платы Raspberry Pi |
Код
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
switch_pin = 18
led_pin = 23
GPIO.setup(switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(led_pin, GPIO.OUT)
led_state = False
old_input_state = True # подтянута к шине питания
while True:
new_input_state = GPIO.input(switch_pin)
if new_input_state == False and old_input_state == True:
led_state = not led_state
old_input_state = new_input_state
GPIO.output(led_pin, led_state)