Различия

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

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

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot:exp45 [2020/05/24 17:54] – [Эксперимент 45. Работа с кнопкой как с объектом] 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"]>
 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, 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: while True:
-    button_value = Button.value() +    if btn.onPress(): 
-    if button_value == 1+        led.on() 
-        Led.on() +        time.sleep(1) 
-    else: +        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>
 +