От блоков к Arduino C++: шпаргалка с MicroPython
Шпаргалка для перехода от блочного кода к Arduino C++: 34 строки с блоками, их кодом на C++ и MicroPython, частые ошибки, метод из 4 шагов и одна программа в трёх видах.
Самый быстрый путь от блочного кода к Arduino C++ — держать рядом таблицу на одну страницу, где видно, в какую строку настоящего кода превращается каждый блок. Короткий ответ: блоки — не новый язык, а наглядная форма строк Arduino C++. Блок «настроить пин 13 как OUTPUT» — это строка pinMode(13, OUTPUT);, блок «ждать 1000 мс» — delay(1000);, а блок «если … то» — конструкция if. В таблице ниже рядом стоят настоящие подписи блоков из приложения BlueGrays, их код на Arduino C++ и код на MicroPython для Raspberry Pi Pico.
Эта страница — не урок, а справочный лист. Таблицу можно распечатать, положить у стола и сверяться с ней, глядя на блоки проекта: какая строка соответствует какому блоку. После таблицы идут самые частые ошибки при переходе, метод из четырёх шагов, чтобы оставить блоки позади, и одна и та же программа в виде блоков, на C++ и на MicroPython. Пример компилируется в Arduino IDE и запускается на Pico через Thonny.

Перед чтением таблицы: четыре различия между тремя формами
Блоки, C++ и MicroPython выражают одну и ту же идею, но правила записи у них разные. Именно на этих четырёх различиях спотыкаются чаще всего. Первое — структура: программа на Arduino C++ состоит из двух частей, setup() и loop(), а в блоках они выглядят как «настройка (один раз)» и «повторять всегда». В MicroPython отдельной настройки нет: файл выполняется один раз сверху вниз, а повторяющаяся часть пишется внутри цикла while True:. Второе — типы: в C++ у каждой переменной указан тип (int, float, bool), в блоках это вариант «объявить целое (int)», а в Python тип вообще не пишется.
Третье различие — диапазоны чисел. На Arduino Uno аналоговое чтение даёт 0–1023, а PWM — 0–255; на ESP32 аналоговое чтение доходит до 0–4095; на Pico MicroPython выдаёт и показания, и заполнение PWM в диапазоне 0–65535. Поэтому порог нельзя просто перенести с одной платы на другую. Четвёртое различие — единица времени: delay() принимает миллисекунды, а time.sleep() — секунды. Полсекунды — это delay(500) в C++ и time.sleep(0.5) в MicroPython. Если держать в голове эти четыре правила, большинство строк таблицы встанут на место сами собой.
- Числа в таблице — примеры: там, где в блоке стоит 13, в твоём проекте может быть 7, и число в строке кода меняется вместе с ним.
- Пины в столбце MicroPython — это номера GP на Pico (GP14, GP15, GP26). Они не обязаны совпадать с номерами пинов Uno; сверяйся со схемой.
- Строки с пометкой «Блока для Pico нет» означают, что в проектах на Pico этот блок не используется; код MicroPython, делающий то же самое, всё равно приведён.
- ESP32 тоже программируется на Arduino C++, так что столбец C++ подходит и для неё; отличаются только аналоговый диапазон и некоторые номера пинов.
Таблица соответствия: блоки, Arduino C++ и MicroPython
Таблица разбита на 12 групп: структура программы, пины, время, условия, циклы, переменные, математика, последовательный порт, аналог и PWM, звук, сервопривод и датчик. Текст в столбце «Блок» — это подписи, напечатанные на блоках в приложении, а «…» и «?» обозначают гнездо, куда вставляется другой блок. Если в строке больше одного блока, они разделены точкой.
| Группа | Блок (подпись в приложении) | Arduino C++ | MicroPython (Pico) |
|---|---|---|---|
| Структура | настройка (один раз) | void setup() { … } | Строки перед while True: |
| Структура | повторять всегда | void loop() { … } | while True: (тело с отступом в 4 пробела) |
| Структура | глобальные переменные (в начале) | Начало файла, до setup() | Первые строки после import |
| Структура | функция blinkTwice | void blinkTwice() { … } · вызов: blinkTwice(); | def blinkTwice(): · вызов: blinkTwice() |
| Пины | настроить пин 13 как OUTPUT | pinMode(13, OUTPUT); | led = Pin(15, Pin.OUT) |
| Пины | настроить пин 2 как INPUT_PULLUP | pinMode(2, INPUT_PULLUP); | btn = Pin(14, Pin.IN, Pin.PULL_UP) |
| Пины | записать HIGH в пин 13 · записать LOW в пин 13 | digitalWrite(13, HIGH); · digitalWrite(13, LOW); | led.value(1) · led.value(0) (вкл / выкл) |
| Пины | прочитать пин 2 | digitalRead(2) → HIGH (1) или LOW (0) | btn.value() → 1 или 0 |
| Пины (только Pico) | пин led : GP 14 , OUTPUT · включить (on) / выключить (off) пин led | То же, что pinMode() + digitalWrite() | led = Pin(14, Pin.OUT) · led.on() / led.off() (вкл / выкл) |
| Время | ждать 1000 мс · ждать 0.5 с (Pico) | delay(1000); · delay(500); | time.sleep_ms(1000) (мс) · time.sleep(0.5) (с) |
| Время | ждать 10 мкс | delayMicroseconds(10); | time.sleep_us(10) |
| Время | миллисекунд с запуска | millis() (тип unsigned long) | time.ticks_ms() |
| Условия | если … то … иначе если … иначе … | if (…) { … } else if (…) { … } else { … } | if …: · elif …: · else: |
| Условия | ? = ? (≠, <, ≤, >, ≥) | == != < <= > >= | == != < <= > >= |
| Условия | ? и ? · ? или ? · не ? | && · || · !x | and · or · not x |
| Циклы | повторить 3 раза | for (int i = 0; i < 3; i++) { … } | for i in range(3): |
| Циклы | считать с i от 0 до 5 через 1 | for (i = 0; i <= 5; i++) (5 включительно, 6 проходов) | for i in range(0, 6): (6 не входит) |
| Циклы | повторять, пока | while (…) { … } | while …: |
| Циклы | выйти из цикла | break; | break |
| Переменные | объявить целое (int) delayTime = 60 | int delayTime = 60; | delayTime = 60 (тип не пишется) |
| Переменные | объявить дробное (float) voltage = 0.0 | float voltage = 0.0; | voltage = 0.0 |
| Переменные | установить x в 0 · увеличить x на 1 | x = 0; · x += 1; (или x++;) | x = 0 · x += 1 (x++ не существует) |
| Переменные | массив 2 3 4 · элемент 0 из ledPins | int ledPins[] = {2, 3, 4}; · ledPins[0] | ledPins = [2, 3, 4] · ledPins[0] |
| Математика | 1 + 1 (а также −, ×, ÷) | + - * / · с двумя int 7 / 2 = 3 | + - * / · 7 / 2 = 3.5, целочисленное деление 7 // 2 = 3 |
| Математика | остаток от 10 ÷ 3 | 10 % 3 | 10 % 3 |
| Математика | преобразовать x : 0 – 1023 → 0 – 255 | map(x, 0, 1023, 0, 255) | Готовой нет; пишется функция arduino_map() |
| Математика | ограничить 50 снизу 0 сверху 100 | constrain(50, 0, 100) | min(max(50, 0), 100) |
| Последовательный порт | запустить порт на 9600 бод | Serial.begin(9600); | Не нужно, print() идёт через USB |
| Последовательный порт | вывести в порт … новая строка · без переноса | Serial.println(x); · Serial.print(x); | print(x) · print(x, end="") (без переноса) |
| Аналог и PWM | аналоговое чтение A0 | analogRead(A0) → 0–1023 (на ESP32 0–4095) | ADC(26).read_u16() → 0–65535 |
| Аналог и PWM | записать PWM 128 в пин 9 · PWM led : GP 14 , частота 1000 Hz (Pico) | analogWrite(9, 128); (0–255) | led = PWM(Pin(14)) · led.freq(1000) · led.duty_u16(32768) (заполнение 0–65535) |
| Звук | играть 440 Hz на пине 8 · остановить звук на пине 8 | tone(8, 440); · noTone(8); | Блока для Pico нет: bz = PWM(Pin(16)) · bz.freq(440) · bz.duty_u16(32768) · остановить: bz.duty_u16(0) |
| Сервопривод | подключить серво myServo к пину 9 · повернуть серво myServo на 90 градусов | #include <Servo.h> · Servo myServo; · myServo.attach(9); · myServo.write(90); (поворот на 90°) | Блока для Pico нет: s = PWM(Pin(16)) · s.freq(50) · s.duty_ns(1500000) (примерно 90°) |
| Датчик | длина импульса HIGH на пине 12 (мкс) | pulseIn(12, HIGH) | machine.time_pulse_us(Pin(12, Pin.IN), 1) |
Некоторые строки на первый взгляд выглядят один в один, но требуют внимания. В «считать с i от 0 до 5» число 5 входит в диапазон, и цикл выполняется 6 раз; поэтому в C++ пишут <= вместо <, а в Python нужен range(0, 6), потому что range не включает своё конечное число. Блок деления — тоже ловушка: при делении двух целых чисел C++ отбрасывает дробную часть, и 7 / 2 даёт 3, а Python даёт 3.5. Чтобы получить целочисленное деление, как в C++, в Python используют //. Функция map() за блоком «преобразовать x» в MicroPython не встроена; в примере ниже то же вычисление делает функция arduino_map() из двух строк.
Как вложенные блоки превращаются в код?
Знать отдельные блоки мало; настоящий навык — превращать вложенные блоки в одну строку. Для этого различай две формы. Блоки, которые стоят друг под другом и имеют выступ на краю, — это команды, и каждая из них становится строкой кода. Овальные или заострённые блоки, которые вставляются в гнездо другого блока, — это значения; в коде они стоят внутри скобок, справа от знака равенства или внутри условия. Строки ниже взяты из бесплатного проекта «Настройка частоты зуммера»: четыре кнопки включают и выключают звук, повышают и понижают его частоту, а она удерживается в пределах от 50 до 5000 Hz.
| Блок («Настройка частоты зуммера») | Строка C++ | Правило чтения |
|---|---|---|
| установить state в 1 | state = 1; | Каждый блок-команда, стоящий под другим, — это одна строка, и она заканчивается точкой с запятой. |
| если (прочитать пин btnOn = HIGH) то … | if (digitalRead(btnOn) == HIGH) { … } | Овальный блок-значение попадает внутрь скобок; сравнение = в блоке превращается в коде в ==. |
| установить frequency в (frequency + 50) | frequency = frequency + 50; | Сначала вычисляется внутренний блок, и его результат передаётся внешнему. |
| установить frequency в (ограничить frequency снизу 50 сверху 5000) | frequency = constrain(frequency, 50, 5000); (от 50 до 5000) | Пустые гнёзда блока — это аргументы через запятую в коде. |
| играть frequency Hz на пине buzzerPin | tone(buzzerPin, frequency); | Порядок в коде фиксирован: сначала пин, потом значение. Порядок слов в блоке может меняться от языка к языку. |
| если (state = 1) то … иначе … | if (state == 1) { … } else { … } | Блоки в разъёме «то» идут в первые { }, блоки в разъёме «иначе» — в else { }. |
Пока читаешь эту таблицу, выработай одну привычку: сначала переводи самый внутренний блок, а потом двигайся наружу. В «установить frequency в (ограничить frequency снизу 50 сверху 5000)» самая внутренняя часть — constrain(frequency, 50, 5000), а внешний блок «установить» оборачивает её в frequency = …. Блок-значение не может быть отдельной строкой: если поставить после него точку с запятой и оставить так, компилятор может и не возразить, но результат никуда не сохранится.
Частые ошибки при переходе от блоков к коду
Блочный редактор не даёт совершить большинство этих ошибок: форма деталей не позволяет им встать не на своё место. В коде этой защиты нет, поэтому в первые недели почти все сталкиваются с ошибками ниже. Сообщения об ошибках приходят на английском, но шаблонов у них немного, и после пары встреч их уже узнаёшь.
| Ошибка | Признак | Как правильно |
|---|---|---|
| Нет точки с запятой в конце строки | «expected ';' before …» (ожидается «;» перед …); компилятор часто указывает на строку ниже | Заканчивай каждую команду знаком ;. После строк if, for и while ; не ставится. |
| Не хватает фигурной скобки или есть лишняя | «expected '}' at end of input» (ожидается «}» в конце) или код выполняется не там, где нужно | Каждой { нужна своя }. Ctrl+T («Автоформатирование», Auto Format) в Arduino IDE исправляет отступы, и пропущенную скобку сразу видно. |
| = в условии | if (state = 1) всегда истинно и к тому же записывает в state единицу; в Python — SyntaxError | Сравнение — ==, присваивание — =. Сравнение = в блоке в коде всегда превращается в ==. |
| Дробное значение в int | int volt = 3.7; сохраняет 3; 5 / 2 даёт 2 | Для дробных значений используй float, а при делении запиши одно из чисел как 5.0. |
| Неверное ожидание от digitalRead | if (digitalRead(2) == 5) никогда не срабатывает; с кнопкой на подтяжке логика обратная | digitalRead возвращает только HIGH (1) или LOW (0). С INPUT_PULLUP нажатая кнопка читается как LOW. |
| Путаница с заглавными и строчными буквами | 'digitalwrite' was not declared in this scope (не объявлено в этой области видимости); в Python — NameError | digitalWrite, pinMode и Serial пишутся буква в букву. В Python True и False начинаются с заглавной буквы. |
| Цикл со счётом переведён на один проход короче | Цикл, который в блоках выполняется 6 раз, в коде выполняется 5 раз; последний светодиод так и не загорается | «от 0 до 5» включает конец: в C++ i <= 5, в Python range(0, 6). |
| Сбитые отступы в Python | IndentationError или строка, которая оказалась вне цикла | Начинай каждую строку под while и if с одних и тех же 4 пробелов; не смешивай табуляцию и пробелы. |
| Время в Python принимается за миллисекунды | time.sleep(500) ждёт больше 8 минут | Пиши time.sleep(0.5) или time.sleep_ms(500). |
| Привычки из C++ переносятся в Python | SyntaxError из-за x++, && или ; в конце строки | В Python используются x += 1, and, or; знака конца строки нет. |
Как оставить блоки позади: метод из 4 шагов
Пытаться перейти за один раз утомительно. Четыре шага ниже ведут от чтения к письму маленькими шагами. На каждый шаг хватит одного-двух проектов; к следующему шагу можно переходить, когда текущий получается без взгляда в таблицу.
- Читай параллельно. Открой блоки и код проекта одновременно и пальцем сопоставь каждый блок с его строкой в коде. На этом шаге держи таблицу рядом. Цель: каждую строку кода связать с блоком.
- Спрячь блоки и угадай. Сначала посмотри на блоки, потом выключи блочный вид и, не глядя в код, напиши на бумаге C++ для этих блоков. Затем сравни с настоящим кодом. Попробуй и наоборот: прочитай код и угадай блоки.
- Измени значение в коде. Перенеси код на компьютер и измени всего одно число: увеличь паузу со 100 до 500 или порог с 400 до 600. Загрузи код в плату и посмотри на разницу своими глазами. Если появилась ошибка компиляции, вернись к таблице ошибок выше.
- Напиши новую строку. Добавь строку, которой нет в блоках: Serial.println(), который выводит значение в монитор порта, второй светодиод или if, который работает с кнопкой. Теперь это уже не перевод блоков, а прямое написание кода.
Для каждого шага в серии есть подходящий урок. Для первого шага хорошо начать с таблицы «блок — строка» в статье мигание светодиодом на блоках. Для работы с условиями и циклами на втором и третьем шагах смотри блок «если» и циклы и переменные. Если впереди переход на MicroPython на Pico, в статье от блоков к MicroPython разобрана и установка Thonny. Чтобы растянуть переход на несколько недель в классе, 8-недельный план по робототехнике и программированию даёт готовый порядок.
Блоки и код рядом в приложении BlueGrays
Чаще всего эта таблица пригодится, когда переходишь туда-обратно между блоками и кодом настоящего проекта. В приложении BlueGrays блочный вид есть у более чем 100 проектов; в более чем 30 бесплатных проектах блоки тоже открыты, а в проектах Premium блоки открываются с Premium. Блоки нужны для чтения: в приложении их нельзя редактировать, и в плату они не загружаются. В плату всегда идёт настоящий код; его берут кнопкой Копировать или Копировать ссылку, чтобы открыть на компьютере, и вставляют в Arduino IDE, а для Pico — в Thonny.
- Показать блоками: включи этот переключатель рядом с исходным кодом на странице проекта, и та же программа появится в виде картинки из блоков на языке приложения. Нажми на картинку, чтобы открыть её на весь экран; выключая и включая переключатель, как раз и отрабатываешь первый и второй шаги.
- Разбор блоков: при включённом блочном виде вкладка «Разбор кода» получает это название. Программа делится на шаги, у каждого — своя часть и пояснение. Задание «Твоя очередь» в конце — готовое упражнение для четвёртого шага.
- Справочник по коду: каждая из 36 карточек в разделе «Учёба» (18 по Arduino C++, 18 по MicroPython) показывает свой пример тремя способами на вкладках Блоки, Arduino и MicroPython. Если нужна какая-то строка таблицы подробнее, открой соответствующую карточку.
- Проекты с блоками: этот вариант в «Фильтре» в разделе «Обзор › Проекты» показывает только проекты с блочным видом, и выбрать проект для перехода становится проще.
Как устроен справочник по коду, мы рассказали в статье о справочнике по коду, а разделы «Разбор кода» и «Твоя очередь» — в руководстве по разбору кода. Если нужно объяснение каждой команды по отдельности, рядом с этой таблицей хорошо работает список команд Arduino.
Одна программа в трёх видах: ночник, который тускнеет при свете
Чтобы увидеть таблицу в деле, соберём небольшую программу. LDR измеряет освещённость; пока в комнате светло, светодиод выключен, а по мере того как темнеет, он постепенно разгорается. Программа использует блоки переменной, аналогового чтения, условия, преобразования, PWM, последовательного порта и ожидания, так что больше половины таблицы встречается в одном примере. Идея основана на бесплатном проекте «Ночник на LDR»; там светодиод просто включается или выключается, а здесь PWM делает его тусклее. Подключение LDR можно посмотреть и на схеме проекта «Измерение освещённости с LDR».
| Подключение | Arduino Uno | Raspberry Pi Pico |
|---|---|---|
| Ножка 1 LDR | 5V | 3V3(OUT), физический пин 36 |
| Ножка 2 LDR + один конец резистора 10 kΩ (средняя точка) | A0 | GP26 / ADC0, физический пин 31 |
| Другой конец резистора 10 kΩ | GND | GND, физический пин 38 |
| Длинная ножка светодиода (через резистор 220 Ω) | D9 (PWM-пин) | GP15, физический пин 20 |
| Короткая ножка светодиода | GND | GND, физический пин 18 |
| Показание освещённости / диапазон PWM | 0–1023 / 0–255 | 0–65535 / 0–65535 |
Сначала блочная версия. С подписями из приложения программа состоит из блоков ниже; каждый пункт соответствует одной или нескольким строкам кода C++, который идёт следом:
- глобальные переменные (в начале): объявить целое (int) lightValue = 0 и объявить целое (int) brightness = 0
- настройка (один раз): запустить порт на 9600 бод, затем настроить пин 9 как OUTPUT
- повторять всегда: установить lightValue в (аналоговое чтение A0)
- если (lightValue < 400) то: установить brightness в (преобразовать lightValue : 0 – 400 → 255 – 0); иначе: установить brightness в 0
- записать PWM brightness в пин 9
- вывести в порт «Light: » без переноса, вывести в порт lightValue без переноса, вывести в порт « PWM: » без переноса, вывести в порт brightness новая строка
- ждать 200 мс
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// Işığa göre kısılan gece lambası / Dimming night light
4// ─────────────────────────────────────────
5
6int lightValue = 0; // LDR okuması / LDR reading (0-1023)
7int brightness = 0; // LED parlaklığı / LED brightness (0-255)
8
9void setup() {
10 Serial.begin(9600); // Seri port 9600 baud / Serial at 9600 baud
11 pinMode(9, OUTPUT); // LED, PWM pini D9 / LED on PWM pin D9
12}
13
14void loop() {
15 lightValue = analogRead(A0); // Az ışık = küçük değer / Little light = small value
16
17 if (lightValue < 400) {
18 // Karanlık arttıkça LED parlar / The darker it gets, the brighter the LED
19 brightness = map(lightValue, 0, 400, 255, 0);
20 } else {
21 brightness = 0; // Oda aydınlık, LED kapalı / Room is bright, LED off
22 }
23
24 analogWrite(9, brightness); // PWM 0-255 / PWM 0-255
25
26 Serial.print("Light: ");
27 Serial.print(lightValue);
28 Serial.print(" PWM: ");
29 Serial.println(brightness);
30
31 delay(200); // 0,2 sn bekle / Wait 0.2 s
32}
331# ─────────────────────────────────────────
2# BlueGrays · bluegrays.com
3# Işığa göre kısılan gece lambası / Dimming night light
4# ─────────────────────────────────────────
5from machine import Pin, ADC, PWM
6import time
7
8ldr = ADC(26) # GP26 = ADC0 / GP26 = ADC0
9led = PWM(Pin(15)) # LED, GP15 / LED on GP15
10led.freq(1000) # PWM frekansı 1000 Hz / PWM frequency 1000 Hz
11
12THRESHOLD = 25600 # Uno'daki 400'ün karşılığı / Same as 400 on the Uno
13
14
15def arduino_map(x, in_min, in_max, out_min, out_max):
16 # Arduino map() ile aynı hesap / Same math as Arduino map()
17 return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
18
19
20while True:
21 light_value = ldr.read_u16() # 0-65535 / 0-65535
22
23 if light_value < THRESHOLD:
24 # Karanlık arttıkça LED parlar / The darker it gets, the brighter the LED
25 brightness = arduino_map(light_value, 0, THRESHOLD, 65535, 0)
26 else:
27 brightness = 0 # Oda aydınlık, LED kapalı / Room is bright, LED off
28
29 led.duty_u16(brightness) # PWM 0-65535 / PWM 0-65535
30
31 print("Light:", light_value, " PWM:", brightness)
32
33 time.sleep(0.2) # 0,2 sn bekle / Wait 0.2 s
34Сравни две программы построчно, и все различия из таблицы станут видны. setup() из C++ в Python превращается в строки перед while True, а Serial.begin() исчезает. Вместо analogRead(A0) появляется ADC(26).read_u16(), и диапазон растёт с 0–1023 до 0–65535; поэтому порог равен 25600, а не 400. Вместо analogWrite(9, …) сначала создаётся объект PWM, и яркость задаётся через duty_u16() от 0 до 65535. Поскольку map() не встроена, пишется функция arduino_map(); целочисленное деление // внутри неё соответствует целочисленному делению в C++. Один print() заменяет четыре отдельных вызова Serial.print(), а delay(200) превращается в time.sleep(0.2).
Переход от блочного кода к Arduino C++ — это не столько заучивание нового, сколько узнавание письменной формы уже знакомых блоков. Держи эту таблицу рядом, в каждом проекте сначала читай блоки и код параллельно, а потом спрячь блоки и напиши код без подсказок. Чтобы увидеть эти строки в настоящих проектах, открой в приложении BlueGrays проект с блочным видом и переключайся между двумя формами одной программы с помощью Показать блоками.
Частые вопросы
Что изучать после блочного кода: C++ или Python?
Выбирай по плате, которая есть под рукой. Большинство проектов для Arduino Uno и ESP32 пишутся на Arduino C++, а на Raspberry Pi Pico распространён MicroPython. Логика блоков в обоих одинакова, поэтому после одного языка перейти на другой гораздо быстрее.
Сколько времени занимает переход от блочного кода к коду Arduino?
У всех по-разному, но при работе над несколькими проектами в неделю обычно уже через несколько недель получается читать короткие программы и вносить небольшие изменения. Переход становится проще, если сначала читать код рядом с блоками, потом менять одно значение и лишь в конце добавлять новые строки.
Можно ли программировать Arduino Uno на Python?
Arduino Uno не может запускать MicroPython; её программируют на C++ в Arduino IDE. Для MicroPython нужна более мощная плата, например Raspberry Pi Pico. Зато можно отправлять команды на Uno через последовательный порт из программы на Python, запущенной на компьютере.
Можно ли редактировать блоки в BlueGrays и загружать их в плату?
Нет. Блоки в BlueGrays нужны, чтобы читать и понимать код; в приложении их нельзя редактировать, и в плату они не загружаются. В плату всегда загружается настоящий код проекта через Arduino IDE или Thonny.
Программа из блоков — это настоящий код?
Блоки — наглядная форма настоящего кода; каждый блок соответствует одной или нескольким строкам кода. В проектах BlueGrays с блочным видом блоки и загружаемый код на Arduino C++ или MicroPython описывают одну и ту же программу.
Почему digitalRead возвращает 1 или 0 и HIGH — это то же самое, что 1?
Да, в Arduino HIGH равно 1, а LOW равно 0, и digitalRead возвращает только одно из этих двух значений. Кнопка, подключённая с INPUT_PULLUP, читается как LOW, пока нажата, и как HIGH, когда отпущена. В MicroPython pin.value() тоже даёт 1 или 0.
Что собрать после прочтения
Все проекты
Настройка частоты зуммера
Ты управляешь звуком зуммера четырьмя кнопками: одна включает звук, другая выключает, а две оставшиеся делают его выше или ниже. Удерживай кнопку вверх или вниз, и высота звука меняется шаг за шагом,

Ночник на LDR
Маленький ночник, который сам включается, когда темнеет, и гаснет, когда наступает утро. Датчик освещённости измеряет, насколько светло в комнате, и Arduino включает светодиод, когда достаточно темно,

Измерение освещённости с LDR
Хочешь увидеть яркость своей комнаты в виде числа? LDR — маленькая деталь, реагирующая на свет, — измеряет освещённость вокруг, а Arduino каждые полсекунды выводит значение на экран компьютера. Закрой

Управление светодиодом кнопкой (удержание)
Как дверной звонок: свет горит, пока ты нажимаешь, и гаснет, когда отпускаешь. Arduino всё время слушает кнопку; пока она нажата, светодиод горит, а как только ты убираешь палец, он гаснет. Эта просте

Включение и выключение светодиода кнопкой (вкл/выкл)
Нажми кнопку один раз — свет загорится, нажми ещё раз — погаснет, совсем как выключатель в твоей комнате. Arduino замечает каждое нажатие и переводит светодиод в противоположное состояние, выжидая кор

Бегущие огни с регулируемой скоростью
Шесть светодиодов загораются друг за другом, и кажется, что свет бежит от одного края к другому. Поверни ручку потенциометра, и скорость этого бега сразу меняется: в одну сторону свет мчится, в другую

Измерение расстояния HC-SR04 (вывод в порт)
Датчик HC-SR04 работает совсем как летучая мышь, которая находит дорогу в темноте: он посылает звук, которого ты не слышишь, слушает эхо и измеряет, насколько далеко предмет перед ним. Arduino каждые

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

