Различия

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

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

Следующая версия
Предыдущая версия
products:laboratory_iot:exp45 [2020/05/24 17:51] – создано labuser29products:laboratory_iot:exp45 [2024/12/04 14:02] (текущий) – [Программный код эксперимента] labuser30
Строка 3: Строка 3:
 Раньше мы работали с кнопкой в процедурном стиле. Чтобы понять была ли нажата кнопка мы создавали переменную со старым состоянием кнопки сравнивали с новым. Теперь попробуем сделать это все по- другому. Создадим класс кнопки и объекты для конкретных кнопок. Раньше мы работали с кнопкой в процедурном стиле. Чтобы понять была ли нажата кнопка мы создавали переменную со старым состоянием кнопки сравнивали с новым. Теперь попробуем сделать это все по- другому. Создадим класс кнопки и объекты для конкретных кнопок.
  
-Соберем простую схему для работы с кнопкой.+Соберем простую схему для работы с кнопкой. Пусть при нажатии на кнопку светодиод загорается на 1 секунду.
  
 ==== Схема эксперимента ==== ==== Схема эксперимента ====
Строка 11: Строка 11:
 {{ :products:esp-iot:exp3.png?direct&600 |}} {{ :products:esp-iot:exp3.png?direct&600 |}}
 //Рисунок 2. Монтажная схема эксперимента// //Рисунок 2. Монтажная схема эксперимента//
 +
 +==== Программный код эксперимента ====
 +Теперь напишем программный код. 
 +
 +<file python Exp45.py[enable_line_numbers="2", start_line_numbers_at="1"]>
 +from machine import Pin
 +import time
 +_init()
 +
 +LedPin = 0
 +led = Pin(LedPin, Pin.OUT)
 +
 +class Button:
 +    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:
 +    if btn.onPress():
 +        led.on()
 +        time.sleep(1)
 +        led.off()  
 +</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>