Raspberry Pi:Примеры/Обработка прерываний: различия между версиями
Myagkij (обсуждение | вклад) |
Нет описания правки |
||
Строка 12: | Строка 12: | ||
Обработка прерывания выполняется функцией add_event_detect(): | Обработка прерывания выполняется функцией add_event_detect(): | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python" > | ||
GPIO.add_event_detect(18, GPIO.FALLING, callback=my_callback) | GPIO.add_event_detect(18, GPIO.FALLING, callback=my_callback) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 43: | Строка 43: | ||
===Без устранения эффекта дребезга=== | ===Без устранения эффекта дребезга=== | ||
<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 | ||
Строка 64: | Строка 64: | ||
===С устранением эффекта дребезга=== | ===С устранением эффекта дребезга=== | ||
<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 |
Версия от 18:22, 14 мая 2023
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
Черновик |
Обработка прерываний
Данный пример демонстрирует как отреагировать на некоторое событие без проверки состояния выводов.
Программа ведет прямой временной отсчет, который прерывается специальным сообщением, выводимое на экран при нажатии кнопки.
Обработка прерывания выполняется функцией add_event_detect():
GPIO.add_event_detect(18, GPIO.FALLING, callback=my_callback)
Первый аргумент функции это BCM номер вывода, для которого определяется прерывание, второй аргумент определяет фронт сигнала(спадающий - GPIO.FALLING или возрастающий - GPIO.RISING), третий аргумент это функция обратного вызова, которая будет вызвана при нажатии кнопки.
Функция обработки прерывания не прекращает выполнения цикла, он выполняется отдельным потоком.
Нажатие кнопки всегда сопровождается эффектом дребезга контактов(при нажатии кнопки уровень сигнала изменяется не мгновенно,а импульсно, скачкообразно, создавая эффект многократного быстрого нажатия кнопки). Чтобы программа проигнорировала паразитные всплески сигнала, в функцию GPIO.add_event_detect() добавляется специальный аргумент, bouncetime, представляющий время учета дребезга, выраженного в миллисекундах.
Необходимое оборудование
- плата Raspberry Pi - 1шт.;
- кнопка - 1шт.;
- пара перемычек;
- макетная плата;
Схема
Будьте осторожны при обращении с портами GPIO вашего Raspberry Pi. Помните входы и выходы GPIO расссчитаны на напряжение +3,3В |
Кнопка подключается к 6-му и 12-му выводу GPIO Raspberry Pi.
Все манипуляции по подключению производите только при отключенном питании платы Raspberry Pi |
Код
Без устранения эффекта дребезга
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
def my_callback(channel):
print('You pressed the button')
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(18, GPIO.FALLING, callback=my_callback)
i = 0
while True:
i = i + 1
print(i)
time.sleep(1)
С устранением эффекта дребезга
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
def my_callback(channel):
print('You pressed the button')
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.add_event_detect(18, GPIO.FALLING, callback=my_callback, bouncetime = 100)
i = 0
while True:
i = i + 1
print(i)
time.sleep(1)