Arduino:Примеры/ButtonStateChange
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Определение изменения состояния кнопки (определение фронта) [1]
Допустим, вы, наконец, заставили кнопку работать и теперь хотите задать некое действие, которое будет использовать количество нажатий на эту кнопку. Чтобы сделать это, вам необходимо знать, когда и сколько раз кнопка меняет состояние с «выкл» на «вкл». Это называется определением изменения состояния или определением фронта.
Необходимое оборудование
- Плата Arduino;
- Кнопка или переключатель;
- Резистор на 10 кОм;
- Макетная плата Breadboard;
- Провода-перемычки;
Цепь
Подсоединяем к Arduino три провода. Первый подключаем к одной из ног кнопки и через стягивающий 10 кОм резистор ведем к контакту с «землей». Второй провод подключаем ко второй ноге (которая имеет контакт с первой) и ведем его к Arduino-контакту с 5-Вольтовым напряжением. Третий подключаем к третьей ноге (которая не имеет контакта с первыми двумя ногами) и ведем его ко 2-му цифровому контакту – он будет считывать состояние кнопки.
Теперь, допустим, что на кнопку никто не нажимает – в этом случае связи между ногами кнопки не будет, поэтому 2-ой цифровой контакт будет по-прежнему подсоединен к «земле», и Arduino сочтет эту ситуацию как LOW. Теперь, допустим, на кнопку все же кто-то нажимает – это создает связь между обоими ногами, тем самым соединяя 2-ой цифровой и 5-вольтовый контакты, и Arduino сочтет эту ситуацию как HIGH. (Да, контакт по-прежнему соединен с «землей», но резистор препятствует ходу тока, как бы «отталкивая» от себя напряжение в 5 Вольт).
Если отключить цифровой контакт ото всего, то светодиод (будучи подключенным к цепи), начнет хаотично мигать. Это из-за того, что входной контакт будет «плавающим», т.е. не подсоединенным ни к 5-Вольтовому напряжению, ни к «земле». То есть входной контакт будет беспорядочно возвращать то значение HIGH, то значение LOW. Именно для этого в цепи и требуется стягивающий резистор.
Схема
Нижеследующий скетч постоянно считывает состояние кнопки, а затем сравнивает это состояние с предыдущим состоянием. Если текущее состояние будет отличаться от предыдущего, а текущее состояние, к тому же, будет равно 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);
}
}
См.также
- setup()
- loop()
- BareMinimum - Допустимый минимум кода для начала работы.
- Blink - Включаем и отключаем светодиод.
- DigitalReadSerial - Считывание последовательной передачи данных через цифровой контакт.
- AnalogReadSerial - Считывание последовательной передачи данных через аналоговый контакт.
- Fade - Затухание-загорание светодиода с помощью Arduino.
- ReadAnalogVoltage - Считывание напряжения, проходящего через аналоговый контакт.