Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| products:laboratory_iot:exp45 [2020/05/24 17:51] – создано labuser29 | products:laboratory_iot:exp45 [2024/12/04 14:02] (текущий) – [Программный код эксперимента] labuser30 | ||
|---|---|---|---|
| Строка 3: | Строка 3: | ||
| Раньше мы работали с кнопкой в процедурном стиле. Чтобы понять была ли нажата кнопка мы создавали переменную со старым состоянием кнопки сравнивали с новым. Теперь попробуем сделать это все по- другому. Создадим класс кнопки и объекты для конкретных кнопок. | Раньше мы работали с кнопкой в процедурном стиле. Чтобы понять была ли нажата кнопка мы создавали переменную со старым состоянием кнопки сравнивали с новым. Теперь попробуем сделать это все по- другому. Создадим класс кнопки и объекты для конкретных кнопок. | ||
| - | Соберем простую схему для работы с кнопкой. | + | Соберем простую схему для работы с кнопкой. Пусть при нажатии на кнопку светодиод загорается на 1 секунду. |
| ==== Схема эксперимента ==== | ==== Схема эксперимента ==== | ||
| Строка 11: | Строка 11: | ||
| {{ : | {{ : | ||
| // | // | ||
| + | |||
| + | ==== Программный код эксперимента ==== | ||
| + | Теперь напишем программный код. | ||
| + | |||
| + | <file python Exp45.py[enable_line_numbers=" | ||
| + | from machine import Pin | ||
| + | import time | ||
| + | _init() | ||
| + | |||
| + | LedPin = 0 | ||
| + | led = Pin(LedPin, Pin.OUT) | ||
| + | |||
| + | class Button: | ||
| + | def __init__(self, | ||
| + | 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() | ||
| + | </ | ||
| + | |||
| + | Разберем класс кнопки. У него есть конструктор '' | ||
| + | <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%> | ||
| + | * Измени схему, чтобы кнопка подтягивалась к питанию, | ||
| + | * Добавь вторую кнопку и обрабатывай ее нажатия тоже | ||
| + | </ | ||