Урок 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 на макетной плате

Пишем код для мигания светодиодом и загружаем его на 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() и снова начинает выполнение с первой строки (включение светодиода). Это происходит настолько быстро, что человеческий глаз не успевает заметить момент выключения светодиода за то мгновение, пока цикл перезапускается.