Arduone kit
Урок №5 Кнопки
В этой схеме, в качестве датчика, мы будем использовать кнопки
До сих пор мы занимались исключительно выходами. Теперь мы собираемся зайти с другой стороны, и поиграем с входами. В этой схеме, в качестве датчика, мы будем использовать кнопки - наиболее простой способ получения входной информации. В данном случае кнопки подключены между "Землей" и Arduino, и если кнопка нажата, вход Arduino замыкается на "0" (LOW). Arduino считывает это и реагирует соответствующим образом. В этой схеме вы также можете заметить "подтягивающие" резисторы, которые помогают "очистить" сигнал и предотвратить ложные срабатывания кнопки.
Схема подключения
Скетч
// КНОПКИ.

// Использование кнопок на цифровых входах.

// Ранее мы использовали аналоговые порты (пины) для ввода данных,
// теперь же мы посмотрим в действии и цифровые порты. Поскольку цифровые
// порты знают только о двух уровнях сигналов - высоких "+5" и низких "0",
// они идеально подходят для взаимодействия с кнопками и переключателями,
// которые тоже имеют только два положения - "Вкл" и "Выкл".
  
// Мы будем подключать один контакт кнопки проводом к заземлению, а другой
// контакт к цифровому порту. Когда Вы надавите на кнопку, произойдет замыкание
// цепи и земленой конец "-" присоединится к цифровому порту, а следовательно,
// полученный сигнал, Arduino будет считать как "низкий".
  
// Но подождите - что происходит, когда кнопка не нажата? В этом состоянии,
// порт отключен от всего, т.е висит в воздухе, и это не понятное состояние
// мы называем "неопределенным", или плавующим. То есть, мы не можем с
// уверенностью сказать, как отреагирует на такое состояние Arduino.
// В зависимости от различных условий окружающей среды это может быть воспринято
// ей и как HIGH ("ВЫСОКИЙ" +5 Вольт), и как LOW ("НИЗКИЙ" - логический ноль). 
  
// Чтобы не возникало никакий разночтений, и микроконтроллер точно знал что
// в данный момент у него на входе, мы дополнительно соединим порт Arduino
// через ограничивающий резистор (подойдет любой с номиналом от 1КОм - 10KОм)
// с шиной +5 Вольт. Эта "подтяжка" будет гарантировать наличие постоянного
// ВЫСОКОГО +5V сигнала, а при нажатии, на кнопку цепь замкнется на Землю - "0",
// а значит для ардуино, сигнал на входе изменится с HIGH, на LOW,
// т.е. с ВЫСОКОГО +5V, на НИЗКИЙ "0".
  
// (Дополнительно: Когда вы привыкнете к резисторами, и будете знать когда они необходимы,
// вы сможете активировать внутренние резисторы подтяжки, находящиеся в самом 
// процессоре ATmega. Для информации смотрите http://arduino.cc/en/Tutorial/DigitalPins).

// Подсоединение оборудования:

// Кнопки:
  
// У кнопок есть два контакта, если кнопка нажата - контакт
// замкнут, если не нажата - разомкнут.

// В кнопках мы будем использовать и два, и четыре контакта, но надо 
// заметить, что в кнопках которые мы будем использовать сейчас, два
//контакта запараллелены.

// Самый простой способ подключить кнопку - подключить провода к клеммам
// - наискосок (по диагонали).

// Подключите любой контакт кнопки 1 к земле (GND).
// Подключите другой контакт кнопки к цифровому порту 2.

// Подключите любой контакт кнопки 2 к земле (GND).
// Подключите другой контакт кнопки к цифровому порту 3.

// На ножки кнопок идущие к цифровым портам 2,3, подключите "подтягивающие"
// резисторы по 10Kом (коричневый/черный/красный), а вторые выводы этих
// резисторов подключите к общему "-" (GND). Эти резисторы гарантируют,
// что на входе будет либо +5V (кнопка не нажата), либо "0", при нажатии,
// и не чего другого. (И не забывайте, что в отличии от аналоговых входов
// у цифровых всего два состояния ВЫСОКОЕ и НИЗКИЙ.)

// Светодиод:
  
// Большинство плат Arduino, в том числе и UNO, уже имеют установленный
// светодиод, с токо-ограничивающим резистором, подключенный к порту 13.
// И Вам не обязательно ставить свой. Но, если вы решите подключить свой,
// для большей информативности, хуже не будет. 

// Подсоедините положительный вывод светодиода к цифровому порту Arduino №13
// Подсоедините отрицательный вывод светодиода к резистору 330 Ом.
// Подсоедините другой вывод резистора к GND "-".

// Сначало мы создадим константы, т.е. дадим имена кнопкам, которые будут
// неизменны до конца кода программы, и привяжем эти имена к портам Arduino.
// Это облегчает понимание и работу с кодом программы, а также позволяет
// обращаться  к порту по имени.

const int button1Pin = 2;  // кнопка №1 - порт 2
const int button2Pin = 3;  // кнопка №2 - порт 3
const int ledPin =  13;    // порт 13, для светодиода

void setup()
{
  // Установим порты кнопок как входящие:
  pinMode(button1Pin, INPUT);
  pinMode(button2Pin, INPUT);

  // Установим порт светодиода как исходящий:
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  int button1State, button2State;  // переменные для сохранения состояния кнопок

  // Поскольку кнопки имеют только два состояния (нажаты и не нажаты) мы будем
  // работать с ними используя цифровые порты ввода. Для того чтобы считывать
  // информацию мы воспользуемся функцией digitalRead(). Эта функция позволяет
  // получить один параметр с цифрового порта и возвратить либо HIGH (+5V),
  // либо LOW ("0").

  // Здесь мы читаем текущее состояние кнопок и помещаем их значение
  // в две переменные:

  button1State = digitalRead(button1Pin);
  button2State = digitalRead(button2Pin);
  
  // Вспомните, если кнопка нажата, то порт будет соединен с массой ("-"). 
  // Если кнопка не нажата, порт, через подтягивающий резистор будет подключен к +5 вольт.  
  
  // Таким образом, состояние порта будет LOW (низким), когда кнопка нажата,
  // и HIGH (высоким), когда она не нажата.    
  
  // Теперь мы будем использовать состояние портов чтобы контролировать светодиод. 

  // Что мы хотим сделать, условие:    
  // "Если какая-либо кнопка нажата, загорается светодиод",
  // "Но, если окажутся нажатыми обе кнопки, светодиод не загорится"
  // Давайте переведем это в программный код.
  
  // У Arduino есть специальные логические операторы,  и операторы сравнения,
  // которые часто используются при проверке условий, в частности:
  

  // "==" (равенство) - Истинно, если обе стороны являются одинаковыми
  // Пример:
  // if (x == y) {
  // тело условия
  //}
  
  // "&&" (логическое И) - Истинно только при выполнении обоих условий
  // Пример:
  // Истинно, если оба выражения Истинно (true)
  // if (x > 0 && x < 5) {
  // тело условия
  //}

  // "!" (логическое НЕ)
  // Истинно если оператор ложен (false)
  // Пример:
  //if (!x) { 
  // тело условия
  //}
  
  // "||" (логическое ИЛИ) - Истинно, если хотя бы одно из условий выполняется
  // Пример:
  //if (x > 0 || y > 0) {
  // тело условия
  // }
    
  // В данном случае Мы будем использовать конструкцию "if" для перевода всего
  //  выше сказанного в логические цепочки программы.
  // (Не забудьте, НИЗКИЙ (LOW), означает что кнопка нажата)
  
  // "Если одна из кнопок нажата, светодиод светится"
  // получится следующее:
  // if ((button1State == LOW) || (button2State == LOW)) // зажечь светодиод
  
  // "Если обе кнопки нажатые, светодиод не загорается"
  // получится следующее:
  // if ((button1State == LOW) && (button2State == LOW)) // не зажигать светодиод

  // Теперь давайте используем вышеуказанные функции и объединим их в одной инструкции:
  
  if (((button1State == LOW) || (button2State == LOW))   // сравниваем, нажата ли одна из кнопок
      && !                                               // и если нет
      ((button1State == LOW) && (button2State == LOW))) // сравниваем, нажаты ли обе кнопки
                                                        // тогда...
  {
    digitalWrite(ledPin, HIGH);  // включаем светодиод
  }
  else                           // в противном случае
  {
    digitalWrite(ledPin, LOW);  // выключаем светодиод
  }
     	
  // Как вы могли заметить, операторы могут быть объединены
  // для решения комплексных задачь

  // Не забудьте: Нельзя использовать оператор "=" при сравнении значений вместо
  // "==", потому что оператор "=" присваивает значение переменным!
}

Что вы должны увидеть:
Вы должны увидеть горящий светодиод, когда нажата кнопка. Если этого не происходит, убедитесь что схема собрана правильно, а также загружен ли код в Arduino, в противном случае обратитесь к разделу устранения неисправностей ниже
Возможные трудности:
Свет не включается
Кнопки квадратные и легко ошибиться при подключении их в плату, попробуйте повернуть их на 90 градусов.
Свет не выключается
Простые ошибки может совершить каждый, посмотрите не подключен ли светодиод к порту 9, вместо 13. Восторг
Не беспокойтесь, все элементы этих схем чрезвычайно просты и надежны, их можно повредить, разве что разбив.
Применение в жизни:
Все вы наверное хорошо представляете где могут использоваться кнопки - пульты, джойстики, телефоны и т. д