Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/InputPullupSerial

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Отслеживание состояния кнопки с помощью встроенного подтягивающего резистора [1]

Данный пример демонстрирует использование режима INPUT_PULLUP у функции pinMode(). Он отслеживает состояние кнопки (или переключателя) при последовательной передаче данных от компьютера к Arduino, соединенных через USB. Кроме того, если данные на входном контакте считываются как HIGH, включается «родной» для Arduino светодиод, подключенный к 13-му контакту, а если как LOW, то выключается.

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

  • Плата Arduino;
  • Кнопка, переключатель или тумблер;
  • Макетная плата Breadboard;
  • Провода-перемычки;

Цепь

InputPullupButton.png

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

Схема

InputPullupSerial sch.png

Код

Самая первая вещь которую нужно сделать – это задать в setup-секции программы последовательную передачу данных между компьютером и Arduino со скоростью 9600 бит в секунду. Делается это при помощи следующей строчки кода:

Serial.begin(9600);

Далее инициализируем 2-ой контакт как входной контакт, попутно активируя встроенный подтягивающий резистор:

pinMode(2,INPUT_PULLUP);

Нижеследующая строка делает 13-ый контакт (со встроенным светодиодом) выходным контактом:

pinMode(13, OUTPUT);

Теперь, когда с setup’ом покончено, переходим в секцию главного цикла. Если на кнопку не нажимают, встроенный подтягивающий резистор соединяется с 5-втольтовым напряжением. Следовательно, Arduino считывает это как «1» или HIGH. Но если на кнопку нажать, 2-ой контакт начинает тянуться к «земле», поэтому Arduino считывает эту ситуацию как «0» или LOW. Поэтому, перво-наперво нужно задать переменную, которая будет хранить информацию, идущую от кнопки. Поскольку эта информация будет либо «1», либо «0», можно воспользоваться типом данных int. Назовем эту переменную sensorValue, и она будет равна любому значению, исходящему от 2-го цифрового контакта. Это можно сделать следующей строчкой кода:

int sensorValue = digitalRead(2);

Теперь сделаем так, чтобы Arduino не только считывала входные данные, но и в десятичном значении (DEC) выводила их на компьютер. Это можно сделать при помощи функции Serial.println() и следующей строчки кода:

Serial.println(sensorValue, DEC);

Теперь, открыв меню Serial Monitor в среде разработки Arduino, вы увидите цифровой поток из «0» (при нажатой кнопке) и «1» (если кнопка нажата не будет). Что касается светодиода на 13-ом контакте, то при значении HIGH он будет загораться, а при LOW – потухать.

  1. /*
  2.  Отслеживание состояния кнопки с помощью встроенного подтягивающего резистора
  3.  
  4.  Этот пример показывает, как пользоваться режимом pinMode(INPUT_PULLUP).
  5.  Он считывает входные данные на 2-ом цифровом контакте,
  6. а затем выводит результат в меню Serial Monitor.
  7.  
  8.  Цепь:
  9.  * Кнопка подсоединена ко 2-му контакту и контакту с «землей»
  10.  * На 13-ом контакте имеется встроенный светодиод
  11.  
  12.  В отличие от режима pinMode(INPUT), в данном случае нет необходимости в стягивающем резисторе.
  13.  Встроенный 20000-омовый резистор уже тянется к 5-вольтовому напряжению.
  14.  Следовательно, благодаря такой конфигурации при нажатой кнопке
  15. входные данные будут считываться как LOW, а при ненажатой – как HIGH.
  16.  
  17.  Создан 14 марта 2012 Скоттом Фитцджеральдом (Scott Fitzgerald).
  18.  
  19.  http://www.arduino.cc/en/Tutorial/InputPullupSerial
  20.  
  21.  Данный пример кода не защищен авторским правом.
  22.  
  23.  */
  24.  
  25. void setup() {
  26.   // запускаем последовательную передачу данных
  27.   Serial.begin(9600);
  28.   // задаем 2-ой контакт как входной,
  29.   // а также включаем встроенный подтягивающий резистор
  30.   pinMode(2, INPUT_PULLUP);
  31.   pinMode(13, OUTPUT);
  32.  
  33. }
  34.  
  35. void loop() {
  36.   // сохраняем информацию, полученную от кнопки, в переменную:
  37.   int sensorVal = digitalRead(2);
  38.   // выводим эту информацию на Serial Monitor:
  39.   Serial.println(sensorVal);
  40.  
  41.   // Держите в уме, что использование подтягивающего резистора
  42.   // переворачивает логику программы с ног на голову.
  43.   // Когда кнопка не нажата, Arduino считывает это как HIGH,
  44.   // а если нажата, то как LOW.
  45.   // Если кнопка нажата, то светодиод будет гореть,
  46.   // а если нет – то не будет:
  47.   if (sensorVal == HIGH) {
  48.     digitalWrite(13, LOW);
  49.   }
  50.   else {
  51.     digitalWrite(13, HIGH);
  52.   }
  53. }

См.также

  1. setup()‎
  2. loop()
  3. pinMode()
  4. digitalRead()
  5. delay()
  6. int
  7. Serial
  8. DigitalPins
  9. BlinkWithoutDelay
  10. Button
  11. Debounce
  12. ButtonStateChange
  13. InputPullupSerial
  14. Tone
  15. Pitch follower
  16. Simple keyboard
  17. Tone4

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

  1. Arduino - Input Pullup Serial