Arduino:Примеры/ButtonStateChange
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Определение изменения состояния кнопки (определение фронта) [1]
Допустим, вы, наконец, заставили кнопку работать и теперь хотите задать некое действие, которое будет использовать количество нажатий на эту кнопку. Чтобы сделать это, вам необходимо знать, когда и сколько раз кнопка меняет состояние с «выкл» на «вкл».
Это называется определением изменения состояния или определением фронта.
Необходимое оборудование
- Плата Arduino - 1 шт.
- Кнопка или переключатель - 1 шт.
- Резистор на 10 кОм - 1 шт.
- Макетная плата - 1 шт.
- Провода-перемычки.
Цепь
Подсоединяем к 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 - Считывание напряжения, проходящего через аналоговый контакт.
Внешние ссылки
Arduino продукты | |
---|---|
Начальный уровень | Arduino Uno • Arduino Leonardo • Arduino 101 • Arduino Robot • Arduino Esplora • Arduino Micro • Arduino Nano • Arduino Mini • Arduino Starter Kit • Arduino Basic Kit • MKR2UNO • TFT-дисплей Arduino |
Продвинутые функции | Arduino Mega 2560 • Arduino Zero • Arduino Due • Arduino Mega ADK • Arduino Pro • Arduino Motor Shield • Arduino USB Host Shield • Arduino Proto Shield • MKR Proto Shield • MKR Proto Large Shield • Arduino ISP • Arduino USB 2 Serial Micro • Arduino Mini USB Serial Adapter |
Интернет вещей | Arduino Yun • Arduino Ethernet • Arduino MKR1000 • Arduino WiFi 101 Shield • Arduino GSM Shield V2 • Arduino WiFi Shield • Arduino Wireless SD Shield • Arduino Wireless Proto Shield • Arduino Ethernet Shield V2 • Arduino Yun Shield • Arduino MKR1000 Bundle |
Носимые устройства | Arduino Gemma • Lilypad Arduino Simple • Lilypad Arduino Main Board • Lilypad Arduino USB • LilyPad Arduino SimpleSnap |
3D-печать | Arduino Materia 101 |
Устаревшие устройства | - |
Примеры Arduino | |
---|---|
Стандартные функции | |
Основы |
|
Цифровой сигнал |
|
Аналоговый сигнал |
|
Связь |
|
Управляющие структуры |
|
Датчики |
|
Дисплей |
Примеры, объясняющие основы управления дисплеем:
|
Строки |
|
USB (для Leonardo, Micro и Due плат) |
В этой секции имеют место примеры, которые демонстрируют использование библиотек, уникальных для плат Leonardo, Micro и Due.
|
Клавиатура |
|
Мышь |
|
Разное |
- Страницы, использующие повторяющиеся аргументы в вызовах шаблонов
- Справочник языка Arduino
- Arduino
- Перевод от Сubewriter
- Проверка:myagkij
- Оформление:myagkij
- Редактирование:myagkij
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Пример
- Примеры
- Пример программирования Arduino
- Примеры программирования Arduino
- Const int
- Const
- Int
- Void setup()
- Void setup
- Void
- Setup
- Setup()
- PinMode(pin, INPUT)
- PinMode()
- PinMode
- PinMode(pin, OUTPUT)
- INPUT
- OUTPUT
- Serial.begin(9600)
- Serial.begin()
- Serial
- Begin()
- Begin(9600)
- Void loop()
- Loop()
- Loop
- If
- HIGH
- Serial.println()
- Serial.println
- Println
- Serial.print()
- Else
- DigitalWrite()
- DigitalWrite