Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/ButtonStateChange

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Определение изменения состояния кнопки (определение фронта) [1]

Допустим, вы, наконец, заставили кнопку работать и теперь хотите задать некое действие, которое будет использовать количество нажатий на эту кнопку. Чтобы сделать это, вам необходимо знать, когда и сколько раз кнопка меняет состояние с «выкл» на «вкл». Это называется определением изменения состояния или определением фронта.

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

  • Плата Arduino;
  • Кнопка или переключатель;
  • Резистор на 10 кОм;
  • Макетная плата Breadboard;
  • Провода-перемычки;

Цепь

ButtonStateChange Circuit.png

Подсоединяем к Arduino три провода. Первый подключаем к одной из ног кнопки и через стягивающий 10 кОм резистор ведем к контакту с «землей». Второй провод подключаем ко второй ноге (которая имеет контакт с первой) и ведем его к Arduino-контакту с 5-Вольтовым напряжением. Третий подключаем к третьей ноге (которая не имеет контакта с первыми двумя ногами) и ведем его ко 2-му цифровому контакту – он будет считывать состояние кнопки.

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

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

Схема

ButtonStateChange Schematic.png

Нижеследующий скетч постоянно считывает состояние кнопки, а затем сравнивает это состояние с предыдущим состоянием. Если текущее состояние будет отличаться от предыдущего, а текущее состояние, к тому же, будет равно HIGH, то состояние кнопки сменится с «выкл» на «вкл». А другая часть кода, тем временем, намотает на счетчик нажатий на кнопку еще один «балл». Более того, программа еще и следит за значением этого счетчика. Если оно будет кратно четырем, то программа включит светодиод, подключенный к 13-ому контакту, а если нет, то выключит.

Код

  1. /*
  2.   Определение изменения состояния кнопки (определение фронта)
  3.    
  4. Как правило, вам не нужно постоянно знать о состоянии входного цифрового контакта,
  5. а нужно знать лишь то, когда входной контакт меняет состояние с одного на другое.
  6. К примеру, вы хотите знать, когда кнопка переходит
  7. из состояния «выкл» в состояние «вкл».
  8. Это и называется определением изменения состояния
  9. или определением фронта.
  10.  
  11. Этот пример показывает, как определить момент перехода состояния кнопки
  12. из состояния «выкл» в состояние «вкл» и наоборот.
  13.    
  14. Цепь:
  15.  * кнопка подсоединена ко 2-му контакту и контакту с 5 вольтами
  16.  * 10000-омовый резистор подсоединен ко 2-му контакту и «земле»
  17.  * светодиод подсоединен к 13-му контакту и «земле»
  18. (или можно использовать светодиод, уже встроенный в Arduino, если таковой имеется)
  19.  
  20.  создан  27 сентября 2005,
  21.  модифицирован 30 августа 2011 Томом Иго (Tom Igoe)
  22.  
  23. Данный пример кода не защищен авторским правом.
  24.    
  25.  http://arduino.cc/en/Tutorial/ButtonStateChange
  26.  
  27.  */
  28.  
  29. // Тут вписываем константы – это постоянные (не меняющиеся) значения:
  30. const int  buttonPin = 2;    // контакт, к которому подсоединена кнопка
  31. const int ledPin = 13;       // контакт, к которому подсоединен светодиод
  32.  
  33. // Тут вписываем переменные – это меняющиеся значения:
  34. int buttonPushCounter = 0;   // счетчик для количества нажатий на кнопку
  35. int buttonState = 0;         // текущее состояние кнопки
  36. int lastButtonState = 0;     // предыдущее состояние кнопки
  37. void setup() {
  38.   // инициализируем контакт для кнопки как входной контакт:
  39.   pinMode(buttonPin, INPUT);
  40.   // инициализируем контакт для светодиода как выходной контакт:
  41.   pinMode(ledPin, OUTPUT);
  42.   // инициализируем последовательную передачу данных:
  43.   Serial.begin(9600);
  44. }
  45.  
  46.  
  47. void loop() {
  48.   // считываем данные с входного «кнопочного» контакта:
  49.   buttonState = digitalRead(buttonPin);
  50.  
  51.   // сравниваем текущее состояние (buttonState) с предыдущим:
  52.   if (buttonState != lastButtonState) {
  53.     // если состояние изменилось, увеличиваем значение счетчика:
  54.     if (buttonState == HIGH) {
  55.       // если текущее состояние равно HIGH,
  56.       // переводим кнопку из состояния «выкл» в состояние «вкл»:
  57.       buttonPushCounter++;
  58.       Serial.println("on");
  59.       Serial.print("number of button pushes:  ");
  60.       Serial.println(buttonPushCounter);
  61.     }
  62.     else {
  63.       // если текущее состояние равно LOW,
  64.       // переводим кнопку из состояния «вкл» в состояние «выкл»:
  65.       Serial.println("off");
  66.     }
  67.   }
  68.   // для прогона через следующий цикл
  69.   // делаем текущее состояние предыдущим
  70.   lastButtonState = buttonState;
  71.  
  72.  
  73.   // включаем светодиод каждый раз,
  74.   // когда значение в счетчике нажатий будет кратно четырем,
  75.   // сверяясь с результатом деления по модулю (т.е. деления с остатком).  
  76.   // деление по модулю – это операция, которая делит друг на друга два числа,
  77.  // а затем дает нам получившийся остаток:
  78.   if (buttonPushCounter % 4 == 0) {
  79.     digitalWrite(ledPin, HIGH);
  80.   } else {
  81.    digitalWrite(ledPin, LOW);
  82. }
  83.  
  84. }

См.также

  1. setup()‎
  2. loop()
  3. BareMinimum - Допустимый минимум кода для начала работы.
  4. Blink - Включаем и отключаем светодиод.
  5. DigitalReadSerial - Считывание последовательной передачи данных через цифровой контакт.
  6. AnalogReadSerial - Считывание последовательной передачи данных через аналоговый контакт.
  7. Fade - Затухание-загорание светодиода с помощью Arduino.
  8. ReadAnalogVoltage - Считывание напряжения, проходящего через аналоговый контакт.

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

  1. Arduino - Button State Change Detection