Основы программирования Arduino на языке C/C++

Исторически так сложилось, что программная часть Arduino состоит из интегрированной программной среды (IDE), позволяющей писать, компилировать, а также загружать написанный код в аппаратную часть. Cреда ArduinoIDE, и сам язык Wiring основаны, в первую очередь, на Processing, косвенно – на С/C++. По сути, Arduino IDE являет собой большую сборную солянку, не смеха ради, а удобства для.

Даже внешне и Arduino IDE и Processing похожи

     Из чего состоит программа (скетч)?
Каждая программа, какой сложной она не казалась бы, состоит из отдельных наборов блоков кода, который обозначается фигурными скобками {}. Для минимальной программы требуется всего 2 блока: setup и loop. Их присутствие обязательно в любой программе на C++ для Arduino, иначе на стадии компиляции можно получить ошибку.

void setup()
{
}
 
void loop()
{
}

В функции setup()происходят начальные установки переменных, регистров. После завершения setup() управление переходит к функции loop(), которая являет собой бесконечный цикл, записанный в теле (между {   }). Именно эти команды и совершают все алгоритмические действия контроллера.  

    Аппаратный «Hello, world!» -  мигание светодиодом.
То, с чего начинается первое знакомство с Arduino на стыке программной и аппаратной части — это мигание светодиодом.


Сперва необходимо дополнить минимальную программу. У Arduino (например UNO), к 12 пину и GND подключим светодиод (цвет самого светодиода выбирается из личных предпочтений).

 void setup()
{
 pinMode(12, OUTPUT);
}
 
void loop()
{
 digitalWrite(12, HIGH);
 delay(100);
 digitalWrite(12, LOW);
 delay(900);
}

Делаем Ctrl+C -> Ctrl+V, компилируем, загружаем, властвуем. Видим светопредставление, длящееся не более секунды. Разбираемся, почему происходит именно так.

В ранее пустые блоки мы добавили несколько выражений. Они были размещены между фигурными скобками функций setup и loop.
Каждое выражение – инструкция для процессора. Выражения в рамках одного блока исполняются друг за другом, строго по порядку без всяких пауз и переключений. То есть, если мы говорим об одном конкретном блоке кода, его можно читать сверху вниз, чтобы понять, что делается.
   

     Что же происходит между {   } ?
Как известно, пины Arduino могут работать как на выход так и на вход. Когда мы хотим чем-то управлять, то нам нужно перевести управляющий пин в состояние работы на выход. Это делается выражением в функции setup :
pinMode(12, OUTPUT);
В данной ситуации в выражении осуществляется вызов функции. В pinMode устанавливается заданный по номеру пин в заданный режим (INPUT или OUTPUT). О каком пине и о каком режиме идёт речь, указывается в круглых скобках, через запятую. В нашем случае мы хотим, чтобы 12-й пин работал как выход. OUTPUT означает выход, INPUT — вход. Уточняющие значения, такие как 12 и OUTPUT называются аргументами функции. Сколько у функции аргументов зависит от сути функции и воли ее создателя. Функции могут быть без аргументов вовсе, как это происходит на примере setup и loop.

Далее переходим к блоку loop, по порядку:
-вызов встроенной функции digitalWrite. Она предназначена для подачи на заданный пин логического нуля (LOW, 0 вольт) или логической единицы (HIGH, 5 вольт) В функцию digitalWrite передаётся 2 аргумента: номер пина и логическое значение.
-вызов функции delay. Это, опять же, встроенная функция, которая заставляет процессор «уснуть» на определённое время. Она принимает всего один аргумент: время в миллисекундах, которое следует спать. В нашем случае это 100 мс. Как только 100 мс истекают, процессор просыпается и тут же переходит к следующему выражению.
- вызов встроенной функции digitalWrite. Только на этот раз вторым аргументом является LOW. То есть устанавливаем на 12-м пине логический ноль -> подаём 0 вольт -> гасим светодиод.
- вызов функции delay. На этот раз «спим» чуть подольше – 900 мс.

Как только выполнена последняя функция, блок loop завершается и все происходит снова и снова. На самом деле условия, представленные в примере, достаточно вариативны, и вы можете поиграться со значениями delay, подключить несколько светодиодов и сделать подобие светофора или полицейской мигалки (все зависит от фантазии и воли создателя).

     Вместо заключения, немного о чистоте.
На самом деле все пробелы, переносы строк, символы табуляции не имеют большого значения для компилятора. Там, где стоит пробел, может быть перенос строки и наоборот. На самом деле 10 пробелов подряд, 2 переноса строки и ещё 5 пробелов — это всё эквивалент одного пробела.


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

void setup(
)
 {
pinMode(12, OUTPUT
);
 }
 
 void loop
 () {
digitalWrite(12,HIGH);
delay(100
)
;
 digitalWrite(12,LOW);
 delay(900); }

Чтобы при чтении ни у кого не начала течь кровь из глаз, можно следовать нескольким простым правилам:

1. Всегда, при начале нового блока между { и } увеличивайте отступ. Обычно используют 2 или 4 пробела. Выберите одно из значений и придерживайтесь его всюду.
void loop()
{
 digitalWrite(12, HIGH);
 delay(100);
 digitalWrite(12, LOW);
 delay(900);
}

2. Как и в обычном языке: ставьте пробел после запятых.

digitalWrite(12, HIGH);

3. Размещайте символ начала блока { на новой строке на текущем уровне отступа или в конце предыдущей. А символ конца блока } на отдельной строке на текущем уровне отступа:

void setup()
{
 pinMode(12, OUTPUT); 
}
 
void setup() {
 pinMode(12, OUTPUT); 
}

4. Используйте пустые строки для разделения смысловых блоков:

void loop()
{
 digitalWrite(12, HIGH);
 delay(100);
 
 digitalWrite(12, LOW);
 delay(900);
 
 digitalWrite(12, HIGH);
 delay(100);
 
 digitalWrite(12, LOW);
 delay(900);
}

5. Для того, чтобы Ваше детище было приятно читать существуют так называемые комментарии. Это конструкции в программном коде, которые полностью игнорируются компилятором и имеют значение только для того, кто это читает. Комментарии могут быть многострочными или однострочными:

/*
это многострочный комментарий
 */
// это однострочный
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.