Ты прошёл Python-фундамент быстрее графика — время сделать шаг в новую плоскость. До сих пор датчики и приводы были переменными в программе. Сегодня ты первый раз напишешь код, который управляет настоящим (пусть и виртуальным) устройством: платой 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 — туда программа будет печатать сообщения.

Структура программы: 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()?
Подсказка: loop по-английски — «цикл». Подумай, что делает цикл.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Что делает команда pinMode(13, OUTPUT) в setup()?
Подсказка: OUTPUT по-английски — «выход». Речь о направлении сигнала, не о выводе текста.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Какое значение нужно подать в digitalWrite, чтобы включить светодиод?
Подсказка: Один из вариантов означает «включить» (активный уровень сигнала), другой — «выключить». OUTPUT сюда не подходит — это значение для pinMode, а не для digitalWrite.
Проверить ответ →
Реальная проверка — на нашей платформе, бесплатно и без регистрации. Открыть задачу и ввести ответ →
Контрольный вопрос. Через сколько миллисекунд после включения (HIGH) светодиод в первый раз погаснет?
Исходный код для этого задания:
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(500); }Подсказка: 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() { }Подсказка: В 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. Дальше — цифровой вход: кнопка и реакция на событие.
