Первый взгляд на программу Arduino

Первый взгляд на программу Arduino

Контроллеры Arduino>>

Пример Blink

Теперь посмотрим внимательнее на тот пример из образцов, которые мы недавно загрузили в плату, пример Blink. Сначала я хочу обратить ваше внимание на то, что у любого языка программирования есть определенный набор правил, которые следует соблюдать, для того чтобы компилятор понял, что вы имели в виду. Так называемый «синтаксис». Точно так же как при написании сочинения на русском языке мы используем знаки препинания, разбиение на абзацы и прочие приемы, повышающие читабельность текста, у среды разработки, у языка программирования есть набор требований к тому, что мы пишем. Иначе просто он не поймет, о чем идет речь и не сможет в итоге создать работающий машинный код.

Комментарии в тексте программы

Ну начнем с того, что в начале скетча мы видим какой-то серый текст, написанный как будто бы на обычном человеческом языке. Действительно, это так и есть. Это комментарии. Комментарии — это как минимум хороший тон при оформлении кода, а как максимум полезная для вас самих привычка. Потому что все же, даже если вы владеете языком программирования, через определенное время после написания кода вы перестанете понимать, что вы имели в виду, когда его писали. Потому полезно то, что вы кодируете, комментировать на понятном русском или английском языке. Для того чтобы компилятор не считал, что это код на языке программирования, вам нужно это каким-то образом отделить от него. Мы видим вначале один из способов создания комментариев, многострочного комментария, который начинается с символов « /* » и заканчивается символами « */ ». Все, помещенное между этими маркерами, компилятор проигнорирует, и не будет пытаться превратить в машинный код.

Также есть способ сделать однострочный комментарий. Он начинается с « // », здесь мы тоже видим такую строчку.

Основные разделы программы

Двигаемся далее. Мы видим два раздела в программе — setup и loop. Возможно, вы уже обратили на них внимание, когда открывали пустой скетч, эта заготовка там присутствовала. Эти разделы являются неотъемлемой частью любой программы для Arduino. Если какой-то, какая-то из них будет отсутствовать, то компилятор просто скажет: «Не согласен с таким положением вещей, мне нужен setup, там, или мне нужен loop».

На самом деле, это определены две функции. Об определении функции мы подробно будем говорить в следующих частях, пока что вы можете просто знать об этом. Соответственно, оба этих фрагмента описаны в соответствии с правилами определения функции.

Что для нас важно сейчас? Содержание любой функции ограничено фигурными скобками. Вообще, фигурные скобки являются таким способом указать компилятору на некий законченный фрагмент программы. В данном случае, у нас это определение функции. Она начинается с открывающей фигурной скобки, завершается закрывающей фигурной скобкой. Чуть позже сегодня у нас будет другой вид фрагмента программы, где используются также фигурные скобки. Не забывайте о них и всегда следите за их парностью. То есть для каждой открывающей фигурной скобки должна быть где-то закрывающая фигурная скобка.

И не забывайте о вложенности. Если у вас внутри одного фрагмента, который обрамляется фигурными скобками, появляется еще один такой же фрагмент, нужно сначала закрыть внутренние фигурные скобки, а затем — внешние. В помощь нам в данном случае выступает сама среда разработки. Если мы поставим курсор рядом с одной из скобок, как я сейчас сделал в конце setup'а, её ответная парная скобка будет подсвечена. Как мы видим, открывающая фигурная скобка подсветилась.

Раздел SETUP

Давайте посмотрим, что описано в разделе setup. В данном случае здесь всего одна строка, это вызов стандартной функции pinMode. Что такое «вызов функции»? Функция — это некий фрагмент кода, который отдельно описан, ему присвоено имя, и у него есть свой определенный функционал. Функция pinMode описана в стандартной библиотеке Arduino, которую мы обычно даже не видим. О ней знает среда разработки, и мы просто вызываем нужные нам стандартные функции.

pinMode отвечает за то, чтобы настроить, в каком режиме будет работать определенный порт в данной программе. Дело в том, что в Arduino большинство портов могу служить как входами, так и выходами. То есть либо принимать какой-то электрический сигнал из внешнего мира, либо, наоборот, отправлять его туда. Но в каждом конкретном случае нужно определить: что же, в каком направлении будет работать данный порт. Когда мы вызываем какую-то функцию, мы можем ей передавать набор параметров, то есть каких-то уточнений насчёт того, как ей нужно сейчас работать. Именно параметры перечисляются внутри круглых скобок и отделяются друг от друга запятой. Это одно из базовых синтаксических правил, и никогда об этом не следует забывать. Что в данном случае мы передаём в функцию pinMode? Первым параметром передаётся номер pin'а, который мы хотим настроить. В данном случае это 13-й pin, потому что на нём есть встроенный светодиод.

То есть, на самом деле, если мы подключим к порту номер 13 какое-то внешнее устройство, оно также будет получать, на нем также будет появляться напряжение, там может включаться светодиод, мотор или что-то, но параллельно этому будет включаться встроенный светодиод. Вторым параметром после запятой мы указываем направление работы порта. В данном случае это OUTPUT (выход). Обратите внимание на то, что это ключевое слово — OUTPUT — написано заглавными буквами. Попытка написать его маленькими, строчными буквами не приведёт вас к успеху, потому что компилятор не поймет, о чём идёт речь.

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

Раздел LOOP

Посмотрим, что у нас описано в loop'е. Здесь мы видим какие-то ещё вызовы функций. Тоже стандартные функции, определённые в библиотеке Arduino, и первая из них — это digitalWrite. В качестве параметров она принимает две вещи. Первая — это номер контакта, с которым мы сейчас работаем. И состояние, в которое его нужно привести. После выполнения данной функции на 13-м контакте будет включен высокий уровень напряжения. «Высокий» в данном контексте значит, что это напряжения питания 5 Вольт.

Следующая стандартная функция — delay. Она служит для того, чтобы контроллер не выполнял никаких действий в течение определённого времени. И именно это время мы передаём ей в качестве параметра. 1000 миллисекунд, то есть 1 секунда. Итого получается, что мы включили напряжение на 13-м контакте, а поскольку там есть светодиод, он зажёгся. И затем на протяжении 1000 миллисекунд, 1 секунды, ничего не происходит.

После этого мы вновь вызываем digitalWrite. Вновь говорим ей работать с 13-м контактом. Но на этот раз ей следует подать низкий уровень напряжения, low. То есть 0 Воль — выключить. И снова подождать 1 секунду. После этого loop начнет выполняться с начала, и получится, что мы видим бесконечный цикл мигания светодиода. Секунду он включен, вместе с 13-м контактом, секунду — выключен. Отдельно хочу обратить ваше внимание на параметры, которые мы передали в функцию delay. 1000 миллисекунд. В данном случае мы использовали числовую константу, то есть буквально написали число.

На самом деле, в данном месте мы могли использовать любое выражение. «Выражение» в программировании — это такая вещь, которая... это что-то, что может быть вычислено. То есть 1000 вычислять не нужно, мы буквально уже написали «1000». Это может быть арифметическое выражение, например: 1000 разделить на 3. Это может быть вычислено, будет получен результат 333 и 3 в периоде. Это может быть использование какого-то значения, хранящегося в памяти. Об этом мы поговорим чуть позже.

Давайте подытожим, что мы выяснили благодаря этому простому примеру. Во-первых, мы теперь знаем, что в любой программе для Arduino есть обязательно раздел setup и loop, которые на самом деле являются определениями функции. Причем setup — такой фрагмент, который выполняется единожды при запуске контроллера, то есть обычно там просиходят какие-то настройки. Как, например, сейчас, мы 13-й pin сделали выходом. А loop, в отличие от него, после своего первого выполнения выполнится вновь и вновь, и вновь. В данном случае мы включаем 13-й контакт, где есть светодиод, ждем секунду, выключаем 13-й контакт, снова ждём секунду. И в бесконечном цикле получаем мигание светодиода. Теперь, наконец, мы можем приступать к программированию светофора.