Основы · 9 мин чтения

Блочный код Arduino: мигаем светодиодом, блоки и C++ рядом

Блочный код Arduino для новичков: подключаем светодиод через резистор 220 Ω, смотрим строку C++ за каждым блоком, меняем задержку 100 мс и собираем светофор.

С блочным кодом Arduino первая программа почти всегда одна и та же: мигать светодиодом. В этой статье мы проделаем это от начала до конца. Подключим светодиод к пину 9 через резистор 220 Ω, по одному прочитаем блоки проекта «Мигание светодиодом» в BlueGrays и рядом увидим, в какую строку кода на C++, загружаемого в плату, превращается каждый блок. А ещё ты попробуешь поменять всего одно число, 100 в блоке «ждать 100 мс», и так управлять скоростью мигания светодиода.

Эта статья — 2-я часть серии От блоков к коду. В статье что такое блочный код мы объяснили, что такое блоки и как они превращаются в настоящий код. В следующей части мы добавим кнопку и разберём блок «если» и if/else.

Одним светодиодом мы не ограничимся. Шаг за шагом та же логика вырастет в программы, которые поочерёдно мигают двумя светодиодами, работают как светофор и вспыхивают как полицейская мигалка. Потом ты увидишь ту же идею на ESP32 и на Raspberry Pi Pico с MicroPython. В конце — таблица ошибок, которые почти каждый новичок хоть раз совершает. Все проекты из этой статьи в BlueGrays бесплатны вместе с блоками и кодом, а все проекты с блоками по платформам собраны на странице «Блочный код».

Что понадобится?

ДетальКол-воПримечание
Arduino Uno (или Nano)1Подключается к компьютеру по USB
Светодиод 5 мм (проще всего с красным)1Длинная ножка +, короткая ножка -
Резистор 220 Ω1Цветные полосы: красная, красная, коричневая
Макетная плата1Пайка не нужна
Провода-перемычки «папа–папа»2Для D9 и GND
Компьютер с Arduino IDE1Чтобы загрузить код в плату

Схема: подключаем светодиод к пину 9

У светодиода две ножки, и направление важно. Длинная ножка — это анод (+), а короткая — катод (-); со стороны катода у пластикового корпуса есть плоский срез. Ток течёт только от анода к катоду, поэтому если вставить светодиод наоборот, ничего не произойдёт. Соедини пин 9 Arduino с одним концом резистора 220 Ω, а другой конец резистора — с длинной ножкой светодиода. Затем выведи короткую ножку на GND. Резистор ограничивает ток: если из 5 V вычесть примерно 2 V, которые нужны красному светодиоду, на резисторе останется 3 V, а 3 V / 220 Ω — это около 14 mA. Для светодиода это комфортно, а для пина Arduino безопасно. Значение для светодиода своего цвета можно проверить в калькуляторе резистора для светодиода. Как работает светодиод, рассказано в статье что такое светодиод, а как ряды макетной платы соединены внутри — в статье что такое макетная плата.

ПодключениеArduino Uno («Мигание светодиодом»)ESP32 («Мигание светодиодом на ESP32»)Raspberry Pi Pico (внешний светодиод)
Длинная ножка светодиода (анод, +)D9 через 220 ΩGPIO 5 через 220 ΩGP14 через 220 Ω
Короткая ножка светодиода (катод, -)GNDGNDGND
Пин в блоках и в коде95LED_PIN = 14
Задержка в проекте100 мс500 мс0,5 с
Напряжение на пине5 V3,3 V3,3 V
Никогда не подключай светодиод к пину напрямую, без резистора. Без него ток ничем не ограничен: светодиод светит слишком ярко, нагревается и может быстро выйти из строя, а пин Arduino тоже может пострадать. Если светодиод вставлен наоборот, не волнуйся: он просто не загорится, достаточно его перевернуть. Пины своей платы можно найти в утилите распиновки.

Первая программа в блоках: «Мигание светодиодом»

Когда схема готова, посмотрим на программу. Открой в BlueGrays проект «Мигание светодиодом» и включи в разделе кода переключатель Показать блоками: появятся блоки, как на изображении ниже. Всего блоков семь, и они делятся на две большие группы: вверху настройка (один раз), под ней повторять всегда. Блоки отображаются на языке приложения, поэтому по-русски блок читается как «записать HIGH в пин», по-английски — «write HIGH to pin», а по-турецки — «numaralı pine YÜKSEK yaz».

Блоки проекта «Мигание светодиодом»: в настройке «настроить пин 9 как OUTPUT», затем внутри «повторять всегда» записать HIGH, ждать 100 мс, записать LOW, ждать 100 мс
Блоки проекта «Мигание светодиодом» (проект 1): в настройке пин 9 один раз делается выходом, а четыре блока внутри «повторять всегда» повторяются бесконечно.

Блоки внутри группы настройка (один раз) выполняются только один раз: при включении платы или нажатии кнопки сброса. Здесь всего один блок: «настроить пин 9 как OUTPUT». Цифровые пины Arduino могут быть входами или выходами. Раз мы управляем светодиодом, мы говорим плате: «Через этот пин я буду подавать напряжение наружу». Группа повторять всегда начинается после окончания настройки и снова и снова выполняется сверху вниз, пока плата включена. Её четыре блока включают светодиод, ждут 100 миллисекунд, выключают его и ждут ещё 100 миллисекунд. После последнего блока программа возвращается наверх, и светодиод снова загорается. То, что мы называем миганием, — это просто повторение этих четырёх шагов пять раз в секунду.

Блок → строка C++: во что превращается каждый блок?

БлокСтрока C++Что делает
настройка (один раз)void setup() { … }Выполняет содержимое один раз при включении
настроить пин 9 как OUTPUTpinMode(9,OUTPUT);Делает пин 9 выходом
повторять всегдаvoid loop() { … }Повторяет содержимое бесконечно
записать HIGH в пин 9digitalWrite(9,HIGH);Подаёт на пин 5 V, светодиод загорается
ждать 100 мсdelay(100);Приостанавливает программу на 0,1 с
записать LOW в пин 9digitalWrite(9,LOW);Ставит на пине 0 V, светодиод гаснет
ждать 100 мсdelay(100);Светодиод остаётся выключенным 0,1 с
C++ (Arduino IDE)
1// Led Yakma (proje 1): D9'daki LED 100 ms yanar, 100 ms söner
2// LED Blink (project 1): the LED on D9 is on for 100 ms, off for 100 ms
3void setup() {
4  pinMode(9,OUTPUT);     // LED pini çıkış / LED pin as output
5}
6
7void loop() {
8  digitalWrite(9,HIGH);  // LED'i yak / turn the LED on
9  delay(100);            // 100 ms bekle (1000 ms = 1 s) / wait 100 ms (1000 ms = 1 s)
10  digitalWrite(9,LOW);   // LED'i söndür / turn the LED off
11  delay(100);            // 100 ms bekle / wait 100 ms
12}
13

Положи таблицу рядом с кодом, и станет видно, что блоки берут на себя. Форма групп «настройка» и «повторять всегда» соответствует фигурным скобкам функций void setup() и void loop(): от того, в какой группе стоит блок, зависит, внутри какой пары скобок будет записана его строка. В блоках не нужно думать о точке с запятой в конце каждой команды, о заглавных и строчных буквах (pinMode, digitalWrite) или о скобках. Но когда начинаешь править код в Arduino IDE вручную, всё это становится важным: одной пропущенной точки с запятой достаточно для ошибки компиляции. В этом и есть настоящая польза блоков: сначала ты выстраиваешь логику программы, а потом учишься тому, как та же логика записывается в коде.

Что будет, если изменить «ждать 100 мс»?

Время ожидания задаётся в миллисекундах (мс), и 1000 мс — это одна секунда. Оба блока ожидания в проекте стоят на 100 мс, поэтому светодиод 0,1 секунды горит и 0,1 секунды не горит. Один полный цикл занимает 200 мс, то есть светодиод мигает пять раз в секунду. Увеличь число в обоих блоках, и светодиод замедлится; уменьши — и он ускорится. Ниже определённого порога глаз уже не различает отдельные вспышки, и кажется, что светодиод горит постоянно. В таблице показано, что ты увидишь, если изменить оба ожидания:

Блоки ожиданияПолный циклМиганий в секундуЧто видно
10 мс + 10 мс20 мс50Кажется, что горит постоянно, чуть тусклее
100 мс + 100 мс (значение в проекте)200 мс5Быстрое, чёткое мигание
250 мс + 250 мс500 мс2Мигание, за которым легко следить
500 мс + 500 мс1 с1Раз в секунду, спокойный ритм
1000 мс + 1000 мс2 с0,51 секунду горит, 1 секунду не горит
100 мс + 900 мс1 с1Короткая вспышка, долгая темнота
Два блока ожидания не обязаны совпадать. Поставь в первый 100, а во второй 900, и светодиод будет давать одну короткую вспышку в секунду, как индикатор «я работаю» на многих устройствах. В коде это delay(100); и delay(900);. Изменить одно число и загрузить код заново — самое быстрое упражнение, чтобы увидеть, как связаны блоки и код.

Расширяем программу: два светодиода, светофор, полицейская мигалка

Если ты умеешь мигать одним светодиодом, для управления несколькими ничего нового не нужно: те же три блока просто повторяются с другими пинами. В проекте «Два светодиода мигают поочерёдно» в настройке выходами делаются два пина: 8 и 9. Внутри «повторять всегда» идут «записать HIGH в пин 8» и «записать LOW в пин 9», затем «ждать 200 мс». Потом записывается обратное, и программа снова ждёт 200 мс. Хитрость в том, что два блока записи выполняются друг за другом без ожидания между ними, поэтому кажется, что светодиоды меняются местами в один и тот же момент. Блок ожидания определяет, сколько длится каждое состояние.

Проект «Светофор» переносит ту же идею на три светодиода: красный на D2, жёлтый на D3, зелёный на D4. Группа «повторять всегда» состоит из четырёх фаз, и каждая следует одному шаблону: по одному блоку «записать HIGH» или «записать LOW» для каждого из трёх светодиодов, затем один блок ожидания. Блоки записи решают, какой светодиод горит, а блок ожидания — как долго. Больше блоков не значит сложнее, просто программа длиннее. Версию ближе к настоящему перекрёстку, с кнопкой для пешеходов, ищи в статье Светофор на Arduino.

Блоки проекта «Светофор»: пины 2, 3 и 4 как выходы, блоки «записать HIGH» и «записать LOW» в четырёх фазах, ожидания 2000 мс и 300 мс
Блоки проекта «Светофор» (проект 3): в каждой фазе три блока записи и один блок ожидания.
ФазаКрасный (D2)Жёлтый (D3)Зелёный (D4)Ожидание
1HIGHLOWLOW2000 мс (2 с)
2LOWHIGHLOW300 мс
3LOWLOWHIGH2000 мс (2 с)
4LOWHIGHLOW300 мс
C++ (Arduino IDE)
1// Trafik Lambası (proje 3) / Traffic Light (project 3)
2void setup() {
3  pinMode(2,OUTPUT);    // Kırmızı / Red
4  pinMode(3,OUTPUT);    // Sarı / Yellow
5  pinMode(4,OUTPUT);    // Yeşil / Green
6}
7
8void loop() {
9  // Kırmızı yanar, 2 s bekle / Red on, wait 2 s
10  digitalWrite(2,HIGH);
11  digitalWrite(3,LOW);
12  digitalWrite(4,LOW);
13  delay(2000);
14  // Sarı yanar, 0,3 s bekle / Yellow on, wait 0.3 s
15  digitalWrite(2,LOW);
16  digitalWrite(3,HIGH);
17  digitalWrite(4,LOW);
18  delay(300);
19  // Yeşil yanar, 2 s bekle / Green on, wait 2 s
20  digitalWrite(2,LOW);
21  digitalWrite(3,LOW);
22  digitalWrite(4,HIGH);
23  delay(2000);
24  // Sarı yanar, sonra başa (kırmızıya) dön / Yellow on, then back to red
25  digitalWrite(2,LOW);
26  digitalWrite(3,HIGH);
27  digitalWrite(4,LOW);
28  delay(300);
29}
30

Проект «Полицейская мигалка» знакомит с двумя новыми видами блоков. Первый — группа глобальные переменные (в начале) с блоком «объявить целое (int) delayTime = 60» внутри. В коде это строка int delayTime = 60;, и она даёт времени вспышки имя. Поскольку в блоках ожидания стоит delayTime, а не число, для изменения скорости достаточно поправить одно число 60, а не четыре отдельных блока. Второй — зелёный блок «повторить 3 раза»: он выполняет четыре блока внутри себя три раза и в C++ становится циклом for(int i=0;i<3;i++).

Блоки проекта «Полицейская мигалка»: переменная delayTime, пины 2 и 3 как выходы, два блока «повторить 3 раза»
Блоки проекта «Полицейская мигалка» (проект 4): красный светодиод (D2) вспыхивает три раза, затем синий светодиод (D3) вспыхивает три раза.

Посчитаем: при каждой вспышке красный светодиод 60 мс горит и 60 мс не горит, так что одна вспышка длится 120 мс. Три вспышки — это 360 мс, и столько же у синего светодиода. Полный цикл занимает около 0,7 секунды. Поставь delayTime равным 30, и огни будут мигать вдвое быстрее; поставь 120 — и они замедлятся. Переменные и циклы — тема 4-й части серии, где мы подробно разбираем их в статье «повторять всегда», блоки счёта и массивы. Проект «Бегущий огонь», в котором огонёк бежит по ряду светодиодов, — следующий шаг на том же пути.

Та же идея на ESP32 и Raspberry Pi Pico

На ESP32 блоки почти такие же, как на Arduino, потому что ESP32 тоже программируют на C++ в Arduino IDE. В проекте «Мигание светодиодом на ESP32» светодиод подключён к GPIO 5, а блоки ожидания стоят на 500 мс. Строки кода тоже те же: pinMode(5, OUTPUT); digitalWrite(5, HIGH); delay(500);. Отличаются только номер пина, то, что пины ESP32 выдают 3,3 V, и выбор платы ESP32 в Arduino IDE. Всё, что ты изучишь на Uno, напрямую переносится на ESP32.

В проектах на Raspberry Pi Pico блоки превращаются в код на MicroPython, а названия блоков немного меняются. В проекте «Внешний светодиод на Raspberry Pi Pico» светодиод подключён к GP14. Блок «пин led : GP LED_PIN , OUTPUT» соответствует led = Pin(LED_PIN, Pin.OUT), «включить (on) пин led» — led.on(), «ждать 0.5 с» — time.sleep(0.5), а «повторять всегда» — циклу while True:. Обрати внимание: в MicroPython ожидание задаётся в секундах, а не в миллисекундах; delay(500) из Arduino превращается в time.sleep(0.5). Если хочется попробовать вообще без проводов, проект «Мигание встроенным светодиодом Raspberry Pi Pico» зажигает светодиод на GP25 прямо на плате; на Pico W к встроенному светодиоду обращаются по имени «LED», а не GP25.

MicroPython
1# Pico harici LED (proje 8163), seri port satırları çıkarıldı
2# Pico external LED (project 8163), serial print lines removed
3from machine import Pin
4import time
5
6LED_PIN = 14                    # GP14, herhangi bir boş GPIO / any free GPIO
7led = Pin(LED_PIN, Pin.OUT)     # pini çıkış yap / set the pin as output
8
9while True:                     # sürekli tekrarla / loop forever
10    led.on()                    # LED'i yak / turn the LED on
11    time.sleep(0.5)             # 0,5 saniye bekle / wait 0.5 s
12    led.off()                   # LED'i söndür / turn the LED off
13    time.sleep(0.5)
14

Частые ошибки и как их исправить

ОшибкаПризнакРешение
Светодиод вставлен наоборотСветодиод вообще не горитДлинная ножка через резистор к пину, короткая к GND; переверни светодиод
Нет резистораСветодиод слишком яркий, греется, может быстро выйти из строяПоставь резистор 220 Ω последовательно со светодиодом
Пин в блоке не совпадает со схемойЗагрузка проходит, но светодиод не горит9 в блоке и D9 в схеме должны совпадать; поменяй либо провод, либо число
Забыт второй блок ожиданияСветодиод кажется постоянно включённымПосле блока «записать LOW» тоже должен быть блок ожидания (delay)
Слишком короткое ожидание (например, 5 мс)Светодиод горит ровно и чуть тусклоПопробуй не меньше 50–100 мс
Обе ножки светодиода в одном ряду макетной платыСветодиод вообще не горитВставь ножки в разные ряды; отверстия одного ряда соединены внутри
Выбрана не та плата или не тот портArduino IDE показывает ошибку загрузкиВыбери нужную плату и порт в меню «Инструменты» (Tools)

Пошагово в приложении: от блоков к плате

  1. Открой в BlueGrays проект Мигание светодиодом: в списке проектов у него есть метка «Блоки». Можно также включить фильтр «Проекты с блоками», чтобы в списке остались только проекты с блоками.
  2. Следуя схеме подключения, установи на макетную плату светодиод, резистор 220 Ω и два провода.
  3. В разделе кода включи переключатель Показать блоками. Вместо кода появятся блоки; нажми на изображение, чтобы открыть его на весь экран.
  4. Перейди на вкладку Разбор блоков. Программа объясняется шаг за шагом, и на каждом шаге видны только его блоки и то, что они делают.
  5. Выключи переключатель, чтобы вернуться к настоящему коду, скопируй его и вставь в Arduino IDE. Блоки не загружаются в плату напрямую: в неё всегда попадает именно этот код.
  6. В Arduino IDE выбери плату Arduino Uno и нужный порт, затем нажми «Загрузка» (Upload). Если IDE ещё не установлена, статья Установка Arduino IDE проведёт тебя по шагам.
  7. Когда светодиод замигает, замени обе строки delay(100) на delay(1000), загрузи код снова и посмотри на разницу своими глазами.

В этой статье светодиод мигает всё время в одном ритме, а программа никак не слушает внешний мир. Следующий шаг — научить плату принимать решения: 3-я часть серии, кнопка и блок «если», рассказывает о программе, которая зажигает светодиод при нажатии кнопки, и о том, как блок «если» превращается в if/else на C++.

В приложении BlueGrays можно посмотреть проекты «Мигание светодиодом», «Два светодиода мигают поочерёдно», «Светофор», «Полицейская мигалка» и проекты со светодиодами для ESP32 и Pico вместе со схемами подключения и кодом, переключиться на блочную версию той же программы через Показать блоками и прочитать, что делает каждый шаг, на вкладке Разбор блоков.

Частые вопросы

Что такое блочный код Arduino?

Это способ показать программу для Arduino не набранным текстом, а блоками, которые соединяются как кусочки пазла. Каждый блок, например «записать HIGH в пин 9» или «ждать 100 мс», соответствует одной строке кода на C++, загружаемого в плату. Без забот о точках с запятой и скобках новички могут сначала сосредоточиться на логике программы.

Как мигать светодиодом с помощью блочного кода?

Помести «настроить пин 9 как OUTPUT» в группу настройки, а «записать HIGH в пин 9», «ждать 100 мс», «записать LOW в пин 9» и «ждать 100 мс» — в группу «повторять всегда». В схеме светодиод подключается к D9 через резистор 220 Ω. Эти блоки превращаются в строки pinMode, digitalWrite и delay.

Почему светодиод горит постоянно, а не мигает?

Самая частая причина — нет блока ожидания после блока «записать LOW». Тогда светодиод выключен лишь микросекунды, и глаз этого не замечает. Если ожидания очень короткие (например, 5 мс), светодиод тоже кажется горящим постоянно; попробуй 100 мс или больше.

Какой резистор нужен для светодиода на Arduino?

Для пинов 5 V на Arduino Uno чаще всего выбирают 220 Ω: через красный светодиод тогда течёт около 14 mA. Подойдёт и 330 Ω, светодиод будет чуть тусклее. Резистор ограничивает ток, к какой бы ножке светодиода он ни был подключён; главное, чтобы он стоял последовательно.

Можно ли загрузить блоки прямо в Arduino?

Нет. Блоки в BlueGrays помогают читать и понимать программу, а в плату всегда загружается настоящий код проекта. Ты копируешь этот код в Arduino IDE (для Pico — в Thonny) и загружаешь его оттуда.

Сколько секунд в 1000 мс и как изменить скорость мигания?

1000 миллисекунд — это 1 секунда. Чем больше число в блоках ожидания, тем медленнее мигает светодиод, чем меньше — тем быстрее: при 100 мс в обоих блоках светодиод мигает 5 раз в секунду, при 500 мс — раз в секунду. В блоках MicroPython для Pico время записывается в секундах, поэтому 0.5 — это полсекунды.

Все проекты
Мигающий светодиод
#1Новичок

Мигающий светодиод

Самое первое «привет» в электронике: включение и выключение одного светодиода. Arduino включает и выключает светодиод через короткие промежутки, поэтому свет быстро мигает. Ты самым простым способом в

4.6(188)
1127
Два попеременно мигающих светодиода
#2Новичок

Два попеременно мигающих светодиода

Два светодиода быстро мигают по очереди: когда один загорается, другой гаснет, будто они перебрасывают друг другу мяч. Arduino держит каждый свет включённым пятую долю секунды, а затем передаёт очеред

4.6(105)
343
Светофор
#3Новичок

Светофор

Крошечная копия светофора, который ты каждый день видишь на дороге. Красный горит две секунды, жёлтый мигает на мгновение, зелёный горит две секунды, затем через жёлтый снова возвращается красный, и т

4.8(131)
397
Полицейская мигалка на светодиодах
#4Новичок

Полицейская мигалка на светодиодах

Как огни на полицейской машине: красный светодиод три раза быстро вспыхивает, затем три раза вспыхивает синий, и узор повторяется без перерыва. Нужны всего два светодиода и два резистора, подключённые

4.7(103)
258
Бегущие огни на светодиодах
#5Средний

Бегущие огни на светодиодах

Огни, которые загораются друг за другом, будто бегут. Arduino зажигает шесть светодиодов по одному; каждый светится короткое мгновение и гаснет, так что свет проходит от начала до конца и начинает сно

4.6(85)
207
Мигающий светодиод на ESP32
#103Новичок

Мигающий светодиод на ESP32

Учит базовой работе с выходами GPIO на ESP32. Эффект мигания получается включением и выключением светодиода с цифрового пина. Это ESP32-версия классического проекта мигания на Arduino UNO; базовые команды мигания в среде Arduino те же, но расположение пинов ESP32 и уровни GPIO 3,3 V отличаются от Arduino UNO.

4.7(37)
99
Светофор на ESP32
#107Новичок

Светофор на ESP32

Реалистичная симуляция светофора на 3 светодиодах — красном, жёлтом и зелёном. Тайминги близки к реальной логике движения: красный долго, жёлтый коротко, зелёный долго. Классический пример последовательного управления GPIO.

4.4(21)
44
Raspberry Pi Pico: управление внешним светодиодом (макетная плата)
#148Новичок

Raspberry Pi Pico: управление внешним светодиодом (макетная плата)

Следующий шаг после встроенного светодиода Pico: подключить внешний светодиод на макетной плате и управлять им через пин GP14. В этом проекте ты узнаешь, как использовать любой пин GPIO общего назначения у Pico как выход, какая полярность у светодиода (длинная ножка = анод/+, короткая = катод/–) и зачем нужен токоограничивающий резистор (220Ω). Без резистора через светодиод пойдёт слишком большой ток, и он может сгореть. Схема очень простая: Pico GP14 → резистор 220Ω → светодиод → GND.

4.5(2)
7