Светодиод у меня на макетке не загорался третий раз подряд. Код был списан из интернета один в один, плата была новая, а светодиод упорно молчал. Причиной оказался банальный нюанс, о котором в коротких статьях обычно не пишут: светодиод воткнули наоборот — длинная ножка смотрела не туда. Именно с таких мелочей начинается Arduino, и именно поэтому я предлагаю разбирать каждый шаг, а не просто копировать код.
В этом уроке вы напишете свою первую программу для Arduino Uno, заставите светодиод мигать — сначала на виртуальной плате в симуляторе, потом и на настоящей, если она у вас есть. Попутно разберёмся, зачем скетчу нужны две обязательные функции — setup() и loop(), что физически делает команда digitalWrite() и почему светодиод без резистора живёт ярко, но недолго.
Как устроен любой скетч: setup() и loop()
Каждая программа для Arduino — её называют скетчем — состоит из двух функций. Микроконтроллер, мозг платы, вызывает их сам, поэтому писать main() не нужно.
setup() выполняется один раз при включении платы или после нажатия кнопки Reset. Сюда кладут подготовку: задать режимы пинов, запустить Serial, инициализировать дисплей. loop() крутится бесконечно: как только функция дошла до конца — она начинается заново, и так пока плата включена. Вся логика «мигнуть, подождать, проверить кнопку, подождать» живёт именно здесь.
Проще всего думать так: setup() — это утро понедельника, когда вы включаете станок и раскладываете инструменты. loop() — рабочая смена, которая повторяется день за днём.
void setup() { pinMode(13, OUTPUT); // пин 13 — выход} void loop() { digitalWrite(13, HIGH); // подать 5 В на пин 13 delay(1000); // подождать 1000 мс = 1 секунду digitalWrite(13, LOW); // опустить линию до 0 В delay(1000);}Разберём построчно, потому что каждая строка здесь — рабочий инструмент, который вы будете использовать во всех последующих проектах.
void setup() — объявление функции. Слово void означает «функция ничего не возвращает». Фигурные скобки { } ограничивают тело функции — всё, что между ними, и есть программа.
pinMode(13, OUTPUT) говорит процессору: пин номер 13 должен работать как выход — то есть мы будем задавать напряжение на нём сами. Пины Arduino Uno можно настраивать и как вход (INPUT) — тогда мы их *слушаем*: кнопку, датчик. Перепутать OUTPUT и INPUT — классическая первая ошибка: если забыть pinMode, пин ведёт себя непредсказуемо, и светодиод может светиться тускло или не светиться вовсе.
digitalWrite(13, HIGH) выставляет на пине 5 вольт. HIGH — именованная константа, то же самое, что число 1. Соответственно LOW — 0 вольт, константа для «выключено». Ток, потёкший из пина через светодиод, заставит его светиться.
delay(1000) останавливает выполнение программы на 1000 миллисекунд. Заметьте: не «пауза в фоне», а именно остановка — в это время плата не делает *ничего*, и для простых проектов это нормально. О том, чем delay() плох в больших программах и что вместо него, у нас есть отдельный урок про millis().
Почему светодиоду нужен резистор
Светодиод — прибор нелинейный. Ему нужно примерно 2 В на кристалле (у красных; у синих и белых — около 3 В), а всё лишнее напряжение он готов «проглотить», пропуская через себя сколь угодно большой ток. Пин Arduino может отдать до 40 мА, и если подключить светодиод напрямую между пином и землёй, сначала он засветится очень ярко, а потом просто сгорит — за секунды или недели, в зависимости от везения.
Гасящий резистор ограничивает ток. Формула школьного закона Ома: R = (Uпин − Uled) / I. Для Arduino: (5 В − 2 В) / 0,015 А = 200 Ом. Ближайший стандартный номинал — 220 Ом, он же самый ходовой в наборах. Если взять 1 кОм — светодиод будет светить заметно тусклее, но работать будет. Мой совет: для первых экспериментов берите именно 220–330 Ом и не думайте о номинале больше.
Полярность: у светодиода две ножки разной длины. Длинная — анод, её подключают к пину через резистор. Короткая — катод, к земле (GND). Внутри корпуса у катода ещё и плоская грань на ободке — способ определить полярность, даже если ножки обрезаны. Я сам один раз полчаса искал ошибку в коде, когда она была в обрезанной ножке.
Три ошибки, которые совершают все
- Светодиод наоборот. Симптом: не горит, код точно правильный. Лечение: переверните — длинная ножка к пину, короткая к GND.
- Нет резистора. Симптом: горит очень ярко, греется, потом умирает. Лечение: 220 Ом в разрыв цепи.
- Забыт pinMode(пин, OUTPUT). Симптом: тусклое свечение или реакции нет. Лечение: всегда настраивайте пин в setup().
Пробуем код в симуляторе
Эксперименты для закрепления
Код — это не стихи, его нельзя выучить, только наиграть. Вот три задачи по возрастанию сложности, которые стоит решить прямо в симуляторе, не выходя из этого урока.
- Ускорьте мигание до 5 раз в секунду. Подсказка: сумма двух
delay()в цикле должна быть 200 мс. - Сделайте «пульс»: плавно повторяющийся паттерн — коротко, коротко, длинно (буква S азбуки Морзе). Проверьте себя: три точки — это три мигания по 200 мс с паузами 200 мс.
- Заведите переменную
int wait = 1000;надsetup()и используйте её в обоихdelay(). Меняя одну цифру, вы меняете поведение всей программы — это и есть смысл переменных, с ними мы познакомимся ближе в следующем уроке.
Что такое void и зачем тут точка с запятой
Синтаксис C++ строг, и новичков он ранит чаще, чем сама логика. Запомните три правила, и половина красных подчёркиваний исчезнет.
Каждая инструкция заканчивается точкой с запятой ;. Забытая точка с запятой — ошибка номер один в мире Arduino, компилятор в ответ на неё часто ругается *не на ту строку*, а на следующую — ищите проблему строкой выше.
Регистр важен. digitalWrite работает, Digitalwrite — нет. HIGH и high — разные слова. В C++ идентификаторы foo и Foo никогда не бывают одной сущностью.
Комментарии начинаются с // (до конца строки) или /* ... */ (блок). Компилятор их игнорирует, но вы через неделю скажете себе спасибо: помечайте, зачем каждая строка нужна.
Как это выглядит на настоящей плате
Если у вас есть Arduino Uno: подключите светодиод длинной ножкой к пину 13, короткой — к GND напрямую (на борту уже стоит резистор) или через 220 Ом к пину 8 со стороны макетки. Загрузите скетч кнопкой со стрелкой в Arduino IDE — и L замигает. Плата запоминает программу: отключите USB, подключите питание — мигание продолжится.
Кстати, о словах. Скетч — программа для Arduino. Пин — ножка платы, ввод/вывод. GND (ground) — земля, общий провод, минус. 5V — плюс питания. Макетка (breadboard) — панелька, где собирают схему без пайки. Эти пять слов закрывают 90% словаря новичка.
- Скетч = setup() (один раз) + loop() (бесконечно)
- pinMode(пин, OUTPUT) — настраиваем пин как выход; digitalWrite(пин, HIGH/LOW) — управляем напряжением
- Светодиод всегда подключают через резистор 220 Ом, длинной ножкой (анодом) к пину
- delay(N) останавливает всю программу на N миллисекунд
- C++ строг: точка с запятой, регистр букв, комментарии // и /* */
- 1. Сколько раз выполнится функция setup() после включения платы?
- 2. Что сделает digitalWrite(7, HIGH)?
- 3. Почему светодиод подключают через резистор?
- 4. Какая строка содержит синтаксическую ошибку?
В следующем уроке заведём переменные разных типов, научимся считать нажатия и напишем программу-счётчик, которая ведёт себя по-разному в зависимости от того, что происходит вокруг. А пока — поиграйте с задержками в симуляторе: попробуйте паттерны мигания, которые вы видели на светофорах, или соберите «новогоднюю гирлянду» из трёх функций подряд.
Частые вопросы по теме урока
- Сколько раз выполнится функция setup() после включения платы?
- setup() выполняется один раз при старте (или после Reset), затем начинается бесконечный цикл loop(). Один раз
- Что сделает digitalWrite(7, HIGH)?
- digitalWrite задаёт уровень на выходном пине: HIGH = 5 В, LOW = 0 В. Чтение — digitalRead, задержка — delay. Включит на пине 7 выходное напряжение 5 В
- Почему светодиод подключают через резистор?
- Гасящий резистор ограничивает ток примерно до 15 мА при 220 Ом — безопасно и для светодиода, и для пина Arduino. Чтобы ограничить ток и не сжечь светодиод и пин
- Какая строка содержит синтаксическую ошибку?
- Не хватает точки с запятой в конце инструкции digitalWrite(13, HIGH); digitalWrite(13, HIGH)