Справочник

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

Скетч — это программа для платы Arduino. У неё одно жёсткое правило, о котором молчат учебники: скетч это папка, а не файл, и главный файл .ino обязан называться так же, как папка. Ниже — разбор правила, самый первый рабочий скетч целиком, путеводитель по готовому коду для двенадцати типовых задач и ответы на вопросы про .ino, .pde и два скетча в одной папке.

Определение

Что такое скетч

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

Файл скетча имеет расширение .ino. Это обычный текстовый файл: его можно открыть Блокнотом и прочитать. А вот сохранять из Блокнота опасно — он меняет кодировку, и русские строки в мониторе порта превращаются в кракозябры, хотя код внешне тот же.

В любом скетче есть две обязательные функции: setup() выполняется один раз при включении, а loop() — по кругу. Вот самый первый рабочий скетч целиком — мигание встроенным светодиодом. Мы его собрали: на Arduino Uno он занимает 924 байта из 32 256.

void setup() {
  // Настраиваем вывод со встроенным светодиодом на выход.
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // подали напряжение — светодиод горит
  delay(500);                       // ждём полсекунды
  digitalWrite(LED_BUILTIN, LOW);   // сняли напряжение — светодиод погас
  delay(500);                       // и снова ждём полсекунды
}

Подробный разбор с исходником ядра — в статье «void setup() и void loop()». А чем скетч отличается от прошивки, просто: скетч — это исходный текст, который пишете вы; прошивка — файл .hex, который получается после сборки и уезжает в плату.

Главное правило

Скетч — это папка, а не файл

Официальная спецификация Arduino формулирует это прямо: скетчем считается папка, и в ней обязан лежать файл .ino с тем же именем. Скачали один .ino из интернета и положили в «Загрузки» — среда его не откроет.

moy-sketchblink.inoНЕТСреда даже не дойдёт до компилятора:«в скетче отсутствует основной файл»moy-sketchmoy-sketch.inoutils.ino — вторая вкладкаДАИмя файла совпало с именем папки —скетч открывается и собирается
Главный файл обязан называться так же, как папка. Остальные файлы в папке могут называться как угодно — они станут дополнительными вкладками скетча.

Ошибка при нарушении правила выглядит так (это реальный вывод нашей сборки, arduino-cli 1.5.2 с ядром arduino:avr 1.8.8):

Не удается открыть скетч: в скетче отсутствует основной файл: C:\...\moy-sketch\moy-sketch.ino

В англоязычной среде та же строка выглядит как Can't open sketch: main file missing from sketch: ….

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

Как назвать скетч

Символы в имениВердиктЧто важно знать
Латинские буквы и цифрыМожноОбычный случай: blink_test, Meteo2
Цифра первым символомМожноРазрешено начиная с Arduino IDE 1.8.4; в старых версиях — нет
Дефис, точка, подчёркиваниеМожноНо первым символом может быть только буква, цифра или подчёркивание, а точкой имя не может и заканчиваться
ПробелЛучше не надоСборка пройдёт, но пробел уедет в имя файла прошивки — дальше его получают внешние утилиты
Русские буквыЛучше не надоArduino IDE заменит их подчёркиваниями, Trema IDE переведёт в латиницу: «Метеостанция» → Meteostantsiya
Длиннее 63 символовЛучше не надоСоздать или переименовать скетч с таким именем среда не даст, а уже готовую папку соберёт молча
Имена CON, PRN, COM1…НельзяЗапрет Windows, а не Arduino: такие имена заняты системой

Живой миф: «Arduino не даст назвать скетч с пробелом». Даст. Запрет работает при создании скетча, а сборка такие имена молча проглатывает — мы проверили. Проблема всплывает позже: пробел и кириллица попадают прямо в имя файла прошивки, а его дальше получают внешние программы загрузки.

Каталог

Где взять готовый код: двенадцать задач

Готовый код у нас лежит в трёх местах: 39 уроков курса (там код разобран по строчкам со схемой сборки), справочные страницы и статьи базы знаний, и 81 пример прямо внутри Trema IDE — с русскими комментариями, открываются через меню «Файл → Примеры». Найдите свою задачу:

ЗадачаГотовый код и разборПример внутри программы
Мигание и светодиодыПервая программа: мигаем светодиодом · Урок: светодиод и резистор · Урок: бегущий огонёк из пяти светодиодов · Урок: настоящий светофор · Урок: плавная яркость и живая свеча · Урок: трёхцветный светодиодBlink, Fade, Fading, BlinkWithoutDelay
Кнопки, дребезг, прерыванияУрок: кнопка — свет горит, пока держишь · Урок: кнопка-выключатель и дребезг · Урок: пульт из трёх кнопок · Урок: мгновенные события — прерыванияButton, Debounce, DigitalInputPullup, StateChangeDetection, ButtonGestures, PinButtonTester
Датчики: свет, температура, движение, расстояниеДатчики для Arduino: таблица 22 датчиков · DHT11 и DHT22: температура и влажность · HC-SR04: ультразвуковой дальномер · DS18B20: термометр для воды и улицы · Урок: потенциометр · Урок: датчик света — ночник включается самAnalogReadSerial, AnalogInput, Calibration, Smoothing, MedianFilter, SignalStats, Hysteresis
Экраны и индикаторыLCD 1602 по I2C: 5 готовых скетчей · OLED SSD1306: 6 скетчей на четырёх библиотеках · Урок: экран LCD — выводим текст и цифры · Урок: семисегментный индикаторI2C_Scanner (найти адрес экрана)
Моторы и движениеУрок: сервопривод двигает предметы · Урок: мотор и транзистор — вентилятор · Проект: шлагбаум · Модули: драйверы моторов и шилдыServoTester (проверка сервопривода без библиотек)
Звук: сигналы и мелодииУрок: зуммер — сигналы и мелодии · Урок: пианино из света · Проект: игра на скорость реакцииtoneMelody, toneKeyboard, toneMultiple, tonePitchFollower
Разговор с компьютером: монитор портаМонитор порта Arduino: гид · Урок: программа разговаривает с вами · Урок: пульт из клавиатуры · Отладка печатью: первый метод инженераSerialEcho, SerialCommandControl, MenuInMonitor, PlotterDemoSignals
Wi-Fi: ESP8266 и ESP32ESP8266, NodeMCU и Wemos D1 mini: 3 скетча · ESP32 и Arduino: сканер сетей · ESP32: платы с Wi-Fiпримеры ядра ESP появятся после установки платы
Память: EEPROM и как влезть в 2 КБПамять Arduino: 8 приёмов экономии · Урок: вечная память EEPROM · Типы данных: сколько стоит каждыйRememberSetting (настройка переживает выключение)
Время без delay(): несколько дел сразуmillis() вместо delay(): готовые скетчи · Проект: часы-будильник · Проект: игра «Повтори за мной»BlinkWithoutDelay, MultiTasking, DoAfterDelay, BlinkNTimes, SmoothApproach
Незнакомый модуль: как его завестиМодули для Arduino: подписи контактов и щуп · Библиотеки: найти по файлу .h и установить · Сканер шины I2C (готовый код)I2C_Scanner, PinSnapshot, SupplyVoltage
Готовые проекты целикомПроект: умный ночник · Проект: домашняя метеостанция · Проект: сейф с цифровым кодом · Проект: игровая приставка · Свой проект: от идеи до устройства

Чего в списке нет — честно: готового разобранного кода для шаговых моторов, RFID, радиомодулей nRF24 и SD-карт у нас пока нет, только обзорные строки в таблице модулей. Пишем по очереди, по спросу.

Внутри программы

81 пример с русскими комментариями

Штатные примеры Arduino снабжены английскими комментариями — для школьника это стена текста. Мы перевели их все и добавили свой раздел «Полезное»: там лежат заготовки, которые обычно ищут по форумам.

РазделПримеровО чём
01. Основы6Blink, чтение аналогового входа, пустой каркас скетча
02. Цифровые сигналы9кнопки, дребезг, мигание без delay, мелодии на зуммере
03. Аналоговые сигналы6потенциометр, ШИМ, калибровка, сглаживание показаний
04. Обмен данными12монитор порта, команды с компьютера, график, MIDI
05. Управление программой6массивы, циклы, условия — школьная алгоритмика на плате
06. Работа со строками14разбор текста, склейка, поиск, сравнение
07. USB: клавиатура и мышь7только для Leonardo, Micro и Pro Micro — на Uno не соберутся
08. Программатор1прошивка одной платы другой платой
09. Полезное20наши заготовки: сканер I2C, тестер кнопок, фильтр помех, многозадачность

В разделе «09. Полезное» 20 заготовок. Самые ходовые: I2C_Scanner — находит адрес незнакомого модуля; MultiTasking — несколько дел без delay(); MedianFilter — убирает «иглы» из показаний датчика; ButtonGestures — клик, двойной клик и удержание на одной кнопке; ResetReason — почему плата перезагрузилась; SupplyVoltage — плата измеряет собственное питание без единого датчика. Описание разделов — в базе знаний.

Несколько файлов

Два скетча в одной папке и вкладки

Положить рядом два готовых скетча кажется безобидным, но сборка падает с загадочным сообщением:

vtoroy.ino:1:6: error: redefinition of 'void setup()'
sketch.ino:1:6: note: 'void setup()' previously defined here
Ошибка во время сборки: exit status 1

Причина в том, что перед компиляцией среда склеивает все файлы .ino из папки в один: сначала главный, потом остальные по алфавиту. Две функции setup() в одном файле — это ошибка. Держите скетчи в разных папках.

Обратная сторона того же правила полезна: второй файл .ino без setup() и loop() работает как вкладка — функции из него видны в главном файле без всякого #include. Так большой скетч разбивают на части. Подробности — в статье «Вкладки и несколько файлов».

Если раскладываете код по собственным файлам .h и .cpp, помните о трёх отличиях: заголовок сам не подключается — нужен #include "mylib.h"; в своём .cpp не будет ни pinMode, ни digitalWrite, пока не написан #include <Arduino.h>; и прототипы функций там придётся писать руками — автоматика работает только для .ino. Ещё одна тонкость: рекурсивно компилируется только подпапка с именем src, любая другая будет проигнорирована.

Старые файлы

Что делать со скетчем .pde

До версии Arduino 1.0 скетчи сохранялись с расширением .pde. Такие файлы до сих пор собираются, но среда честно предупреждает:

Скетчи с расширением .pde устарели, пожалуйста, переименуйте следующие файлы в .ino

Просто переименуйте файл, сохранив правило «имя файла = имя папки». Чего делать нельзя — оставлять рядом старый .pde и новый .ino с одинаковым именем: тогда сборка падает совсем.

На диске

Где лежат ваши скетчи

Arduino IDE хранит скетчи в «скетчбуке»: на Windows это C:\Users\Имя\Documents\Arduino, на macOS — /Users/Имя/Documents/Arduino, на Linux — /home/Имя/Arduino. Папку можно сменить в настройках, а хранить скетчи именно там необязательно — это просто место, содержимое которого попадает в меню «Файл → Папка со скетчами».

Trema IDE держит проекты отдельно, в папке Документы\TremaProjects, а в школьном режиме — в подпапке класса и ученика. Русское имя проекта она не выбрасывает, а переводит в латиницу: «Метеостанция» станет Meteostantsiya, «Умный дом 2» — Umnyy-dom-2. Правило Arduino при этом соблюдается: файл .ino создаётся с именем папки.

Если что-то пошло не так

Скетч не собирается или не заливается

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

И частый вопрос про платы: скетч для Nano обычно работает на Uno без единой правки — у них один и тот же микроконтроллер ATmega328P. Меняется только выбор платы перед сборкой. А вот на ESP8266 или ESP32 тот же код может потребовать переделки: другие номера выводов и другая логика 3,3 В. Сравнение плат — на отдельной странице.

Вопросы

Частые вопросы о скетчах

Что такое скетч в Arduino?

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

Каким расширением сохраняется скетч?

.ino — это текущий формат, начиная с Arduino 1.0. Старое расширение .pde ещё собирается, но среда предупреждает, что оно устарело, и просит переименовать файл. Держать в одной папке .pde и .ino с одинаковым именем нельзя — сборка упадёт.

Почему пишет «в скетче отсутствует основной файл»?

Имя файла .ino не совпадает с именем папки. Это правило спецификации Arduino: папка my_project должна содержать файл my_project.ino. Ошибка приходит ещё до компилятора, поэтому искать её в коде бесполезно — переименуйте файл или создайте папку с нужным именем.

Чем скетч отличается от прошивки?

Скетч — это исходный текст, который пишете вы и который можно прочитать и изменить. Прошивка — файл .hex, который получается из скетча после сборки и заливается в микроконтроллер. Обратно из прошивки скетч не восстанавливается.

Можно ли держать два скетча в одной папке?

Нет. Все файлы .ino из папки склеиваются в один, поэтому две функции setup() дают ошибку redefinition of 'void setup()'. А вот второй файл .ino без setup() и loop() — это законная вкладка: функции из него видны в главном файле без всякого #include.

Где взять готовые скетчи для Arduino?

У нас три источника: 39 уроков курса с разобранным кодом и схемами, справочные страницы по железу (экраны, датчики, ESP) и 81 пример внутри Trema IDE с русскими комментариями — меню «Файл → Примеры». Каталог по задачам собран на этой странице.

Где мои скетчи лежат на диске?

Arduino IDE по умолчанию хранит их в папке Документы\Arduino (на Linux — в домашней папке Arduino), путь меняется в настройках. Trema IDE держит проекты в папке Документы\TremaProjects, а в школьном режиме — в подпапке класса и ученика.

Скетч для Arduino Nano подойдёт для Uno?

Как правило да: у Uno и Nano один и тот же микроконтроллер ATmega328P и одинаковые номера выводов. Достаточно выбрать другую плату перед сборкой. С ESP8266, ESP32 или Pico так не выйдет: там другие выводы, логика 3,3 В и другие размеры типов данных.

Откройте любой пример в два клика

В Trema IDE 81 пример с русскими комментариями лежит в меню «Файл → Примеры», а ошибки объясняются по-человечески. Дальше по теме: программирование Arduino с нуля, 39 уроков курса, справочник по языку.