Познакомимся с кнопкой— важным электронным компонентом. Кнопка нужна везде, где требуется взаимодействие электроники с человеком. Для начала, рассмотрим, как устроена кнопка. Как можно догадаться, внутри корпуса кнопки находится пара металлических контактов. Когда кнопка находится в нормальном состоянии, ее контакты разомкнуты, а при нажатии— замыкаются. Рисунок 1. Внешний вид тактовых кнопок и обозначение на электрических схемах
Из предыдущих экспериментов мы помним, что, микроконтроллер на пины может подавать логический нуль или логическую единицу,подробнее можно ознакомиться в базе знаний по ссылке, но как получить их с помощью кнопки? Логично подключить кнопку между выводом микроконтроллера и напряжением питания. Когда кнопка нажимается, напряжение питания подается на ножку, что является логической единицей. Такая схема изображена на рисунке 2.
Рисунок 2. Неправильная схема подключения кнопки
Почему же эта схема неправильная? Дело в том, что когда кнопка нажата, на ножку микроконтроллера, действительно, подается напряжение питания, что является уровнем логической единицы, однако, когда кнопка не нажата, то на ножку не подается ничего. Говорят, что она «висит в воздухе»— то есть никуда не подключена. Такое состояние не является состоянием логического нуля. Состояние такого вывода может самопроизвольно меняться, например из-за статического электричества, или даже радиоволны. Чтобы получить состояние логического нуля, нужно подключить ножку к земле. Так называют минус питания, «общий» провод, относительно которого и отсчитывается напряжение во всей схеме.
Но как подключить кнопку, чтобы в одном состоянии она соединяла ножку с питанием, а в другом— с землей, ведь у нее только один контакт, который либо замкнут, либо разомкнут? В таком случае используют резистор, с помощью которого ножку микроконтроллера подтягивают к противоположному уровню.
Рисунок 3. Правильные схемы подключения кнопки
На рисунке 3 изображено два варианта правильного подключения кнопки.
Вариант А: Когда кнопка не нажата, ножка микроконтроллера подключена к земле через резистор, что является состоянием логического нуля. Сопротивление подтягивающего резистора выбирают достаточно большим, чтобы уменьшить протекающий через него ток, например, 10 килоом. Когда кнопка нажата, вывод микроконтроллера подключается к плюсу питания, что является логической единицей. Хотя, в это же время, соединение с землей через резистор также сохраняется, но ток, протекающий через него, слишком мал, чтобы «соперничать» с прямым подключением к питанию, поэтому он не может помешать установлению логической единицы на ножке микроконтроллера.
Вариант Б: Когда кнопка не нажата, ножка микроконтроллера подключена к питанию через резистор, что является состоянием логической единицы. А когда нажата— к земле, что является логическим нулем.
Теперь мы знаем как правильно подключать кнопку, а из предыдущего эксперимента возьмем схему подключения светодиода. Объединим это в одну схему.
Рисунок 4. Электрическая принципиальная схема эксперимента
Теперь напишем программу результатом выполнения которой будет светится светодиод при нажатии на кнопку.
int keyPin = 12; //номер пина контроллера кнопки int ledPin = 2; //номер пина контроллера светодиода void setup() { pinMode(keyPin,INPUT);//установки режима пина кнопки на "вход" pinMode(ledPin,OUTPUT);//установки режима пина светодиода на "выход" } void loop() { if(digitalRead(keyPin) == HIGH) { digitalWrite(ledPin,HIGH); } else { digitalWrite(ledPin,LOW); } }
В начале программы объявляем две переменные и инициализируем их, то есть записываем в них значение, в нашем случае номера пинов контроллера, с которыми соединены кнопка и светодиод.
int keyPin = 12; //номер пина контроллера кнопки int ledPin = 2; //номер пина контроллера светодиода
разберем на составляющие строку с объявлением переменной keyPin
int
- тип переменной для хранения чисел,
keyPin
- имя переменной,
=
- оператор присваивания,
12
- значение которое присваивается переменной,
;
- (точка с запятой) обязательный символ в конце выражения,
//номер пина контроллера кнопки
- комментарий кода, удобно использовать для подписи блоков кода
результатам выполнения данного выражение будет присвоение переменной keyPin значения 12
в строке 2 - переменной ledPin присваивается значение 2
после инициализации переменных начинается выполнение функции setup()
, в которой настраиваются режимы работы пинов контроллера, пин 12 на «вход» сигнала, а пин 2 на «выход»
в функции loop()
программа проверяет в каком положении находится кнопка
void loop() { if(digitalRead(keyPin) == HIGH) { digitalWrite(ledPin,HIGH); } else { digitalWrite(ledPin,LOW); } }
Здесь мы впервые сталкиваемся с условным оператором. Оператор if
проверяет выполнение условия и исполняет код в зависимости от того выполнено условие или нет. Если условие выполняется, то выполняется код в блоке прямо под ним. Если условие ложно, то исполняется код в блоке else
.
В нашем случае условием является (digitalRead(keyPin) == HIGH)
. Символ двойного равенства ==
это оператор сравнения. Он сравнивает значение выражения слева от себя со значением выражения справа от себя. Если эти значения равны, то равенство выполняется, иначе— нет.
функция digitalRead(keyPin)
проверяет, соответствует ли текущий сигнал на заданном пине сигналу «HIGH»
,(в аргументе функции записана переменная keyPin
, в которую ранее мы записали номер пина к которому подключена кнопка.)
если условие верно (кнопка нажата), то функция digitalWrite(ledPin,HIGH);
устанавливает сигнал «HIGH» на пине к которому подключен светодиод и он начинает светиться, а если условие не выполняется (кнопка не нажата), функция digitalWrite(ledPin,LOW); на пин светодиода подает сигнал «LOW» и он гаснет.
Обратите внимание, что оператор присвоения =
предназначен для присвоения значения.
Например
int keyPin = 12;
А оператор сравнения ==
, сравнивает два значения.
По виду они похожи, но это совершенно разные операторы и путать их нельзя.
Теперь, когда мы разобрали каждую строку программы, взглянем опять на алгоритм целиком: программа постоянно, бесконечное количество раз, проверяет нажата ли кнопка. Если кнопка нажата, то на светодиод зажигается, если же кнопка не нажата то светодиод выключается.
1. Как изменить программу, чтобы наоборот, когда кнопка не нажата— светодиод светился, а если нажата— гас?
2. Как изменить электрическую схему, чтобы добиться такого же результата, но без изменения программы?