Arduino:Примеры/ButtonStateChange: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">»)
 
Нет описания правки
 
(не показано 8 промежуточных версий 1 участника)
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


== Определение изменения состояния кнопки (определение фронта) <ref>[http://www.arduino.cc/en/Tutorial/ButtonStateChange Arduino - Button State Change Detection]</ref>==
=Определение изменения состояния кнопки (определение фронта) <ref>[http://www.arduino.cc/en/Tutorial/ButtonStateChange Arduino - Button State Change Detection]</ref>=


Допустим, вы, наконец, заставили [[Arduino:Примеры/Button|кнопку]] работать и теперь хотите задать некое действие, которое будет использовать количество нажатий на эту кнопку. Чтобы сделать это, вам необходимо знать, когда и сколько раз кнопка меняет состояние с '''«выкл»''' на '''«вкл»'''.  
Допустим, вы, наконец, заставили [[Arduino:Примеры/Button|кнопку]] работать и теперь хотите задать некое действие, которое будет использовать количество нажатий на эту кнопку. Чтобы сделать это, вам необходимо знать, когда и сколько раз кнопка меняет состояние с ''«выкл»'' на ''«вкл»''.  
Это называется определением изменения состояния или определением фронта.
 
Это называется определением изменения состояния или определением [[фронт]]а.


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


* Плата '''Arduino''';
* [[Плата Arduino]] - 1 шт.
* Кнопка или переключатель;
* [[Кнопка]] или [[переключатель]] - 1 шт.
* Резистор на '''10 кОм''';
* [[Резистор]] на [[10 кОм]] - 1 шт.
* Макетная плата '''Breadboard''';
* [[Макетная плата]] - 1 шт.
* Провода-перемычки;
* Провода-перемычки.


== Цепь ==
== Цепь ==


[[File:ButtonStateChange_Circuit.png]]
[[File:ButtonStateChange_Circuit.png|center|frame|'''Рис. 1.''' [[Плата Arduino]] с подключенной кнопкой.|alt=Рис. 1. Плата Arduino с подключенной кнопкой.]]


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


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


Если отключить цифровой контакт ото всего, то светодиод (будучи подключенным к цепи), начнет хаотично мигать. Это из-за того, что входной контакт будет '''«плавающим»''', т.е. не подсоединенным ни к '''5-В'''ольтовому напряжению, ни к '''«земле»'''. То есть входной контакт будет беспорядочно возвращать то значение [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]], то значение [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]]. Именно для этого в цепи и требуется стягивающий резистор.
Если отключить цифровой контакт ото всего, то светодиод (будучи подключенным к цепи), начнет хаотично мигать. Это из-за того, что входной контакт будет ''«плавающим»'', т.е. не подсоединенным ни к 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]], то состояние кнопки сменится с ''«выкл»'' на ''«вкл»''. А другая часть кода, тем временем, намотает на счетчик нажатий на кнопку еще один ''«балл»''.


Нижеследующий [[Arduino:Основы/Sketch(Скетч)|скетч]] постоянно считывает состояние кнопки, а затем сравнивает это состояние с предыдущим состоянием. Если текущее состояние будет отличаться от предыдущего, а текущее состояние, к тому же, будет равно [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]], то состояние кнопки сменится с '''«выкл»''' на '''«вкл»'''. А другая часть кода, тем временем, намотает на счетчик нажатий на кнопку еще один '''«балл»'''.
Более того, программа еще и следит за значением этого счетчика. Если оно будет кратно четырем, то программа включит [[светодиод]], подключенный к 13-ому контакту, а если нет, то выключит.
Более того, программа еще и следит за значением этого счетчика. Если оно будет кратно четырем, то программа включит светодиод, подключенный к '''13-ому контакту''', а если нет, то выключит.


== Код ==
== Код ==


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<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}}
[[Категория:Пример]]
[[Категория:Пример]]
[[Категория:Примеры]]
[[Категория:Примеры]]
[[Категория:Пример программирования 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

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


Определение изменения состояния кнопки (определение фронта) [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 - Считывание напряжения, проходящего через аналоговый контакт.

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