Эксперимент 45. Работа с кнопкой как с объектом

Раньше мы работали с кнопкой в процедурном стиле. Чтобы понять была ли нажата кнопка мы создавали переменную со старым состоянием кнопки сравнивали с новым. Теперь попробуем сделать это все по- другому. Создадим класс кнопки и объекты для конкретных кнопок.

Соберем простую схему для работы с кнопкой. Пусть при нажатии на кнопку светодиод загорается на 1 секунду.

Схема эксперимента

Рисунок 1. Электрическая принципиальная схема эксперимента

Рисунок 2. Монтажная схема эксперимента

Программный код эксперимента

Теперь напишем программный код.

Exp45.py
  1. from machine import Pin
  2. import time
  3. _init()
  4.  
  5. LedPin = 0
  6. led = Pin(LedPin, Pin.OUT)
  7.  
  8. class Button:
  9. def __init__(self, p, pressSate):
  10. self.pin = Pin(p, Pin.IN)
  11. self.pressSate = pressSate
  12. self.oldState = not pressSate
  13.  
  14. def onPress(self):
  15. state = self.pin.value()
  16. if state != self.oldState:
  17. self.oldState = state
  18. if state == self.pressSate:
  19. return True
  20. return False
  21.  
  22.  
  23. btn = Button(16, 1)
  24.  
  25. while True:
  26. if btn.onPress():
  27. led.on()
  28. time.sleep(1)
  29. led.off()

Разберем класс кнопки. У него есть конструктор init:

  1. def __init__(self, p, pressSate):
  2. self.pin = Pin(p, Pin.IN)
  3. self.pressSate = pressSate
  4. self.oldState = not pressSate

Здесь настраивается вывод микроконтроллера, записывается какое состояние считать нажатым — логический 0 или логическую 1. Ведь это зависит от схемотехники. Если кнопка подтянута к питанию, а при нажатии соединяется с землей, то в нажатом состоянии на выводе будет 0. А если наоборот, то 1.

И у кнопки есть метод определения факта нажатия:

  1. def onPress(self):
  2. state = self.pin.value()
  3. if state != self.oldState:
  4. self.oldState = state
  5. if state == self.pressSate:
  6. return True
  7. return False

Здесь считывается текущее состояние кнопки и сравнивается со старым. Состояние сохраняется как старое. Проверяется соответствие состояния кнопки состоянию нажатой кнопки, которое было задано при создании объекта. Если совпадает — значит кнопка нажата, возвращаем True, иначе False.

Создаем объект кнопки. Она на 16 выводе и нажатым будем считать состояние логической 1.

  1. btn = Button(16, 1)

Использование кнопки стало предельно простым. Нам больше не нужна переменная для хранения прошлого состояния кнопки и вычисление события нажатия. Все это реализовано в классе кнопки. Мы просто создали объект кнопки, передали ей в качестве параметра номер пина и состоние которое считается нажатым. В нашем случае состояние логической единицы когда кнопка нажата. И обращаемся к методу onPress(), чтобы узнать было ли событие нажатия.

  1. if btn.onPress():

Мы могли бы создать несколько таких кнопок и работать с ними также легко.

Дополнительное задание

  • Измени схему, чтобы кнопка подтягивалась к питанию, а при нажатии придавливала вывод к земле. Внеси соответствующие изменения в программу, чтобы поведение всего проекта не изменилось
  • Добавь вторую кнопку и обрабатывай ее нажатия тоже