Глиф Учебники

Урок 3. Первая программа Blink — мигание светодиодом

Курс «Arduino» · урок 3 из 10 · 4 минуты чтения

Blink («мигать») — первый скетч почти каждого, кто начинает с Arduino. Он мигает светодиодом L, который уже есть на плате, так что для него не нужно ничего, кроме платы и кабеля. В прошлом уроке этот пример был загружен как есть, теперь — разбор, как он устроен, и свой скетч на его основе.

Скетч целиком

Так выглядит пример File → Examples → 01.Basics → Blink (комментарии переведены):

Arduino
// setup выполняется один раз — после загрузки, включения питания или нажатия RESET
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // вывод светодиода — выход
}

// loop выполняется снова и снова, без конца
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // включить светодиод
  delay(1000);                      // ждать 1000 мс = 1 секунду
  digitalWrite(LED_BUILTIN, LOW);   // выключить светодиод
  delay(1000);                      // ждать ещё секунду
}

Две обязательные функции

У каждого скетча есть две функции, и обе обязательны — даже если одна из них пустая.

Слово void перед именем значит, что функция ничего не возвращает. Тело функции — между фигурными скобками { и }. Каждая команда заканчивается точкой с запятой ;. Текст после // до конца строки — комментарий: компилятор его пропускает, он нужен людям.

В обычной программе на C++ работа начинается с функции main. В скетче её писать не нужно: она уже есть в ядре Arduino и сама вызывает setup() один раз, а потом loop() в бесконечном цикле.

Старт питание, загрузка, RESET main() — уже есть в ядре Arduino void setup() один раз pinMode(LED_BUILTIN, OUTPUT); void loop() по кругу digitalWrite(LED_BUILTIN, HIGH); delay(1000); digitalWrite(LED_BUILTIN, LOW); delay(1000);
После включения, загрузки или RESET функция main из ядра Arduino один раз вызывает setup, а потом раз за разом вызывает loop.

pinMode(вывод, режим) — назначает выводу роль. OUTPUT — выход: плата сама подаёт на вывод напряжение. INPUT — вход: плата читает, что на выводе (о нём — в уроке про кнопку).

LED_BUILTIN — номер вывода, к которому подключён светодиод на плате. На Uno и Nano это 13, поэтому вместо LED_BUILTIN можно написать 13. Имя удобнее: на других платах номер другой, а скетч остаётся прежним.

digitalWrite(вывод, значение) — включает или выключает выход. HIGH — на выводе 5 В (у плат на 3,3 В — 3,3 В), светодиод горит. LOW — 0 В, светодиод гаснет.

delay(мс) — пауза в миллисекундах: в одной секунде 1000 мс. Пока идёт delay, плата больше ничего не делает; как обойтись без такой остановки — в уроке millis вместо delay.

Выходит такая последовательность: включить → ждать секунду → выключить → ждать секунду → и снова с начала loop.

вывод 13 5 В 0 В HIGH delay(1000) LOW delay(1000) HIGH delay(1000) LOW delay(1000) один проход loop() — 2 секунды и снова сначала
На выводе 13 секунду держится HIGH (5 В, светодиод горит) и секунду LOW (0 В, не горит); один проход loop занимает 2 секунды.

Поиграйте со временем

Поменяйте числа в delay и загрузите скетч снова:

Последний опыт показывает, как устроена плавная яркость: светодиод быстро-быстро включают и выключают. Это называется ШИМ, о ней — урок Аналоговые входы и ШИМ.

Свой скетч: сигнал SOS

Сигнал бедствия SOS азбукой Морзе — три коротких вспышки, три длинных и снова три коротких. Повторять одно и то же вручную долго, поэтому вспышка вынесена в свою функцию flash:

Arduino
const int LED = LED_BUILTIN;   // вывод 13 на Uno и Nano

// Одна вспышка: duration — сколько миллисекунд светить
void flash(int duration) {
  digitalWrite(LED, HIGH);
  delay(duration);
  digitalWrite(LED, LOW);
  delay(200);                  // пауза между вспышками
}

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  for (int i = 0; i < 3; i++) flash(200);   // S: три коротких
  for (int i = 0; i < 3; i++) flash(600);   // O: три длинных
  for (int i = 0; i < 3; i++) flash(200);   // S: три коротких
  delay(2000);                              // пауза перед повтором
}
S O S delay(2000) flash(200) 200 мс 200 мс flash(600) 600 мс 200 мс горит не горит
Сигнал SOS во времени: три вспышки flash(200), три flash(600), снова три flash(200) и delay(2000); после каждой вспышки пауза 200 мс.

Что здесь нового:

Переменные, функции и циклы в скетчах работают так же, как в обычном C++, — подробнее в курсе C++.

Частые ошибки

Коротко

Проверьте себя

1. Сколько раз выполняется функция setup()?
2. Что делает команда delay(500)?
3. Что окажется на выводе после digitalWrite(13, HIGH) на Arduino Uno?
4. Почему скетч с pinmode(13, OUTPUT); не компилируется?