Arduino C++, Wokwi, цифровой выход

Ты прошёл Python-фундамент быстрее графика — время сделать шаг в новую плоскость. До сих пор датчики и приводы были переменными в программе. Сегодня ты первый раз напишешь код, который управляет настоящим (пусть и виртуальным) устройством: платой Arduino. Мы остаёмся в симуляторе — покупать комплект не нужно, разводку плат и электротехнику по-прежнему даёт вуз. Наша зона — прошивка: как заставить плату мигать светодиодом и отчитываться в консоль.

Плата Arduino со светодиодом на экране симулятора рядом с окном кода

После урока сможешь: открыть Wokwi и собрать проект с Arduino Uno, объяснить, что такое setup() и loop(), включать и выключать светодиод командой digitalWrite, выводить сообщения в Serial Monitor. В конце — мини-проект «Маяк»: мигающий светодиод с отчётом в консоли.

Вспомни: в Python ты уже писал программы, которые выполняются команда за командой сверху вниз, хранил данные в переменных и выводил их на экран. Логика та же — программа снова выполняется по порядку. Меняется язык: у C++ (языка Arduino) свой синтаксис — каждая команда заканчивается точкой с запятой ;, а блоки кода берутся в фигурные скобки { }.

Wokwi — Arduino без физического комплекта

Wokwi — бесплатный симулятор Arduino прямо в браузере, без установки и без покупки платы. Зайди на wokwi.com, нажми «New Project» → «Arduino Uno». Слева появится плата на схеме, справа — окно кода (файл sketch.ino). Кнопка ▶ (Play) вверху запускает симуляцию, снизу открывается вкладка Serial Monitor — туда программа будет печатать сообщения.

Интерфейс Wokwi: вкладки sketch.ino/diagram.json/Library Manager, окно кода, схема с платой, кнопка запуска и Serial Monitor

Структура программы: setup() и loop()

Любая программа Arduino состоит из двух обязательных функций. setup() выполняется один раз при включении платы — здесь настраивают, что и как будет использоваться. loop() выполняется бесконечно по кругу, пока плата включена, — здесь описывают, что она делает снова и снова.

void setup() {
  Serial.begin(9600);
  Serial.println("Система запущена");
}

void loop() {
}
Система запущена
  Жизненный цикл программы Arduino:

   включение платы
         |
         v
   +-----------+
   |  setup()  |  <- выполняется ОДИН раз
   +-----------+
         |
         v
   +-----------+
   |  loop()   |  <- выполняется СНОВА и СНОВА,
   +-----+-----+     пока плата включена
         |
         +----> назад в начало loop()

Serial.begin(9600) — открывает канал связи с Serial Monitor (число 9600 — скорость обмена, стандартное значение). Без этой строки в setup() сообщения из Serial.println никуда не попадут.

pinMode и digitalWrite — управляем светодиодом

У платы есть пронумерованные пины (выводы) — через них плата подаёт или принимает сигнал. Команда pinMode(номер, OUTPUT) в setup() говорит: «этот пин будет выходом — плата будет подавать на него сигнал». Дальше командой digitalWrite(номер, HIGH) подаём высокий уровень (включаем), а digitalWrite(номер, LOW) — низкий (выключаем). Команда delay(1000) ставит паузу на 1000 миллисекунд (1 секунда) перед следующей командой.

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

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(1000);
}
  Мигание светодиода на пине 13 (таймлайн):

  уровень
  HIGH  ####........####........####....
  LOW   ....########....########....####
        |--1000мс--|--1000мс--|--1000мс--|

  digitalWrite(13, HIGH) -> включить
  delay(1000)            -> подождать 1000 мс
  digitalWrite(13, LOW)  -> выключить
  delay(1000)            -> подождать 1000 мс
  ...и цикл loop() повторяется заново

Serial.print и Serial.println — вывод, как print в Python

Serial.println("текст") печатает строку в Serial Monitor и переводит курсор на новую строку — почти как print в Python. А вот Serial.print("текст") печатает без перевода строки — следующая команда допечатает в ту же строку.

void setup() {
  Serial.begin(9600);
  Serial.print("Режим");
  Serial.print(": ");
  Serial.println("норма");
}

void loop() {
}
Режим: норма

Забыл точку с запятой ; в конце команды — программа не соберётся, симулятор покажет ошибку компиляции вместо запуска. Это самая частая ошибка новичка в C++.

Миссия: собери «Маяк»

Открой Wokwi, создай проект Arduino Uno и вставь программу ниже вместо содержимого sketch.ino. Запусти (▶) и открой Serial Monitor — увидишь мигание встроенного светодиода (пин 13) и сообщения о каждом сигнале. Поменяй значения в delay() на свои и запусти снова.

// Поменяй числа в delay() на свои и запусти
int pauza_vkl = 1000;
int pauza_vykl = 1000;

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(13, HIGH);
  Serial.println("Маяк: сигнал ВКЛ");
  delay(pauza_vkl);
  digitalWrite(13, LOW);
  Serial.println("Маяк: сигнал ВЫКЛ");
  delay(pauza_vykl);
}
Маяк: сигнал ВКЛ
Маяк: сигнал ВЫКЛ
Маяк: сигнал ВКЛ
...

Проверь себя

Контрольный вопрос. Сколько раз выполняется функция setup() за время работы программы?

АБесконечно, пока плата включена
БОдин раз, сразу после включения платы
ВНи разу — она нужна только для примера

Подсказка: Название функции подсказывает: «настройка» происходит перед началом работы, а не всё время.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Как ведёт себя функция loop()?

АВыполняется один раз перед setup()
БНастраивает пины на вход или выход
ВПовторяется снова и снова, пока плата включена

Подсказка: loop по-английски — «цикл». Подумай, что делает цикл.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Что делает команда pinMode(13, OUTPUT) в setup()?

АПечатает номер пина в Serial Monitor
БСчитывает текущий сигнал с пина 13
ВНастраивает пин 13 как выход — плата будет подавать на него сигнал

Подсказка: OUTPUT по-английски — «выход». Речь о направлении сигнала, не о выводе текста.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Какое значение нужно подать в digitalWrite, чтобы включить светодиод?

АLOW
БOUTPUT
ВHIGH

Подсказка: Один из вариантов означает «включить» (активный уровень сигнала), другой — «выключить». OUTPUT сюда не подходит — это значение для pinMode, а не для digitalWrite.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Через сколько миллисекунд после включения (HIGH) светодиод в первый раз погаснет?

Исходный код для этого задания:

void loop() {
  digitalWrite(13, HIGH);
  delay(1000);
  digitalWrite(13, LOW);
  delay(500);
}
А1500
Б500
В1000

Подсказка: delay() указывает, сколько миллисекунд подождать ПЕРЕД следующей командой.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Что появится в Serial Monitor одной строкой? Впиши вывод точно, как он появится.

Исходный код для этого задания:

Serial.print("Обороты");
Serial.print(": ");
Serial.println("1500");

Подсказка: Serial.print не переводит строку — все команды печатают подряд, пока не встретится println.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Задание. Напиши код сам. Допиши команду вместо ___, которая настраивает пин 13 как выход. Регистр букв важен.

Исходный код для этого задания:

void setup() {
  ___(13, OUTPUT);
}

Подсказка: Эта команда была введена в материале занятия, когда объяснялось, как настроить пин на режим OUTPUT — если не помнишь точное имя, перечитай тот раздел.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Задание. Напиши код сам. В переменной pin_led уже задан номер пина. Напиши команду, которая включает светодиод на этом пине (подаёт высокий уровень сигнала).

Исходный код для этого задания:

int pin_led = 13;
// напиши ниже команду, которая включает светодиод на pin_led

Подсказка: Используй digitalWrite с переменной pin_led вместо номера пина и нужным значением уровня.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Проверить ответ →

Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →

Контрольный вопрос. Программа не запускается — Wokwi показывает ошибку компиляции. В чём проблема?

Исходный код для этого задания:

void setup() {
  Serial.begin(9600)
  Serial.println("Старт");
}

void loop() {
}
АПропущена точка с запятой после Serial.begin(9600)
Бloop() должен находиться внутри setup()
ВФункция setup написана с ошибкой в имени

Подсказка: В C++ каждая отдельная команда обязана заканчиваться символом ;

Онлайн-проверка ответа появится позже

Контрольный вопрос. Сколько всего миллисекунд проходит за один полный проход loop() — от начала функции до конца, один раз? Впиши число.

Исходный код для этого задания:

void loop() {
  digitalWrite(13, HIGH);
  delay(300);
  digitalWrite(13, LOW);
  delay(700);
}

Подсказка: Сложи все паузы delay(), которые встречаются внутри loop() за один проход.

Онлайн-проверка ответа появится позже

Задание. Напиши код сам (3 строки внутри loop). В переменной pin_led — номер пина. Напиши loop(), который: включает светодиод, ждёт 200 миллисекунд, затем выключает светодиод (без второй паузы).

Исходный код для этого задания:

int pin_led = 13;

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

void loop() {
  // напиши 3 строки: включить, подождать 200 мс, выключить
}

Подсказка: Построчно: digitalWrite включает, delay ждёт, digitalWrite выключает — используй переменную pin_led вместо номера.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Онлайн-проверка ответа появится позже

Задание. Напиши программу целиком (setup + loop, около 7 строк). Пин 13 — выход. В loop(): включи светодиод и выведи в Serial Monitor строку «Сигнал: ВКЛ», подожди 300 миллисекунд; выключи светодиод и выведи «Сигнал: ВЫКЛ», подожди 900 миллисекунд. Не забудь Serial.begin(9600) в setup().

Исходный код для этого задания:

// напиши setup() и loop() целиком по описанию выше

Подсказка: Собери из уже знакомых команд: pinMode в setup вместе с Serial.begin; в loop чередуй digitalWrite, Serial.println и delay с нужными числами.

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

Онлайн-проверка ответа появится позже

Что дальше

Теперь ты умеешь запускать код в Wokwi, понимаешь setup()/loop(), можешь включать и выключать сигнал и выводить сообщения в Serial Monitor. На следующем занятии станция научится реагировать на событие — считывать нажатие кнопки и менять поведение в зависимости от него.

Итог: ты запустил первую программу в Wokwi, разобрался в setup()/loop(), включаешь и выключаешь сигнал через digitalWrite и выводишь сообщения через Serial. Дальше — цифровой вход: кнопка и реакция на событие.

Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева