Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
products:laboratory_iot:exp45 [2020/05/24 17:54] – [Эксперимент 45. Работа с кнопкой как с объектом] labuser29 | products:laboratory_iot:exp45 [2024/12/04 14:02] (текущий) – [Программный код эксперимента] labuser30 | ||
---|---|---|---|
Строка 13: | Строка 13: | ||
==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== | ||
- | Теперь напишем программный код. Пусть, когда кнопка не нажата, | + | Теперь напишем программный код. |
<file python Exp45.py[enable_line_numbers=" | <file python Exp45.py[enable_line_numbers=" | ||
from machine import Pin | from machine import Pin | ||
+ | import time | ||
_init() | _init() | ||
- | ButtonPin = 16 | ||
LedPin = 0 | LedPin = 0 | ||
+ | led = Pin(LedPin, Pin.OUT) | ||
- | Button = Pin(ButtonPin, Pin.IN) | + | class Button: |
- | Led = Pin(LedPin, Pin.OUT) | + | def __init__(self, |
+ | self.pin | ||
+ | | ||
+ | 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: | while True: | ||
- | | + | |
- | if button_value == 1: | + | |
- | | + | |
- | else: | + | |
- | | + | |
</ | </ | ||
+ | |||
+ | Разберем класс кнопки. У него есть конструктор '' | ||
+ | <code python[enable_line_numbers=" | ||
+ | def __init__(self, | ||
+ | self.pin = Pin(p, Pin.IN) | ||
+ | self.pressSate = pressSate | ||
+ | self.oldState = not pressSate | ||
+ | </ | ||
+ | Здесь настраивается вывод микроконтроллера, | ||
+ | |||
+ | И у кнопки есть метод определения факта нажатия: | ||
+ | <code python[enable_line_numbers=" | ||
+ | def onPress(self): | ||
+ | state = self.pin.value() | ||
+ | if state != self.oldState: | ||
+ | self.oldState = state | ||
+ | if state == self.pressSate: | ||
+ | return True | ||
+ | return False | ||
+ | </ | ||
+ | Здесь считывается текущее состояние кнопки и сравнивается со старым. Состояние сохраняется как старое. Проверяется соответствие состояния кнопки состоянию нажатой кнопки, | ||
+ | |||
+ | Создаем объект кнопки. Она на 16 выводе и нажатым будем считать состояние логической 1. | ||
+ | <code python[enable_line_numbers=" | ||
+ | btn = Button(16, 1) | ||
+ | </ | ||
+ | |||
+ | Использование кнопки стало предельно простым. Нам больше не нужна переменная для хранения прошлого состояния кнопки и вычисление события нажатия. Все это реализовано в классе кнопки. Мы просто создали объект кнопки, | ||
+ | |||
+ | <code python[enable_line_numbers=" | ||
+ | if btn.onPress(): | ||
+ | </ | ||
+ | |||
+ | Мы могли бы создать несколько таких кнопок и работать с ними также легко. | ||
+ | |||
+ | ==== Дополнительное задание ==== | ||
+ | <WRAP center round tip 60%> | ||
+ | * Измени схему, чтобы кнопка подтягивалась к питанию, | ||
+ | * Добавь вторую кнопку и обрабатывай ее нажатия тоже | ||
+ | </ | ||
+ |