Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot:exp45 [2020/05/24 18:05] – [Программный код эксперимента] labuser29products:laboratory_iot:exp45 [2024/12/04 14:02] (текущий) – [Программный код эксперимента] labuser30
Строка 13: Строка 13:
  
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
-Теперь напишем программный код. Пусть, когда кнопка не нажата, светодиод не горит. А при нажатии кнопки— горит.+Теперь напишем программный код. 
  
 <file python Exp45.py[enable_line_numbers="2", start_line_numbers_at="1"]> <file python Exp45.py[enable_line_numbers="2", start_line_numbers_at="1"]>
Строка 46: Строка 46:
         led.off()           led.off()  
 </file> </file>
 +
 +Разберем класс кнопки. У него есть конструктор ''__init__'':
 +<code python[enable_line_numbers="2", start_line_numbers_at="9"]>
 +    def __init__(self, p, pressSate):
 +        self.pin = Pin(p, Pin.IN)
 +        self.pressSate = pressSate
 +        self.oldState = not pressSate
 +</code>
 +Здесь настраивается вывод микроконтроллера, записывается какое состояние считать нажатым — логический 0 или логическую 1. Ведь это зависит от схемотехники. Если кнопка подтянута к питанию, а при нажатии соединяется с землей, то в нажатом состоянии на выводе будет 0. А если наоборот, то 1.
 +
 +И у кнопки есть метод определения факта нажатия:
 +<code python[enable_line_numbers="2", start_line_numbers_at="14"]>
 +    def onPress(self):
 +        state = self.pin.value()
 +        if state != self.oldState:
 +            self.oldState = state
 +            if state == self.pressSate:
 +                return True
 +        return False
 +</code>
 +Здесь считывается текущее состояние кнопки и сравнивается со старым. Состояние сохраняется как старое. Проверяется соответствие состояния кнопки состоянию нажатой кнопки, которое было задано при создании объекта. Если совпадает — значит кнопка нажата, возвращаем True, иначе False.
 +
 +Создаем объект кнопки. Она на 16 выводе и нажатым будем считать состояние логической 1.
 +<code python[enable_line_numbers="2", start_line_numbers_at="23"]>
 +btn = Button(16, 1)
 +</code>
 +
 +Использование кнопки стало предельно простым. Нам больше не нужна переменная для хранения прошлого состояния кнопки и вычисление события нажатия. Все это реализовано в классе кнопки. Мы просто создали объект кнопки, передали ей в качестве параметра номер пина и состояние которое считается нажатым. В нашем случае состояние логической единицы когда кнопка нажата. И обращаемся к методу ''onPress()'', чтобы узнать было ли событие нажатия.
 +
 +<code python[enable_line_numbers="2", start_line_numbers_at="26"]>
 +if btn.onPress():
 +</code>
 +
 +Мы могли бы создать несколько таких кнопок и работать с ними также легко. 
 +
 +==== Дополнительное задание ====
 +<WRAP center round tip 60%>
 +  * Измени схему, чтобы кнопка подтягивалась к питанию, а при нажатии придавливала вывод к земле. Внеси соответствующие изменения в программу, чтобы поведение всего проекта не изменилось
 +  * Добавь вторую кнопку и обрабатывай ее нажатия тоже
 +</WRAP>
 +