Урок 12. Мигаем светодиодом Ардуино
Мы уже рассмотрели основные вопросы работы с аналоговыми входами и выходами. В этом уроке мы подключим светодиодную цепь к одному из цифровых выводов Arduino и с помощью кода включим и выключим светодиод. Мы закрепим знания полезных встроенных функций языка Arduino. На данном этапе важно запомнить, когда и как применять три ключевые функции.
pinMode(pinNumber, mode)
pinMode() (см. в справочнике) вызывается в setup() скетча для инициализации каждого используемого вывода в качестве входа или выхода.
Нельзя считывать данные с контакта или отправлять на него сигнал до тех пор, пока не задана функция pinMode().
Функция pinMode() принимает два аргумента: номер пина (как мы уже знаем из предыдущих уроков, каждый вывод Arduino имеет свой номер) и требуемый режим — INPUT или OUTPUT. Для мигания светодиодом мы отправляем данные из Arduino, управляя состоянием светодиода, поэтому вторым аргументом указываем OUTPUT.
digitalWrite(pinNumber, state)
digitalWrite() — команда, позволяющая установить напряжение на выводе равным 5 В или 0 В (земле). Ранее мы подключали светодиод к источнику 5 В и убедились, что он загорается.
Если же подключить светодиод к одному из цифровых выводов Arduino, можно включать его, устанавливая вывод в 5 В, и выключать, переключая вывод на землю.
digitalWrite() также принимает два аргумента — номер контакта и его состояние (HIGH для 5 В и LOW для заземления).
delay(timeInMs)
delay() приостанавливает выполнение программы на заданное время. К примеру, delay(2000) создаст паузу в 2000 миллисекунд (то есть 2 секунды), delay(100) — в 100 миллисекунд (1/10 секунды) и так далее.
Перед написанием итоговой программы выполним соединения на макетной плате.
Пишем код для мигания светодиодом и загружаем его на Arduino.
// Мигание светодиода
int ledPin = 7; // Пин Arduino, который подключен к светодиоду
void setup() {
pinMode(ledPin, OUTPUT); // инициализируем вывод как выход
}
void loop() {
digitalWrite(ledPin, HIGH); // ВКЛ светодиод
delay(1000); // ждать 1000 миллисекунд (1 секунда)
digitalWrite(ledPin, LOW); // ВЫКЛ светодиода
delay(1000); // ждять 1 секунду
}
Строки, начинающиеся с //, являются комментариями — плата Arduino их игнорирует. Хорошие программисты часто оставляют комментарии в коде.
Также обратите внимание на точки с запятой. Они ставятся в конце каждой команды в большинстве языков программирования, включая Arduino. Если забыть точку с запятой, появится ошибка. Со временем, при изучении других направлений разработки, вы обнаружите, что многие языки программирования используют точки с запятой в конце каждой строки.
В этом коде ledPin — переменная. Переменные предназначены для хранения данных в программах. В нашем скетче переменная ledPin хранит число 7. Когда Arduino встретит в коде переменную ledPin, плата подставит её текущее значение. Таким образом, строка:
pinMode(ledPin, OUTPUT);
будет обработана Arduino как:
pinMode(7, OUTPUT);
По сути, мы могли бы везде вместо ledPin писать число 7, и программа работала бы точно так же, однако использование переменной делает код более читаемым и понятным.
int в первой строке обозначает тип данных. В языке Arduino, основанном на C++, переменные всегда нужно инициализировать, указывая их тип. Существует множество типов, но на данном этапе углубляться в них нет необходимости. Пока достаточно знать, что переменные типа int представляют положительные или отрицательные целые числа — и этот тип вам будет встречаться очень часто.
Как и ожидалось, светодиод загорается на секунду, затем гаснет на секунду. Попробуйте менять значения delay(), чтобы увидеть, как это влияет на частоту мигания светодиода.
Ещё один момент, заслуживающий внимания, — распространённая ошибка, которую совершают многие. Она заключается в пропуске последнего delay() в цикле loop(). Попробуйте воспроизвести эту ошибку — вы увидите, что светодиод остаётся постоянно включённым и не мигает. Это может сбить с толку, ведь команда digitalWrite(ledPin, LOW) по-прежнему присутствует в программе.
Фактически светодиод выключается, но Arduino моментально достигает конца цикла loop() и снова начинает выполнение с первой строки (включение светодиода). Это происходит настолько быстро, что человеческий глаз не успевает заметить момент выключения светодиода за то мгновение, пока цикл перезапускается.