Текстовая версия:

Это первая статья из цикла, в которой мы рассмотрим самые базовые понятия. Она позволит без труда разобраться тем, кто совершенно не знаком с программированием и поможет понимать уроки из нашего базового курса. Язык, который разработчики Arduino подготовили для работы с платой, очень похож на старый добрый С++.
Важно помнить:

  • Что большие и маленькие буквы это не одно и то же.
  • В конце каждой исполняемой строки ставится точка с запятой.
  • Имена не могут повторяться. Каждая переменная и функция должна носить свое уникальное имя.

Переменные

Начнем с переменных. Если вам нужно хранить какие-то данные, то для этого нужно подготовить специальное хранилище, выбрать тип хранимых данных (например, числа или текст) и название.


int my_data;  // объявляем переменную типа int (целые числа) с названием my_data
my_data=5; //Присваиваем переменной my_data значение 5

Обратите внимание – в конце каждой строки завершающий символ – точка с запятой.
Отдельно стоит упомянуть двойной слеш – признак комментария. Все, что написано правее этого символа никак не воспринимается программой.  Это очень удобно при написании больших и сложных программ – можно оставить себе подсказки, что происходит в коде. Если когда-нибудь вам придется разбирать чужой код, вы будете очень благодарны создателю за эти подсказки…
Также очень хорошим тоном в программировании является создание переменных с читаемыми названиями. Т.е. вместо «int ssdf=0;», лучше написать что-то вроде «int is_light_on=0». Будет сразу понятно, что эта переменная хранит информацию о состоянии лампочки.
Мы можем присваивать переменной значения сколько угодно раз.
Кроме числовых, есть еще много разных типов переменных, но что бы не забивать голову, посмотрим на основные:


float my_data =1.234; // число с плавающей точкой
String my_text=”sample text”; // Текстовая переменная. Внимание! С большой буквы!
boolean my_state=false;  //Переменная хранит только false и true. Нужна для определения состояния

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


int a =5;
int b=3;
int c=a+b;

В переменной c мы получим 8.
Что бы в с получить 9, мы можем написать:


с++; // Равносильно записи с=с+1

Что бы прибавить 4, можно написать так:


с+=4; // Равносильно записи с=с+4

Можно сделать так:


int a=1;
float b=a/2;

Функции

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


int Sum (int a,int b); // Функция с именем Sum принимает 2 переменные типа int и после обработки возвращает переменную типа int.
{
int c=a+b; // Внутри функции создается переменная с, которая является результатом сложения переменных a и b
return c; // Функция возвращает значение переменной с, т.е. сумму переданных ей переменных
}


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

Как использовать функцию:


int my_num=5;
int my_summ=Sum(5,8);// создаем переменную и присваиваем ей значение из функции.

В my_summ сейчас 13


my_summ=Sum(my_num,34);// Записываем в эту же переменную другую сумму.

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


int my_num=Sum(5,8);
int a=c;// переменной с не существует, она была создана временно внутри функции и удалена после завершения ее работы.

Что бы переменные были доступны всегда, их нужно создавать глобально перед блоком setup.
Если брать примеры из Arduino, то самая простая функция – digitalWrite(pin_num,value)
Эта функция принимает 2 значения – номер цифрового выхода и тип сигнала (HIGH – подать сигнал, LOW – не подавать сигнал), но при этом ничего не возвращает. Она просто включает или выключает ток на определенном выходе.
Функция value digitalRead(pin_num) принимает номер выхода и возвращает нам значение HIGH или LOW.

Самые базовые функции работы с входами-выходами:

  • pinMode() – Инициализирует определенный вход-выход
  • digitalRead() – Считывает состояние цифрового входа
  • digitalWrite() – Устанавливает состояние цифрового выхода
  • analogRead() – Считывает состояние аналогового входа
  • analogWrite() – Устанавливает состояние аналогового выхода
  • delay() – Организует задержку, просто паузу в работе программы

Подробнее об этих функциях, а так же о других функциях мы будем говорить уже в контексте конкретных уроков, в которых они нам понадобятся.

Операторы


if (условие)
{
// код
}


Этот код будет выполняться, если верно условие.
Некоторые функции специально подходят для  такой конструкции. Например:


if  (digitalRead(10)) // Если на 10 входе есть сигнал, равносильно:  if  (digitalRead(10)==HIGH)
{
digitalWrite(8,HIGH); //Подаем сигнал на 8й выход
}

Этот код подаст сигнал на выход 8, если есть сигнал на 10 входе. Повесив светодиод на 8й выход, мы можем узнать, когда на 10й придет сигнал. Обратите внимание - у строки условия в конце нет точки с запятой, это не ошибка.
Таких условий может быть много:


if  (digitalRead(10))
{
digitalWrite(8,HIGH);
}
if  (digitalRead(11))
{
digitalWrite(9,HIGH);
}


Мы также можем обработать какое-то определенное событие и все остальные с помощью else:


if  (digitalRead(10)) // Если есть сигнал на 10 входе
{
digitalWrite(8,HIGH);
}
else // Если нет сигнала на 10 входе равносильно:  "if  (digitalRead(10)==LOW)"
{
digitalWrite(8,LOW);
}


Этот вариант кода, если он помещен в loop(), будет подавать сигнал на 8й выход только пока есть сигнал на 10.
Такого же эффекта можно добиться, если использовать while:


while (digitalRead(10)) // до тех пор пока есть сигнал на 10 выходе
{
    digitalWrite(8,HIGH);
}
    digitalWrite(8,LOW);


В этом примере лампочка будет гореть пока есть сигнал. Однако while необходимо использовать с осторожностью – пока соблюдается условие цикла while, будет выполняться только код внутри скобок и дальше этого не пойдет. Для прерывания этого безобразия используется break:


while (digitalRead(10)) // до тех пор пока есть сигнал на 10 выходе
{
    digitalWrite(8,HIGH);
    if(digitalRead(11))
    {
        break;
    }
}
digitalWrite(8,LOW);


В данном примере пока есть сигнал на 10 входе, на 8м выходе будет сигнал, но как только мы получим сигнал на 11 входе, цикл прервется и на 8й выход будет передан LOW, т.е. лампочка потухнет. Для красоты кода, если в конструкции участвует только 1 строка, то фигурные скобки можно не писать. Тот же пример:


if  (digitalRead(10)) // Если есть сигнал на 10 входе
digitalWrite(8,HIGH);
else // Если нет сигнала на 10 входе равносильно:  "if  (digitalRead(10)==LOW)"
digitalWrite(8,LOW);


Но это работает, только если активная строка в конструкции всего 1. Иначе нужно использовать скобки.
В качестве условий можно передавать несколько аргументов:


if (digitalRead(10) && digitalRead(11)) //Если есть сигнал на 10 и на 11 входе
if (digitalRead(10) || digitalRead(11)) //Если есть сигнал на 10 или на 11 входе


Последней конструкцией, которую мы рассмотрим, будет for. Она позволяет сделать ограниченный по длине цикл. Например, необходимо 10 раз мигнуть светодиодом:


for (int i=0;i<10;i++)
{
digitalWrite(5,HIGH);
delay(500);
digitalWrite(5,LOW);
delay(500);
}


Внутри конструкции создается переменная, ей присваивается значение 0 (int i=0). Каждый раз, когда код внутри скобок доходит до конца, он начинает работу сначала, при это переменная i прибавляется на 1 (i++). Так происходит до тех пор, пока выполняется условие. В данном примере это условие, что i<10. Как только это условие перестанет выполняться(i станет равной 10), код выйдет за пределы фигурных скобок и продолжит работу вне цикла.
Этого материала хватит для начала. Теперь можно приступать к изучению уроков по робототехнике. Статьи с углубленным изучением языка программирования Arduino будут появляться по мере необходимости в связке с основным курсом.