Raspberry Pi:Примеры/Обработка прерываний
Содержание | Введение | Продукты | Операционная система | Настройка | Основы 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)