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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
 
Нет описания правки
 
(не показана 1 промежуточная версия этого же участника)
Строка 2: Строка 2:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


{{Черновик}}
 


=Включение и выключение светодиода с помощью кнопки=
=Включение и выключение светодиода с помощью кнопки=
Строка 10: Строка 10:
При нажатии кнопки 12-ый вывод GPIO(18-ый по нумерации BCM) подтягивается к земле(GND). При отпущенной же кнопке 12-ый вывод GPIO(18-ый по нумерации BCM) подтягивается к шине 3,3В, благодаря третьему параметру функции RPi.GPIO.setup():
При нажатии кнопки 12-ый вывод GPIO(18-ый по нумерации BCM) подтягивается к земле(GND). При отпущенной же кнопке 12-ый вывод GPIO(18-ый по нумерации BCM) подтягивается к шине 3,3В, благодаря третьему параметру функции RPi.GPIO.setup():


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
</syntaxhighlight>
</syntaxhighlight>
Строка 22: Строка 22:
Выполнение программы начинается с состояния: [[светодиод]] выключен, кнопка была отжата(внутренний резистор подтянут к шине питания):  
Выполнение программы начинается с состояния: [[светодиод]] выключен, кнопка была отжата(внутренний резистор подтянут к шине питания):  


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
led_state      = False
led_state      = False
old_input_state = True                        # подтянута к шине питания
old_input_state = True                        # подтянута к шине питания
Строка 29: Строка 29:
Дальше в бесконечном цикле мы считываем значение(текущее состояние кнопки) с 12 вывода GPIO(18ый по нумерации BCM):
Дальше в бесконечном цикле мы считываем значение(текущее состояние кнопки) с 12 вывода GPIO(18ый по нумерации BCM):


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
new_input_state = GPIO.input(switch_pin)
new_input_state = GPIO.input(switch_pin)
</syntaxhighlight>
</syntaxhighlight>
Строка 35: Строка 35:
Если мы нажали кнопку(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле и мы считываем значение False) и до этого кнопка была отжата(внутренний резистор, подключенный к 12 выводу GPIO(18ый по нумерации BCM) подтянут к шине питания и мы считываем значение True):
Если мы нажали кнопку(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле и мы считываем значение False) и до этого кнопка была отжата(внутренний резистор, подключенный к 12 выводу GPIO(18ый по нумерации BCM) подтянут к шине питания и мы считываем значение True):


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
if new_input_state == False and old_input_state == True:
if new_input_state == False and old_input_state == True:
</syntaxhighlight>
</syntaxhighlight>
Строка 41: Строка 41:
Мы инвертируем состояние светодиода с выключенного на включенный:
Мы инвертируем состояние светодиода с выключенного на включенный:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
led_state = not led_state
led_state = not led_state
</syntaxhighlight>
</syntaxhighlight>
Строка 47: Строка 47:
Сохраняем текущее состояние кнопки как предыдущее:
Сохраняем текущее состояние кнопки как предыдущее:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
old_input_state = new_input_state
old_input_state = new_input_state
</syntaxhighlight>
</syntaxhighlight>
Строка 53: Строка 53:
Подаем высокий уровень сигнала на 16 вывод GPIO(23ый по нумерации BCM), [[светодиод]] горит:
Подаем высокий уровень сигнала на 16 вывод GPIO(23ый по нумерации BCM), [[светодиод]] горит:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
GPIO.output(led_pin, led_state)
GPIO.output(led_pin, led_state)
</syntaxhighlight>
</syntaxhighlight>
Строка 59: Строка 59:
Выполнение программы продолжается с состоянием: [[светодиод]] включен, кнопка была нажата(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле, мы считали значение False):  
Выполнение программы продолжается с состоянием: [[светодиод]] включен, кнопка была нажата(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле, мы считали значение False):  


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
led_state      = True
led_state      = True
old_input_state = False
old_input_state = False
Строка 66: Строка 66:
Считываем значение(текущее состояние кнопки) с 12 вывода GPIO(18ый по нумерации BCM):
Считываем значение(текущее состояние кнопки) с 12 вывода GPIO(18ый по нумерации BCM):


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
new_input_state = GPIO.input(switch_pin)
new_input_state = GPIO.input(switch_pin)
</syntaxhighlight>
</syntaxhighlight>
Строка 72: Строка 72:
Так как мы не нажимали на кнопку(12 вывод GPIO(18ый по нумерации BCM) подтянут к шине питания через внутренний подтягивающий резистор и мы считываем значение True) и прошлый раз кнопка была нажата(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле, мы считали значение False), условие не будет выполнено:
Так как мы не нажимали на кнопку(12 вывод GPIO(18ый по нумерации BCM) подтянут к шине питания через внутренний подтягивающий резистор и мы считываем значение True) и прошлый раз кнопка была нажата(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле, мы считали значение False), условие не будет выполнено:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
if new_input_state == False and old_input_state == True:
if new_input_state == False and old_input_state == True:
</syntaxhighlight>
</syntaxhighlight>
Строка 78: Строка 78:
И данный код выполняться не будет:
И данный код выполняться не будет:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
old_input_state = new_input_state
old_input_state = new_input_state
</syntaxhighlight>
</syntaxhighlight>
Строка 84: Строка 84:
Сохраняем текущее состояние кнопки как предыдущее:
Сохраняем текущее состояние кнопки как предыдущее:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
old_input_state = new_input_state
old_input_state = new_input_state
</syntaxhighlight>
</syntaxhighlight>
Строка 90: Строка 90:
Продолжаем подавать высокий уровень сигнала на 16 вывод GPIO(23ый по нумерации BCM), [[светодиод]] горит:
Продолжаем подавать высокий уровень сигнала на 16 вывод GPIO(23ый по нумерации BCM), [[светодиод]] горит:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
GPIO.output(led_pin, led_state)
GPIO.output(led_pin, led_state)
</syntaxhighlight>
</syntaxhighlight>
Строка 96: Строка 96:
Выполнение программы продолжается с состоянием: [[светодиод]] включен, кнопка была отжата(внутренний резистор подтянут к шине питания):  
Выполнение программы продолжается с состоянием: [[светодиод]] включен, кнопка была отжата(внутренний резистор подтянут к шине питания):  


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
led_state      = True
led_state      = True
old_input_state = True                        # подтянута к шине питания
old_input_state = True                        # подтянута к шине питания
Строка 103: Строка 103:
Считываем значение(текущее состояние кнопки) с 12 вывода GPIO(18ый по нумерации BCM):
Считываем значение(текущее состояние кнопки) с 12 вывода GPIO(18ый по нумерации BCM):


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
new_input_state = GPIO.input(switch_pin)
new_input_state = GPIO.input(switch_pin)
</syntaxhighlight>
</syntaxhighlight>
Строка 109: Строка 109:
Если мы нажали кнопку(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле и мы считываем значение False) и до этого кнопка была отжата(внутренний резистор, подключенный к 12 выводу GPIO(18ый по нумерации BCM) подтянут к шине питания и мы считываем значение True):
Если мы нажали кнопку(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле и мы считываем значение False) и до этого кнопка была отжата(внутренний резистор, подключенный к 12 выводу GPIO(18ый по нумерации BCM) подтянут к шине питания и мы считываем значение True):


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
if new_input_state == False and old_input_state == True:
if new_input_state == False and old_input_state == True:
</syntaxhighlight>
</syntaxhighlight>
Строка 115: Строка 115:
Мы инвертируем состояние светодиода с включенного на выключенный:
Мы инвертируем состояние светодиода с включенного на выключенный:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
led_state = not led_state
led_state = not led_state
</syntaxhighlight>
</syntaxhighlight>
Строка 121: Строка 121:
Сохраняем текущее состояние кнопки как предыдущее:
Сохраняем текущее состояние кнопки как предыдущее:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
old_input_state = new_input_state
old_input_state = new_input_state
</syntaxhighlight>
</syntaxhighlight>
Строка 127: Строка 127:
Подаем низкий уровень сигнала на 16 вывод GPIO(23ый по нумерации BCM), [[светодиод]] не горит:
Подаем низкий уровень сигнала на 16 вывод GPIO(23ый по нумерации BCM), [[светодиод]] не горит:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
GPIO.output(led_pin, led_state)
GPIO.output(led_pin, led_state)
</syntaxhighlight>
</syntaxhighlight>
Строка 133: Строка 133:
Выполнение программы продолжается с состоянием: [[светодиод]] выключен, кнопка была нажата(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле, мы считали значение False)::  
Выполнение программы продолжается с состоянием: [[светодиод]] выключен, кнопка была нажата(12 вывод GPIO(18ый по нумерации BCM) подтянулся к земле, мы считали значение False)::  


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
led_state      = False
led_state      = False
old_input_state = False
old_input_state = False
Строка 166: Строка 166:
==Код==
==Код==


<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="python" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
import RPi.GPIO as GPIO
import RPi.GPIO as GPIO
import time
import time

Текущая версия от 13:15, 18 июня 2023

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



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

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

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

См.также

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