Arduino:Примеры/Debounce2: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
 
Нет описания правки
 
(не показано 9 промежуточных версий 1 участника)
Строка 1: Строка 1:
{{Arduino панель перехода}}
{{Arduino панель перехода}}
{{Myagkij-редактор}}
{{Myagkij-редактор}}
{{Черновик}}


= Антидребезг2=
= Антидребезг2=


Данный пример демонстрирует как программно бороться с дребезгом контактов.
Данный пример демонстрирует как программно бороться с [[дребезгом контактов]].


'''Алгоритм:'''
'''Алгоритм:'''
# Вначале мы устанавливаем предыдущее и текущее состояние кнопки как [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]];
# Вначале мы устанавливаем предыдущее и текущее состояние кнопки как [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]];
# Считываем состояние кнопки;
# Считываем состояние кнопки;
# Если текущее и предыдущее состояние кнопки отличаются, ждем '''5 мс''';
# Если текущее и предыдущее состояние кнопки отличаются, ждем 5 мс;
# Считываем состояние кнопки и делаем его текущим;
# Считываем состояние кнопки и делаем его текущим;
# Если предыдущее состояние кнопки было [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]], а текущее состояние [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]], переключаем состояние светодиода;
# Если предыдущее состояние кнопки было [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]], а текущее состояние [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]], переключаем состояние [[светодиод]]а;
# Сохраняем текущее состояние кнопки как предыдущее состояние;
# Сохраняем текущее состояние кнопки как предыдущее состояние;
# Повторяем цикл со '''2 шага''';
# Повторяем цикл со 2 шага;


== Необходимое оборудование ==
== Необходимое оборудование ==


* [[Arduino:Продукты/Продукты Arduino|Плата Arduino]];
* [[Arduino:Продукты/Продукты Arduino|Плата Arduino]] - 1 шт.
* Кнопка или переключатель;
* Кнопка или переключатель - 1шт.
* Резистор на '''220 Ом''';
* [[Резистор]] на [[220 Ом]] - 1шт.
* Резистор на '''10 кОм''';
* [[Резистор]] на [[10 кОм]] - 1шт.
* Макетная плата '''Breadboard''';
* [[Макетная плата]] - 1шт.
* Провода-перемычки;
* Провода-перемычки;


== Цепь ==
== Цепь ==


Соедините '''9''' цифровой контакт [[Arduino]] с одной из ног резистор на '''220 Ом''', вторую ногу резистора соедините с анодом(длинная ножка) светодиода, катод(маленькая ножка) светодиода соедините с землей('''GND'''). Соедините '''2''' цифровой контакт [[Arduino]] с одной из ног стягивающего резистора на '''10 кОм''' и одним из контактов кнопки, вторую ногу резистора соедините с землей('''GND'''). Второй контакт кнопки соедините с контактом '''5V'''.
Соедините 9 цифровой контакт [[Arduino]] с одной из ног [[резистор]] на [[220 Ом]], вторую ногу [[резистор]]а соедините с анодом(длинная ножка) [[светодиод]]а, катод(маленькая ножка) [[светодиод]]а соедините с землей(GND). Соедините 2 цифровой контакт [[Arduino]] с одной из ног [[стягивающего резистора]] на [[10 кОм]] и одним из контактов кнопки, вторую ногу [[резистор]]а соедините с землей(GND). Второй контакт кнопки соедините с контактом 5V.


Теперь, допустим, что на кнопку никто не нажимает – в этом случае связи между ногами кнопки не будет, поэтому '''2-ой цифровой контакт''' будет по-прежнему подсоединен к '''«земле»''', и [[Arduino]] сочтет эту ситуацию как [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]]. Теперь, допустим, на кнопку все же кто-то нажимает – это создает связь между обоими ногами, тем самым соединяя '''2-ой цифровой''' и '''5-вольтовый''' контакты, и [[Arduino]] сочтет эту ситуацию как [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]].
Теперь, допустим, что на кнопку никто не нажимает – в этом случае связи между ногами кнопки не будет, поэтому 2-ой цифровой контакт будет по-прежнему подсоединен к ''«земле»'', и [[Arduino]] сочтет эту ситуацию как [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]]. Теперь, допустим, на кнопку все же кто-то нажимает – это создает связь между обоими ногами, тем самым соединяя 2-ой цифровой и 5-вольтовый контакты, и [[Arduino]] сочтет эту ситуацию как [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]].


Если отсоединить цифровой контакт ото всего, то светодиод примется хаотично мигать. Это значит, что выходное значение будет '''«плавающим»''', т.е. беспорядочно переключающимся из [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]] в [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]] и наоборот. Именно поэтому в цепи и нужны стягивающие/подтягивающие резисторы.
Если отсоединить цифровой контакт ото всего, то [[светодиод]] примется хаотично мигать. Это значит, что выходное значение будет ''«плавающим»'', т.е. беспорядочно переключающимся из [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]] в [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]] и наоборот. Именно поэтому в цепи и нужны стягивающие/[[подтягивающие резисторы]].


[[File:arduino_uno_debounce2.png|center|800px]]
[[File:arduino_uno_debounce2.png|center|thumb|800px|'''Рис. 1.''' [[Плата Arduino]] с подключенной кнопкой и [[светодиод]]ом.|alt=Рис. 1. Плата Arduino с подключенной кнопкой и светодиодом.]]


== Код ==
== Код ==


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
#define LED 9                                        //светодиод подключаем к 9 выводу
#define LED 9                                        //светодиод подключаем к 9 выводу
#define BUTTON 2                                    //кнопку подключаем ко 2 выводу
#define BUTTON 2                                    //кнопку подключаем ко 2 выводу
Строка 95: Строка 93:


<references />
<references />
{{Навигационная таблица/Портал/Arduino}}
[[Категория:Пример]]
[[Категория:Пример]]
[[Категория:Примеры]]
[[Категория:Примеры]]
[[Категория:Пример программирования Arduino]]
[[Категория:Пример программирования Arduino]]
[[Категория:Примеры программирования Arduino]]
[[Категория:Примеры программирования Arduino]]

Текущая версия от 18:18, 14 мая 2023

Проверка/Оформление/Редактирование: Мякишев Е.А.


Антидребезг2

Данный пример демонстрирует как программно бороться с дребезгом контактов.

Алгоритм:

  1. Вначале мы устанавливаем предыдущее и текущее состояние кнопки как LOW;
  2. Считываем состояние кнопки;
  3. Если текущее и предыдущее состояние кнопки отличаются, ждем 5 мс;
  4. Считываем состояние кнопки и делаем его текущим;
  5. Если предыдущее состояние кнопки было LOW, а текущее состояние HIGH, переключаем состояние светодиода;
  6. Сохраняем текущее состояние кнопки как предыдущее состояние;
  7. Повторяем цикл со 2 шага;

Необходимое оборудование

Цепь

Соедините 9 цифровой контакт Arduino с одной из ног резистор на 220 Ом, вторую ногу резистора соедините с анодом(длинная ножка) светодиода, катод(маленькая ножка) светодиода соедините с землей(GND). Соедините 2 цифровой контакт Arduino с одной из ног стягивающего резистора на 10 кОм и одним из контактов кнопки, вторую ногу резистора соедините с землей(GND). Второй контакт кнопки соедините с контактом 5V.

Теперь, допустим, что на кнопку никто не нажимает – в этом случае связи между ногами кнопки не будет, поэтому 2-ой цифровой контакт будет по-прежнему подсоединен к «земле», и Arduino сочтет эту ситуацию как LOW. Теперь, допустим, на кнопку все же кто-то нажимает – это создает связь между обоими ногами, тем самым соединяя 2-ой цифровой и 5-вольтовый контакты, и Arduino сочтет эту ситуацию как HIGH.

Если отсоединить цифровой контакт ото всего, то светодиод примется хаотично мигать. Это значит, что выходное значение будет «плавающим», т.е. беспорядочно переключающимся из LOW в HIGH и наоборот. Именно поэтому в цепи и нужны стягивающие/подтягивающие резисторы.

Рис. 1. Плата Arduino с подключенной кнопкой и светодиодом.
Рис. 1. Плата Arduino с подключенной кнопкой и светодиодом.

Код

#define LED 9                                        //светодиод подключаем к 9 выводу
#define BUTTON 2                                     //кнопку подключаем ко 2 выводу

boolean lastButton = LOW;                            //переменная для сохранения предыдущего состояния кнопки
boolean currentButton = LOW;                         //переменная для сохранения текущего состояния кнопки
boolean ledOn = false;                               //текущее состояние светодиода (вкл./выкл.)

void setup()
{
  pinMode (LED, OUTPUT);                             //конфигурируем контакт подключенный к светодиоду как выход
  pinMode (BUTTON, INPUT);                           //конфигурируем контакт подключенный к кнопке как вход(необязательно)
}

void loop()
{
  currentButton = debounce(lastButton);              //считываем состояние кнопки с применением "антидребезга"
  if (lastButton == LOW && currentButton == HIGH)    //если кнопка была нажата
  {
    ledOn = !ledOn;                                  //инвертируем значение переменной состояния светодиода
  }
  lastButton = currentButton;                        //сохраняем текущее состояние кнопки в предыдущее
  
  digitalWrite(LED, ledOn);                          //изменяем статус светодиода

}

/*
* Функция антидребезга
* принимает предыдущее значение кнопки и возвращает текущее состояние кнопки с подавлением дребезга контактов
*/
boolean debounce(boolean last)
{
  boolean current = digitalRead(BUTTON);             //считываем состояние кнопки
  if (last != current)                               //если есть изменения
  {
    delay(5);                                        //ждем 5мс
    current = digitalRead(BUTTON);                   //считываем состояние кнопки
  }
  return current;                                    //возвращаем, считанное состояние кнопки
}

См.также

  1. pinMode()
  2. digitalWrite()
  3. digitalRead()
  4. if()
  5. millis()
  6. DigitalReadSerial
  7. Blink
  8. Button State Change

Внешние ссылки