Raspberry Pi:Примеры/Включение и выключение светодиода с помощью кнопки: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
(нет различий)

Версия от 23:29, 13 декабря 2018

Проверка/Оформление/Редактирование: Мякишев Е.А.


Черновик


Включение и выключение светодиода с помощью кнопки

Данный пример демонстрирует подключение кнопки, при нажатии на которую, подключенный светодиод будет включаться и выключаться.

При нажатии кнопки 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

И так в бесконечном цикле мы можем включать и выключать светодиод.

Выполняя данный пример вы могли заметить, что светодиод не всегда с первого раза включается и также не всегда в первого раза выключается. Это объясняется дребезгом контакта механической кнопки.

Необходимое оборудование

Схема

Будьте осторожны при обращении с портами 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)

См.также

Внешние ссылки