Раньше мы работали с кнопкой в процедурном стиле. Чтобы понять была ли нажата кнопка мы создавали переменную со старым состоянием кнопки сравнивали с новым. Теперь попробуем сделать это все по- другому. Создадим класс кнопки и объекты для конкретных кнопок.
Соберем простую схему для работы с кнопкой. Пусть при нажатии на кнопку светодиод загорается на 1 секунду.
Теперь напишем программный код.
from machine import Pin import time _init() LedPin = 0 led = Pin(LedPin, Pin.OUT) class Button: def __init__(self, p, pressSate): self.pin = Pin(p, Pin.IN) self.pressSate = pressSate self.oldState = not pressSate def onPress(self): state = self.pin.value() if state != self.oldState: self.oldState = state if state == self.pressSate: return True return False btn = Button(16, 1) while True: if btn.onPress(): led.on() time.sleep(1) led.off()
Разберем класс кнопки. У него есть конструктор init
:
def __init__(self, p, pressSate): self.pin = Pin(p, Pin.IN) self.pressSate = pressSate self.oldState = not pressSate
Здесь настраивается вывод микроконтроллера, записывается какое состояние считать нажатым — логический 0 или логическую 1. Ведь это зависит от схемотехники. Если кнопка подтянута к питанию, а при нажатии соединяется с землей, то в нажатом состоянии на выводе будет 0. А если наоборот, то 1.
И у кнопки есть метод определения факта нажатия:
def onPress(self): state = self.pin.value() if state != self.oldState: self.oldState = state if state == self.pressSate: return True return False
Здесь считывается текущее состояние кнопки и сравнивается со старым. Состояние сохраняется как старое. Проверяется соответствие состояния кнопки состоянию нажатой кнопки, которое было задано при создании объекта. Если совпадает — значит кнопка нажата, возвращаем True, иначе False.
Создаем объект кнопки. Она на 16 выводе и нажатым будем считать состояние логической 1.
btn = Button(16, 1)
Использование кнопки стало предельно простым. Нам больше не нужна переменная для хранения прошлого состояния кнопки и вычисление события нажатия. Все это реализовано в классе кнопки. Мы просто создали объект кнопки, передали ей в качестве параметра номер пина и состояние которое считается нажатым. В нашем случае состояние логической единицы когда кнопка нажата. И обращаемся к методу onPress()
, чтобы узнать было ли событие нажатия.
if btn.onPress():
Мы могли бы создать несколько таких кнопок и работать с ними также легко.