Различия

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

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

Следующая версия
Предыдущая версия
products:aruno:exp5_3 [2020/06/27 09:11] – создано alexnikproducts:aruno:exp5_3 [2020/08/28 11:39] (текущий) alexnik
Строка 1: Строка 1:
 ===== Эксперимент 5_3. Эмуляция кнопки с фиксацией ===== ===== Эксперимент 5_3. Эмуляция кнопки с фиксацией =====
  
 +Аппаратный способ устранения эффекта дребезга заключается в следующем: \\ 
 +параллельно кнопке включают конденсатор, сглаживающий скачки напряжения и делающий процесс переключения более плавным. Обычно номинал конденсатора делают не слишком большим, порядка 0.1 мкФ (микрофарад), иначе он будет заряжаться слишком долго и время 
 +переключения кнопки станет заметно больше.\\ 
 +Сглаживающий конденсатор заряжается до уровня HIGH почти мгновенно, а во время дребезга контактов разряжается, повышая уровень напряжения в цепи. Таким образом скачки напряжения значительно уменьшаются.\\ 
 +Теперь кнопка будет работать правильно, но схема все еще нуждается в доработке. Предположим, что во время написания программы, мы ошиблись и случайно определили вывод контроллера не как INPUT, а как OUTPUT. В этом случае через ножку контроллера потечет ток короткого замыкания, превышающий предельно допустимый и контроллер выйдет из строя.\\ 
 +Чтобы защитить контроллер, последовательно с кнопкой добавим токоограничительный резистор 1 кОм.
  
 ==== Схема эксперимента ==== ==== Схема эксперимента ====
-Схема эксперимента не изменилась по сравнению с прошлым, изменения будут только в программной части +{{ :products:ardu:exp5_2_sch.png?nolink&400 |}}
- +
-{{ :products:ardu:exp3.4.png?nolink |}}+
 //Рисунок 1. Электрическая принципиальная схема эксперимента// //Рисунок 1. Электрическая принципиальная схема эксперимента//
  
-{{ :products:ardu:exp03.png?direct&600 |}}+Соберем эту схему: 
 +{{ :products:ardu:exp5_2.png?direct&600 |}}
 //Рисунок 2. Монтажная схема эксперимента// //Рисунок 2. Монтажная схема эксперимента//
  
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
  
-<file cpp Exp5[enable_line_numbers="2", start_line_numbers_at="1"]>+<file cpp Exp5_2[enable_line_numbers="2", start_line_numbers_at="1"]>
 // инициализация констант // инициализация констант
  
Строка 26: Строка 30:
  
 void setup() {  void setup() { 
- pinMode(BUTTON, INPUT); +  pinMode(BUTTON, INPUT); 
- pinMode(LED, OUTPUT);  +  pinMode(LED, OUTPUT);  
-}+ }
  
 void loop() { void loop() {
Строка 38: Строка 42:
       }       }
     }     }
-    if(lightsOn) {+   if(lightsOn) {
       digitalWrite(LED, HIGH); // зажигаем светодиод       digitalWrite(LED, HIGH); // зажигаем светодиод
     }      } 
Строка 47: Строка 51:
 </file> </file>
  
-в начале программы определим две **константы** ''LED'' и ''BUTTON'' для хранения номеров пинов к которым подключены кнопка и светодиод.\\ +В соответствие инструкции, дополним схему конденсатором **С1** и резистором **R3**.\\ 
-далее для реализации задуманного нам понадобятся переменные: +Программный код остается без изменений. \\ 
-  * ''switchState'' - переменная для хранения текущего уровня считанного сигнала с пина. +Запустим программу на выполнение, и на этот раз все работает как и задумано.\\
-  * ''oldSwitchState'' - будем использовать для хранения результата прошлой проверки состояния кнопки. Это нам потребуется для выявления факта нажатия на кнопку. Если при прошлой проверке кнопка была не нажатаа при текущей проверке нажата — значит только что произошло нажатие. +
-  * ''lightsOn'' будем использовать для хранения текущего состояния светодиода — включен он или выключен. Для того, чтобы менять это состояние на противоположное после фиксации факта нажатия на кнопку+
- +
-выражение ''switchState = digitalRead(BUTTON);'' записывает в переменную **switchState** текущий уровень сигнала на пине кнопки, далее идет проверка события "была ли нажата кнопка"+
-в строке 18 оператором **if** сравниваются переменные **switchState** и **oldSwitchState** в которые записан текущий сигнал и сигнал считанный и записанный ранее. +
-Оператор ''!='' — оператор неравенства. +
-Если значение переменной **switchState** не равно значению переменной **oldSwitchState** (была нажата кнопка), то мы перезаписываем старое значение на новое и переходим к проверке того, какой именно поступает текущий сигнал. Если сигнал соответствует **HIGH**, то значение переменной **lightsOn** необходимо изменить на противоположное, поскольку была нажата кнопка.\\ +
-Обратите внимание, что эта проверка происходит только если выполняется условие предыдущей проверки.\\ +
-третий оператор **if** проверяет значение переменной ''lightsOn''если значение равно **true** то выполняется выражение ''digitalWrite(LED, HIGH);'', светодиод загорается, и будет гореть до тех пор пока не будет нажата кнопка, после этого значение переменной измениться на **false**, и выполнится выражение ''digitalWrite(LED, LOW);'', и светодиод погаснет.\\+
  
-Теперь загрузим скетч в контроллер, но по какой то причине кнопка не всегда срабатывает так как мы задумывали.\\ 
-Данную проблему и ее решение рассмотрим в следующем эксперименте.