Справочник

Программирование Arduino: на каком языке, в какой среде и с чего начать

Короткий ответ: программы для Arduino пишут на C++. Отдельного «языка Arduino» не существует — есть обычный компилятор C++ и большая библиотека готовых функций, из-за которой код выглядит проще, чем «взрослый» C++. Ниже разберём это по шагам и покажем, что среда делает с вашим файлом перед сборкой.

Язык

На каком языке программируют Arduino

Файл скетча .ino перед компиляцией превращается в обычный файл C++, и дальше его собирает обычный компилятор из семейства GCC. Ключевые слова, циклы, функции, классы — всё из C++. А digitalWrite(), pinMode(), delay(), даже сами setup() и loop() — не части языка, а функции из библиотеки ядра Arduino. Их исходники лежат в открытом виде: например, digitalWrite написан на чистом C в файле cores/arduino/wiring_digital.c.

Отсюда важный вывод для тех, кто учится: любой учебник по C++ вам подходит. Просто помните, что версия языка на плате зависит от того, какая плата выбрана:

ПлатаСтандарт языкаКомпиляторОсобенности
Arduino Uno, Nano, Mega (AVR)C++11 (gnu++11)avr-g++ 7.3.0исключения и STL выключены, оптимизация по размеру
ESP8266 (NodeMCU, D1 mini)C++17 (gnu++17)xtensa-lx106-elf-g++ 10.3.0STL работает, есть переключатель исключений

Ответ на частый вопрос «Arduino — это C или C++?»: и то и другое. Само ядро написано смесью — часть файлов на C, часть на C++, а ваш скетч всегда собирается как C++.

Доказательство

Что среда делает с вашим файлом

Проще всего убедиться в том, что скетч — это C++, попросив среду показать промежуточный результат. Возьмём скетч, где функция migni() вызывается выше, чем описана — в обычном C++ так нельзя:

void setup() {
  pinMode(13, OUTPUT);
  migni(3);              // вызываем функцию, описанную НИЖЕ по тексту
}

void loop() {
}

void migni(int razy) {
  for (int i = 0; i < razy; i++) {
    digitalWrite(13, HIGH);
    delay(200);
    digitalWrite(13, LOW);
    delay(200);
  }
}

Скетч собирается (930 байт на Uno). Вот что среда отдаёт компилятору на самом деле — первые строки промежуточного файла:

#include <Arduino.h>            ← добавлено средой
#line 1 "...\demo_ino.ino"
#line 1 "...\demo_ino.ino"
void setup();                  ← объявления всех ваших функций
#line 6 "...\demo_ino.ino"      придуманы автоматически, а #line
void loop();                      возвращает нумерацию строк
#line 9 "...\demo_ino.ino"      к исходному скетчу
void migni(int razy);
#line 1 "...\demo_ino.ino"
void setup() {                 ← и только теперь ваш текст

Три вещи, которых вы не писали: подключение Arduino.h, объявления всех ваших функций и директивы #line — они нужны, чтобы компилятор ругался на номера строк вашего скетча, а не промежуточного файла.

Практическое следствие: удобство «вызывай функции в любом порядке» работает только в файлах .ino. Как только вы вынесете код в собственный .cpp, тот же текст перестанет собираться с ошибкой was not declared in this scope — там объявления придётся писать руками.

ВАШ ФАЙЛ .inoобычный текст,который вы написалиПРЕПРОЦЕССОРдописал Arduino.h,прототипы и #lineavr-g++ 7.3.0обычный компиляторC++, стандарт gnu++11КОМПОНОВКА С ЯДРОМmain.cpp, wiring_digital.c и остальное,что скрывается за словом ArduinoПРОШИВКА .hexто, что уезжает в платуи живёт там без компьютераПустой скетч на Arduino Uno превращается в 444 байта прошивки — это цена работы самого ядра.
Никакого «языка Arduino» на этом пути нет: есть обычный компилятор C++ и библиотека ядра, которую к вашему коду подшивает компоновщик.

Границы

Что из C++ работает на Arduino Uno

C++ на микроконтроллере урезан не по прихоти: в 32 килобайта флеша и 2 килобайта ОЗУ не помещается «тяжёлый» рантайм. Мы проверили каждую строку сборкой и приводим точные сообщения компилятора — по ним удобно искать причину, если наткнётесь.

Возможность C++На UnoЧто говорит компилятор
Переменные, условия, циклы, функции, классыРаботаетЭто обычный C++: всё, чему учат в школе и вузе, применимо
new и delete (динамическая память)РаботаетСкетч собрался и занял 1084 байта. Другой вопрос, что кучи всего 2 КБ
try / catch (исключения)Нетerror: exception handling disabled, use -fexceptions to enable
#include <iostream>, coutНетfatal error: iostream: No such file or directory — вывод идёт через Serial
std::vector и остальная STLНет на Unofatal error: vector: No such file or directory. На ESP8266 тот же скетч собирается
dynamic_cast, typeidНетerror: 'dynamic_cast' not permitted with -fno-rtti

Ещё одна особенность, о которой не пишут: Arduino собирает скетчи с выключенными предупреждениями компилятора (флаг -w) и с послаблением -fpermissive. Среда становится дружелюбнее к новичку, но часть настоящих ошибок вы просто не увидите — например, забытый return в функции. Если хотите строгости, включите предупреждения в настройках среды.

Инструмент

Где писать код

Нужны две вещи: редактор, который умеет собирать скетчи и заливать их в плату, и драйвер USB-моста, чтобы компьютер увидел плату. Вариантов немного:

  • Trema IDE — наша среда: русский интерфейс, ошибки объясняются по-человечески, 81 пример с русскими комментариями внутри, пакеты плат и библиотеки качаются с российских серверов без VPN.
  • Arduino IDE — оригинальная среда. Работает, но интерфейс английский, а менеджер плат в России регулярно упирается в ошибку 403. Различия версий 1.8 и 2.x разобраны отдельно.
  • Онлайн-редакторы — соблазнительны, потому что ничего не надо ставить, но заливка в плату из браузера требует отдельного агента, а сервисы Arduino из России открываются не всегда.

Язык при этом везде один и тот же: скетч, написанный в одной среде, собирается в любой другой. Разница — в удобстве, а не в коде.

С чего начать

Минимум, которого хватит на первый месяц

Учить весь C++ перед первым светодиодом не нужно. Достаточно четырёх тем — дальше знания добираются по ходу проектов:

  • Переменные и типы. Числа, буквы, признаки «да/нет». На Uno важно помнить, что int хранит только −32768…32767. Справочник по типам.
  • Две обязательные функции. setup() выполняется один раз, loop() — по кругу. Всё остальное вы вызываете из них. Разбор setup() и loop().
  • Пауза, которая не мешает. delay() останавливает всю плату. Как только дел становится два, нужен millis(). millis() вместо delay().
  • Готовый код под задачу. 81 пример внутри программы, 39 уроков и каталог по железу — не пишите с нуля то, что уже написано. Каталог скетчей.

Практический маршрут: соберите первую программу (мигание светодиодом), потом пройдите бесплатный курс из 39 уроков — он идёт от кнопки и резистора до игровой приставки, и в каждом уроке есть готовая схема и разобранный код.

Другие платы

Программирование Uno, Nano, ESP32 и остальных

Хорошая новость для тех, кто ищет «программирование Arduino Nano» или «как программировать ESP32»: язык и среда те же самые. Меняется одно — выбранная плата перед сборкой. Для Uno и Nano даже код обычно совпадает: внутри один и тот же микроконтроллер ATmega328P.

Для ESP32, ESP8266, STM32 и Raspberry Pi Pico сначала нужно поставить пакет поддержки платы. У нас он приходит с российского зеркала packages.trema.ru — без VPN и без ошибки 403. Разбор по платам: сравнение плат, ESP32, ESP8266, Nano.

Что действительно меняется от платы к плате — размеры типов данных (на Uno int занимает 2 байта, на ESP8266 — 4) и номера выводов. Именно поэтому скетч с ESP, перенесённый на Uno, иногда начинает врать без единой ошибки при сборке.

Честный ответ

Можно ли программировать Arduino без кода

Да, существуют визуальные среды, где программа собирается из блоков, и они действительно помогают на первом занятии в начальной школе. Но у блоков есть потолок: как только проект выходит за пределы готовых кубиков, приходится переходить на текст. Наш опыт с курсами: ребёнок 10–12 лет спокойно пишет обычный скетч, если комментарии в примерах на русском языке.

Отдельно про нейросети: они неплохо пишут короткие скетчи, но регулярно выдумывают функции библиотек, которых нет, и путают номера выводов у разных плат. Полученный код всё равно нужно уметь прочитать — иначе вы не сможете понять, почему он не собирается. Разбор сообщений об ошибках у нас собран на отдельной странице.

Вопросы

Частые вопросы о программировании Arduino

На каком языке программируют Arduino?

На C++. Файл скетча перед компиляцией автоматически превращается в обычный файл C++, и дальше его собирает компилятор GCC. Отдельного «языка Arduino» не существует: pinMode, digitalWrite и даже setup с loop — это функции библиотеки ядра, а не ключевые слова языка.

Arduino — это C или C++?

Ваш скетч всегда собирается как C++. Само ядро Arduino написано смесью: часть файлов на C, часть на C++. Поэтому в скетче спокойно работают и функции в стиле C, и классы с объектами — например, объект Serial.

Какая версия C++ используется в Arduino?

Зависит от платы. Для Arduino Uno, Nano и Mega задан стандарт C++11 и компилятор avr-g++ 7.3.0. Для ESP8266 — уже C++17 и компилятор GCC 10.3.0, поэтому там работает стандартная библиотека шаблонов, которой на Uno просто нет.

Нужно ли знать C++, чтобы начать?

Нет. Для первых проектов хватает четырёх тем: переменные, условия, циклы и функции. Всё остальное добирается по ходу дела. Начните с мигания светодиодом и курса из 39 уроков — код там разобран по строкам.

Почему в Arduino не работает try/catch и iostream?

Для AVR-плат исключения выключены флагом компилятора, а стандартной библиотеки C++ в наборе инструментов просто нет: на Uno всего 32 КБ флеша и 2 КБ ОЗУ, тяжёлый рантайм туда не помещается. Вывод текста идёт через объект Serial, а не через cout.

Как программировать ESP32 или ESP8266 в той же среде?

Язык и среда те же — меняется только выбранная плата и установленный пакет её поддержки. В Trema IDE пакеты приходят с российского зеркала packages.trema.ru, без VPN и без ошибки 403 в менеджере плат.

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

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

Сколько нужно выучить, чтобы начать писать свой код?

Четырёх тем хватает на первый месяц: переменные и типы, ветвления, циклы и свои функции. Дальше добавляются millis() вместо delay() и работа с библиотеками. Готовый код по задачам собран на странице «Скетчи Arduino» — его удобно брать за основу и переделывать под себя.

Начните с первой программы

Trema IDE ставится в пару кликов, говорит по-русски и объясняет ошибки словами. Дальше по теме: готовые скетчи, справочник по языку, уроки с нуля.