Штырьки на каждой стороне кнопки имеют электрические контакты внутри корпуса. Сама кнопка имеет прикрепленный к ней электропроводящий кусок металла. Когда нажата, цепь между штырьками с каждой стороны замыкается и между ними пропускается ток:
Пример проекта
Как управлять устройствами с помощью кнопки, давайте построим схему, которая включает светодиод при нажатии на кнопку. Использовать эту схему для управления любым устройством, питающимся сигналом 5 вольт.
Вот детали, необходимые для создания проекта:
- Arduino Uno
- Провода-перемычки
- Паспортная доска
- Триггер Шмитта SN74HC14N
- Тактильная кнопка
- Резистор 10K Ом
- Конденсатор 1 мкФ
Значение токоограничивающего резистора может быть любым от 200 Ом до 1К Ом.
Одна сторона кнопки подключена к напряжению 5 вольт, а другая — к контакту 7. Когда кнопка нажата, ток будет протекать к контакту 7, в результате чего он станет высоким. Использовать функцию digitalRead(), чтобы определить, когда это произойдет. Затем с помощью функции digitalWrite() установим высокий уровень на выводе 11, что заставит светодиод загореться.
Как запрограммировать кнопку на Arduino
Подключив схему, загрузите этот код в Arduino:
int buttonPin = 7;
int ledPin = 11;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
int buttonState = digitalRead(buttonPin);
digitalWrite(ledPin, buttonState);
}
В верхней части скетча объявляется две переменные pin. Переменная buttonPin будет содержать номер вывода Arduino, подключенного к кнопке (вывод 7). Переменная ledPin будет содержать номер вывода Arduino, подключенного к светодиоду.
В разделе setup() используется функция pinMode() для установки buttonPin в качестве входа. Затем установится вывод ledPin в качестве выхода.
В секции loop() объявляется переменная int под названием buttonState и устанавливаем ее равной digitalRead(buttonPin). Когда кнопка не нажата, напряжение на выводе buttonPin будет низким, поэтому функция digitalRead() вернет низкое значение. Низкое значение сохраняется в переменной buttonState. Когда кнопка нажата, напряжение на контакте buttonPin будет высоким, поэтому в переменной buttonState будет сохранено высокое значение. Используется функция digitalWrite(), чтобы послать сигнал напряжения на светодиод.
Вывод, на которую нужно послать напряжение — это вывод ledPin, поэтому он является первым аргументом. Второй аргумент функции digitalWrite() указывает функции послать на вывод либо высокий, либо низкий уровень напряжения. Но вместо записи высокого или низкого напряжения можно использовать переменную buttonState, и функция запишет на вывод ledPin любое значение, хранящееся в этой переменной.
Плавающие выводы
Цифровые контакты Arduino чрезвычайно чувствительны. Даже слабые электромагнитные поля могут быть обнаружены Arduino. И они регистрируются как высокие сигналы функцией digitalRead().
Когда пины GPIO могут принимать паразитные электромагнитные поля, их называют плавающими пинами. Нужно исправить это, убедившись, что пин buttonPin остается низким, когда кнопка не нажата.
Притягивающие резисторы
Самый простой способ — подключить резистор с левой стороны кнопки к земле.
Когда кнопка не нажата, паразитная электромагнитная энергия будет стекать на землю через резистор. Когда кнопка нажата, резистор ограничит ток на землю, и ток потечет на контакт 7. Это называется притягивающим резистором, потому что он соединяет вывод с землей, чтобы поддерживать его в состоянии низкого напряжения. Значение подтягивающего резистора может варьироваться, но обычно оно превышает 10 К Ом.
Подтягивающие резисторы
Подтягивающие резисторы более распространены, чем притягивающие резисторы. Подтягивающие резисторы подключаются к источнику напряжения и удерживают вывод в состоянии высокого напряжения:
В этой схеме подтягивающий резистор подключен к напряжению 5 вольт, а правая сторона кнопки подключена к земле. При нажатии на кнопку на вывод 7 подается сигнал низкого уровня, что приводит к включению светодиода. Подтягивающий резистор привязан к 5 вольтам и поддерживает высокий уровень на выводе 7 до тех пор, пока кнопка не будет нажата.
Код для использования подтягивающего резистора выглядит следующим образом:
int buttonPin = 7;
int ledPin = 11;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
}
void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH);
}
if (buttonState == HIGH) {
digitalWrite(ledPin, LOW);
}
}
Как и в предыдущей программе, объявляется переменные buttonPin и ledPin и устанавливаем их в качестве выходов. Затем используется функцию digitalRead() для определения состояния напряжения на кнопке buttonPin и сохраняем его в переменной buttonState.
Чтобы Arduino посылала высокий сигнал на вывод ledPin, когда переменная buttonState имеет низкий уровень. В разделе loop() используется два оператора if, чтобы контролировать, что происходит, когда переменная buttonState имеет высокий или низкий уровень. Если значение переменной buttonState низкое, выполняется первый оператор if, и на вывод ledPin подается высокий сигнал. Если переменная buttonState имеет высокий уровень, программа выполняет второй оператор if, и на вывод ledPin записывается низкий уровень напряжения.
Теперь, когда нажата кнопка, светодиод должен включиться и не мерцать, когда проводите рукой по схеме. Проблема плавающего вывода решена.
Внутренний подтягивающий резистор Arduino
Подтягивающий и подтягивающий резисторы, которые рассматривалась в этой статье, являются внешними компонентами схемы. Но у Arduino есть и внутренний подтягивающий резистор, который можно использовать для той же цели. Чтобы использовать внутренний подтягивающий резистор Arduino, используйте INPUT_PULLUP в качестве второго аргумента в функции pinMode() для buttonPin следующим образом:
int buttonPin = 7;
int ledPin = 11;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
int buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
digitalWrite(ledPin, HIGH);
}
if (buttonState == HIGH) {
digitalWrite(ledPin, LOW);
}
}
Теперь подключается схема без подтягивающего резистора, подключенного к 5 вольтам. Внутренний подтягивающий резистор использует на один компонент меньше и делает схему немного проще.