×
Traktatov.net » Изучаем Arduino: инструметы и методы технического волшебства » Читать онлайн
Страница 17 из 138 Настройки

• через практически нулевое сопротивление нажатой кнопки к шине 5 В;

• через высокое сопротивление резистора на землю.

В соответствии с законом Ома ток всегда будет идти по пути наименьшего сопротивления. Большая часть тока будет протекать через замкнутую кнопку и на входе установится уровень HIGH.

ПРИМЕЧАНИЕ

В рассмотренном примере используется стягивающий резистор, но возможна установка и подтягивающего резистора, подключенного к шине 5 В, тогда кнопка должна быть соединена с землей. В таком случае на входном контакте будет значение HIGH при отпущенной кнопке и значение LOW, когда кнопка нажата.

- 54 -

Стягивающие и подтягивающие резисторы важны, потому что они гарантируют, что кнопка не создаст короткое замыкание между 5 В и землей при нажатии и что входной контакт не останется в "подвешенном" состоянии.

Теперь напишем программу для рассмотренной схемы. Светодиод должен гореть, пока кнопка нажата, и быть выключенным, когда кнопка отжата (листинг 2.4).

Листинг 2.4. Включение светодиода с помощью кнопки — led_button.ino

const int LED=9; // Контакт 9 для подключения светодиода

const int BUTTON=2; // Контакт 2 для подключения кнопки


void setup()

{

pinMode (LED, OUTPUT); // Сконфигурировать контакт светодиода как выход

pinMode (BUTTON, INPUT); // Сконфигурировать контакт кнопки как вход

}

void loop()

{

if (digitalRead(BUTTON) == LOW)

{

digitalWrite(LED, LOW);

}

else

{

digitalWrite(LED, HIGH);

}

}

коде листинга 2.4 реализованы некоторые новые элементы: функция digitalRead() и оператор if/else. Константа BUTTON типа int добавлена для контакта кнопки. Кроме того, в функции setup() конфигурируем контакт BUTTON как вход.

Это необязательно, т. к. выводы Arduino являются входами по умолчанию. Функция digitalRead() считывает значение сигнала на входе. Если кнопка нажата, digitalRead() возвращает значение HIGH (лог. 1). Если кнопка не нажата, то получаем LOW (лог. 0).

Проверяем содержимое внутри оператора if(). Если условие внутри оператора if() истинно (кнопка не нажата, digitalRead() ==LOW), вызываем функцию digitalWrite (LED, LOW) (гасим светодиод). В противном случае (кнопка нажата) выполняем код после оператора else (включаем светодиод функцией digitalWrite(LED, HIGH)).

Вот и все! Загружаем данный код на плату Arduino и убеждаемся, что все работает, как и ожидалось.

- 55 -

2.8. Устранение "дребезга" кнопок


Удобно ли держать кнопку постоянно нажатой для свечения светодиода? Гораздо лучше иметь возможность нажать кнопку один раз, чтобы включить светодиод, и нажав ее еще раз, выключить. При таком варианте, для горения светодиода кнопку не придется удерживать нажатой. К сожалению, сделать это не так легко, как кажется. Нельзя просто считывать значение сигнала на входе, необходимо учитывать явление, называемое дребезгом контактов.

Обычные кнопки представляют собой механические устройства с пружинным контактом. При нажатии на кнопку сигнал не просто меняется от низкого до высокого, он на протяжении нескольких миллисекунд неоднократно меняет свое значение, прежде чем установится уровень LOW. Отличие ожидаемого процесса от реального иллюстрируют осциллограммы сигнала с кнопки, приведенные на рис. 2.6.