Raspberry Pi:Примеры/Обработка прерываний

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

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



Обработка прерываний

Данный пример демонстрирует как отреагировать на некоторое событие без проверки состояния выводов.

Программа ведет прямой временной отсчет, который прерывается специальным сообщением, выводимое на экран при нажатии кнопки.

Обработка прерывания выполняется функцией add_event_detect():

GPIO.add_event_detect(18, GPIO.FALLING, callback=my_callback)

Первый аргумент функции это BCM номер вывода, для которого определяется прерывание, второй аргумент определяет фронт сигнала(спадающий - GPIO.FALLING или возрастающий - GPIO.RISING), третий аргумент это функция обратного вызова, которая будет вызвана при нажатии кнопки.

Функция обработки прерывания не прекращает выполнения цикла, он выполняется отдельным потоком.

Нажатие кнопки всегда сопровождается эффектом дребезга контактов(при нажатии кнопки уровень сигнала изменяется не мгновенно,а импульсно, скачкообразно, создавая эффект многократного быстрого нажатия кнопки). Чтобы программа проигнорировала паразитные всплески сигнала, в функцию GPIO.add_event_detect() добавляется специальный аргумент, bouncetime, представляющий время учета дребезга, выраженного в миллисекундах.

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

Схема

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

См.также

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