Raspberry Pi:Примеры/Включение и выключение светодиода с помощью кнопки: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
(не показана 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 | <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 | <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 | <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 | <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 | <syntaxhighlight lang="python"> | ||
led_state = not led_state | led_state = not led_state | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 47: | Строка 47: | ||
Сохраняем текущее состояние кнопки как предыдущее: | Сохраняем текущее состояние кнопки как предыдущее: | ||
<syntaxhighlight lang="python | <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 | <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 | <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 | <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 | <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 | <syntaxhighlight lang="python"> | ||
old_input_state = new_input_state | old_input_state = new_input_state | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 84: | Строка 84: | ||
Сохраняем текущее состояние кнопки как предыдущее: | Сохраняем текущее состояние кнопки как предыдущее: | ||
<syntaxhighlight lang="python | <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 | <syntaxhighlight lang="python"> | ||
GPIO.output(led_pin, led_state) | GPIO.output(led_pin, led_state) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 96: | Строка 96: | ||
Выполнение программы продолжается с состоянием: [[светодиод]] включен, кнопка была отжата(внутренний резистор подтянут к шине питания): | Выполнение программы продолжается с состоянием: [[светодиод]] включен, кнопка была отжата(внутренний резистор подтянут к шине питания): | ||
<syntaxhighlight lang="python | <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 | <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 | <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 | <syntaxhighlight lang="python"> | ||
led_state = not led_state | led_state = not led_state | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 121: | Строка 121: | ||
Сохраняем текущее состояние кнопки как предыдущее: | Сохраняем текущее состояние кнопки как предыдущее: | ||
<syntaxhighlight lang="python | <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 | <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 | <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 | <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
Содержание | Введение | Продукты | Операционная система | Настройка | Основы 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)