Arduino:Примеры/ButtonStateChange

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

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


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

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

Это называется определением изменения состояния или определением фронта.

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

Цепь

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

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

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

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

Схема

Рис. 2. Схема подключения кнопки к плате Arduino
Рис. 2. Схема подключения кнопки к плате Arduino

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

Более того, программа еще и следит за значением этого счетчика. Если оно будет кратно четырем, то программа включит светодиод, подключенный к 13-ому контакту, а если нет, то выключит.

Код

/*
  Определение изменения состояния кнопки (определение фронта)
    
Как правило, вам не нужно постоянно знать о состоянии входного цифрового контакта,
а нужно знать лишь то, когда входной контакт меняет состояние с одного на другое.
К примеру, вы хотите знать, когда кнопка переходит
из состояния «выкл» в состояние «вкл».
Это и называется определением изменения состояния
или определением фронта.
 
Этот пример показывает, как определить момент перехода состояния кнопки 
из состояния «выкл» в состояние «вкл» и наоборот.
    
Цепь:
 * кнопка подсоединена ко 2-му контакту и контакту с 5 вольтами
 * 10000-омовый резистор подсоединен ко 2-му контакту и «земле» 
 * светодиод подсоединен к 13-му контакту и «земле» 
(или можно использовать светодиод, уже встроенный в Arduino, если таковой имеется) 
 
 создан  27 сентября 2005,
 модифицирован 30 августа 2011 Томом Иго (Tom Igoe)

Данный пример кода не защищен авторским правом.
    
 http://arduino.cc/en/Tutorial/ButtonStateChange
 
 */

// Тут вписываем константы – это постоянные (не меняющиеся) значения:
const int  buttonPin = 2;    // контакт, к которому подсоединена кнопка 
const int ledPin = 13;       // контакт, к которому подсоединен светодиод 

// Тут вписываем переменные – это меняющиеся значения:
int buttonPushCounter = 0;   // счетчик для количества нажатий на кнопку
int buttonState = 0;         // текущее состояние кнопки 
int lastButtonState = 0;     // предыдущее состояние кнопки
void setup() {
  // инициализируем контакт для кнопки как входной контакт: 
  pinMode(buttonPin, INPUT);
  // инициализируем контакт для светодиода как выходной контакт:
  pinMode(ledPin, OUTPUT);
  // инициализируем последовательную передачу данных:
  Serial.begin(9600);
}


void loop() {
  // считываем данные с входного «кнопочного» контакта:
  buttonState = digitalRead(buttonPin);

  // сравниваем текущее состояние (buttonState) с предыдущим:
  if (buttonState != lastButtonState) {
    // если состояние изменилось, увеличиваем значение счетчика:
    if (buttonState == HIGH) {
      // если текущее состояние равно HIGH,
      // переводим кнопку из состояния «выкл» в состояние «вкл»:
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    } 
    else {
      // если текущее состояние равно LOW,
      // переводим кнопку из состояния «вкл» в состояние «выкл»:
      Serial.println("off");
    }
  }
  // для прогона через следующий цикл
  // делаем текущее состояние предыдущим
  lastButtonState = buttonState;

  
  // включаем светодиод каждый раз, 
  // когда значение в счетчике нажатий будет кратно четырем, 
  // сверяясь с результатом деления по модулю (т.е. деления с остатком).  
  // деление по модулю – это операция, которая делит друг на друга два числа, 
 // а затем дает нам получившийся остаток:
  if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
  } else {
   digitalWrite(ledPin, LOW);
}
  
}

См.также

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

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