Arduino:Примеры/ButtonStateChange: различия между версиями
Myagkij (обсуждение | вклад) (→Цепь) |
Нет описания правки |
||
(не показаны 4 промежуточные версии 1 участника) | |||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=Определение изменения состояния кнопки (определение фронта) <ref>[http://www.arduino.cc/en/Tutorial/ButtonStateChange Arduino - Button State Change Detection]</ref>= | |||
Допустим, вы, наконец, заставили [[Arduino:Примеры/Button|кнопку]] работать и теперь хотите задать некое действие, которое будет использовать количество нажатий на эту кнопку. Чтобы сделать это, вам необходимо знать, когда и сколько раз кнопка меняет состояние с | Допустим, вы, наконец, заставили [[Arduino:Примеры/Button|кнопку]] работать и теперь хотите задать некое действие, которое будет использовать количество нажатий на эту кнопку. Чтобы сделать это, вам необходимо знать, когда и сколько раз кнопка меняет состояние с ''«выкл»'' на ''«вкл»''. | ||
Это называется определением изменения состояния или определением | |||
Это называется определением изменения состояния или определением [[фронт]]а. | |||
== Необходимое оборудование == | == Необходимое оборудование == | ||
* Плата | * [[Плата Arduino]] - 1 шт. | ||
* Кнопка или переключатель | * [[Кнопка]] или [[переключатель]] - 1 шт. | ||
* Резистор на | * [[Резистор]] на [[10 кОм]] - 1 шт. | ||
* Макетная плата | * [[Макетная плата]] - 1 шт. | ||
* Провода-перемычки | * Провода-перемычки. | ||
== Цепь == | == Цепь == | ||
Строка 20: | Строка 21: | ||
[[File:ButtonStateChange_Circuit.png|center|frame|'''Рис. 1.''' [[Плата Arduino]] с подключенной кнопкой.|alt=Рис. 1. Плата Arduino с подключенной кнопкой.]] | [[File:ButtonStateChange_Circuit.png|center|frame|'''Рис. 1.''' [[Плата Arduino]] с подключенной кнопкой.|alt=Рис. 1. Плата Arduino с подключенной кнопкой.]] | ||
Подсоединяем к | Подсоединяем к [[Arduino]] три провода. Первый подключаем к одной из ног кнопки и через стягивающий [[10 кОм]] [[резистор]] ведем к контакту с ''«землей»''. Второй провод подключаем ко второй ноге (которая имеет контакт с первой) и ведем его к [[Arduino]]-контакту с 5-Вольтовым напряжением. Третий подключаем к третьей ноге (которая не имеет контакта с первыми двумя ногами) и ведем его ко 2-му цифровому контакту – он будет считывать состояние кнопки. | ||
Теперь, допустим, что на кнопку никто не нажимает – в этом случае связи между ногами кнопки не будет, поэтому | Теперь, допустим, что на кнопку никто не нажимает – в этом случае связи между ногами кнопки не будет, поэтому 2-ой цифровой контакт будет по-прежнему подсоединен к ''«земле»'', и [[Arduino]] сочтет эту ситуацию как [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]]. Теперь, допустим, на кнопку все же кто-то нажимает – это создает связь между обоими ногами, тем самым соединяя 2-ой цифровой и 5-вольтовый контакты, и [[Arduino]] сочтет эту ситуацию как [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]]. (Да, контакт по-прежнему соединен с «землей», но резистор препятствует ходу тока, как бы ''«отталкивая»'' от себя напряжение в 5 Вольт). | ||
Если отключить цифровой контакт ото всего, то светодиод (будучи подключенным к цепи), начнет хаотично мигать. Это из-за того, что входной контакт будет | Если отключить цифровой контакт ото всего, то светодиод (будучи подключенным к цепи), начнет хаотично мигать. Это из-за того, что входной контакт будет ''«плавающим»'', т.е. не подсоединенным ни к 5-Вольтовому напряжению, ни к ''«земле»''. То есть входной контакт будет беспорядочно возвращать то значение [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]], то значение [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]]. Именно для этого в цепи и требуется [[стягивающий резистор]]. | ||
== Схема == | == Схема == | ||
[[File:ButtonStateChange_Schematic.png]] | [[File:ButtonStateChange_Schematic.png|center|frame|'''Рис. 2.''' Схема подключения кнопки к [[плате Arduino]]|alt=Рис. 2. Схема подключения кнопки к плате Arduino]] | ||
Нижеследующий [[Arduino:Основы/Sketch(Скетч)|скетч]] постоянно считывает состояние кнопки, а затем сравнивает это состояние с предыдущим состоянием. Если текущее состояние будет отличаться от предыдущего, а текущее состояние, к тому же, будет равно [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]], то состояние кнопки сменится с ''«выкл»'' на ''«вкл»''. А другая часть кода, тем временем, намотает на счетчик нажатий на кнопку еще один ''«балл»''. | |||
Более того, программа еще и следит за значением этого счетчика. Если оно будет кратно четырем, то программа включит [[светодиод]], подключенный к 13-ому контакту, а если нет, то выключит. | |||
Более того, программа еще и следит за значением этого счетчика. Если оно будет кратно четырем, то программа включит светодиод, подключенный к | |||
== Код == | == Код == | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
Определение изменения состояния кнопки (определение фронта) | Определение изменения состояния кнопки (определение фронта) | ||
Строка 122: | Строка 124: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=См.также= | |||
# [[Arduino:Справочник языка Arduino/setup()|setup()]] | # [[Arduino:Справочник языка Arduino/setup()|setup()]] | ||
Строка 133: | Строка 135: | ||
# [[Arduino:Примеры/ReadAnalogVoltage|ReadAnalogVoltage]] - Считывание напряжения, проходящего через аналоговый контакт. | # [[Arduino:Примеры/ReadAnalogVoltage|ReadAnalogVoltage]] - Считывание напряжения, проходящего через аналоговый контакт. | ||
=Внешние ссылки= | |||
<references /> | <references /> | ||
{{Навигационная таблица/ | {{Навигационная таблица/Портал/Arduino}} | ||
[[Категория:Пример]] | [[Категория:Пример]] | ||
Строка 146: | Строка 145: | ||
[[Категория:Пример программирования Arduino]] | [[Категория:Пример программирования Arduino]] | ||
[[Категория:Примеры программирования Arduino]] | [[Категория:Примеры программирования Arduino]] | ||
[[Категория:const int]] | |||
[[Категория:const]] | |||
[[Категория:int]] | |||
[[Категория:void setup()]] | |||
[[Категория:void setup]] | |||
[[Категория:void]] | |||
[[Категория:setup]] | |||
[[Категория:setup()]] | |||
[[Категория:pinMode(pin, INPUT)]] | |||
[[Категория:pinMode()]] | |||
[[Категория:pinMode]] | |||
[[Категория:pinMode(pin, OUTPUT)]] | |||
[[Категория:pinMode()]] | |||
[[Категория:INPUT]] | |||
[[Категория:OUTPUT]] | |||
[[Категория:Serial.begin(9600)]] | |||
[[Категория:Serial.begin()]] | |||
[[Категория:Serial]] | |||
[[Категория:begin()]] | |||
[[Категория:begin(9600)]] | |||
[[Категория:void loop()]] | |||
[[Категория:loop()]] | |||
[[Категория:loop]] | |||
[[Категория:if]] | |||
[[Категория:HIGH]] | |||
[[Категория:Serial.println()]] | |||
[[Категория:Serial.println]] | |||
[[Категория:println]] | |||
[[Категория:Serial.print()]] | |||
[[Категория:print]] | |||
[[Категория:else]] | |||
[[Категория:digitalWrite()]] | |||
[[Категория:digitalWrite]] |
Текущая версия от 18:18, 14 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Определение изменения состояния кнопки (определение фронта) [1]
Допустим, вы, наконец, заставили кнопку работать и теперь хотите задать некое действие, которое будет использовать количество нажатий на эту кнопку. Чтобы сделать это, вам необходимо знать, когда и сколько раз кнопка меняет состояние с «выкл» на «вкл».
Это называется определением изменения состояния или определением фронта.
Необходимое оборудование
- Плата Arduino - 1 шт.
- Кнопка или переключатель - 1 шт.
- Резистор на 10 кОм - 1 шт.
- Макетная плата - 1 шт.
- Провода-перемычки.
Цепь
![Рис. 1. Плата Arduino с подключенной кнопкой.](/ruwiki/images/1/14/ButtonStateChange_Circuit.png)
Подсоединяем к Arduino три провода. Первый подключаем к одной из ног кнопки и через стягивающий 10 кОм резистор ведем к контакту с «землей». Второй провод подключаем ко второй ноге (которая имеет контакт с первой) и ведем его к Arduino-контакту с 5-Вольтовым напряжением. Третий подключаем к третьей ноге (которая не имеет контакта с первыми двумя ногами) и ведем его ко 2-му цифровому контакту – он будет считывать состояние кнопки.
Теперь, допустим, что на кнопку никто не нажимает – в этом случае связи между ногами кнопки не будет, поэтому 2-ой цифровой контакт будет по-прежнему подсоединен к «земле», и Arduino сочтет эту ситуацию как LOW. Теперь, допустим, на кнопку все же кто-то нажимает – это создает связь между обоими ногами, тем самым соединяя 2-ой цифровой и 5-вольтовый контакты, и Arduino сочтет эту ситуацию как HIGH. (Да, контакт по-прежнему соединен с «землей», но резистор препятствует ходу тока, как бы «отталкивая» от себя напряжение в 5 Вольт).
Если отключить цифровой контакт ото всего, то светодиод (будучи подключенным к цепи), начнет хаотично мигать. Это из-за того, что входной контакт будет «плавающим», т.е. не подсоединенным ни к 5-Вольтовому напряжению, ни к «земле». То есть входной контакт будет беспорядочно возвращать то значение HIGH, то значение LOW. Именно для этого в цепи и требуется стягивающий резистор.
Схема
![Рис. 2. Схема подключения кнопки к плате Arduino](/ruwiki/images/e/e1/ButtonStateChange_Schematic.png)
Нижеследующий скетч постоянно считывает состояние кнопки, а затем сравнивает это состояние с предыдущим состоянием. Если текущее состояние будет отличаться от предыдущего, а текущее состояние, к тому же, будет равно 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