Различия

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

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

Следующая версия
Предыдущая версия
products:laboratory_iot:exp5 [2020/05/13 15:07] – создано labuser29products:laboratory_iot:exp5 [2024/11/11 16:40] (текущий) – [Программный код эксперимента] labuser30
Строка 1: Строка 1:
-===== Эксперимент 5. Телеграф =====+===== Эксперимент 5. Эмуляция кнопки с фиксацией ===== 
 + 
 +Попробуем имитировать кнопку с фиксацией. После первого нажатия на кнопку светодиод зажигается, а гаснет после второго нажатия. Для этой цели можно применять кнопку с механической фиксацией положения включено- выключено, но мы реализуем ее программными средствами. Просто при обработке нажатия на кнопку будем учитывать ее предыдущее состояние и запоминать его. 
 +==== Схема эксперимента ==== 
 +Схема эксперимента не изменилась по сравнению с прошлым, изменения будут только в программной части 
 + 
 +{{ :products:esp-iot:exp3.4.png?nolink |}} 
 +//Рисунок 1. Электрическая принципиальная схема эксперимента// 
 + 
 +На рисунке изображен токоограничительный резистор последовательно со светодиодом. При сборке схемы мы не будем устанавливать его сами так как он уже установлен на плате конструктора. 
 + 
 +Соберем эту схему: 
 +{{ :products:esp-iot:exp3.png?direct&600 |}} 
 +//Рисунок 2. Монтажная схема эксперимента// 
 + 
 +==== Программный код эксперимента ==== 
 + 
 +<file python Exp5.py[enable_line_numbers="2", start_line_numbers_at="1"]> 
 +from machine import Pin 
 +_init() 
 +  
 +ButtonPin = 16 
 +LedPin = 0 
 +old_button_value = 0 
 +LedState = 0 
 +  
 +Button = Pin(ButtonPin, Pin.IN) 
 +Led = Pin(LedPin, Pin.OUT) 
 +  
 +while True: 
 +    button_value = Button.value() 
 +    if old_button_value != button_value and button_value == 1: 
 +        if LedState: 
 +            Led.off() 
 +            LedState = 0 
 +        else: 
 +            Led.on() 
 +            LedState = 1 
 +     
 +    old_button_value = button_value 
 +</file> 
 + 
 +Создадим две переменные:  
 +  * ''old_button_value'' будем использовать для хранения результата прошлой проверки состояния кнопки. Это нам потребуется для выявления факта нажатия на кнопку. Если при прошлой проверке кнопка была не нажата, а при текущей проверке нажата — значит только что произошло нажатие. 
 +  * ''LedState'' будем использовать для хранения текущего состояния светодиода — включен он или выключен. Для того, чтобы менять это состояние на противоположное после фиксации факта нажатия на кнопку. 
 + 
 +Считываем состояние кнопки и проверяем факт нажатия: 
 +<code python [enable_line_numbers="2", start_line_numbers_at="13"]> 
 +    button_value = Button.value() 
 +    if old_button_value != button_value and button_value == 1: 
 +</code> 
 + 
 +Выражение ''old_button_value != button_value'' проверяет факт того, что новое состояние кнопки не равно предыдущему. Оператор ''!='' — оператор неравенства. Выражение ''button_value == 1'' проверяет текущее состояние кнопки. Это выражение истинно, когда кнопка нажата. А между этими двумя выражениями мы применили логический оператор ''and''. Он переводится как И, возвращает истину когда оба выражения (слева и справа от него) истины. Если хотя бы одно из них не выполняется, то и все выражение целиком ложно.  
 + 
 +Иными словами проверяем условие того, что состояние кнопки изменилось И, что новым состоянием кнопки является нажатое состояние. Это выражение позволяет выявить факт нажатия на кнопку.  
 + 
 +После регистрации факта нажатии на кнопку нам нужно изменить состояние светодиода на противоположное. Если он был включен — выключаем. Если выключен — включаем. 
 + 
 +Напоследок обновляем старое состояние состояние кнопки.  
 +<code python [enable_line_numbers="2", start_line_numbers_at="22"]> 
 +old_button_value = button_value 
 +</code> 
 + 
 + 
 + 
 + 
 + 
 +==== Дополнительные задания ==== 
 + 
 +<WRAP center round tip 60%> 
 +Модифицируй программу так, чтобы светодиод зажигался или выключался только после двух нажатий. Подсказка: потребуется переменная для хранения количества нажатий. 
 +</WRAP>