В данном уроке кратко рассмотрены основные инструменты C/C++ с запускаемыми примерами для Arduino. Каждая глава имеет подробную версию в разделе уроков C/C++.
В данном разделе уроков разобраны не все стандартные Arduino-функции и классы - они описаны отдельно в справочнике:
Монитор порта #
В данном уроке для демонстрации работы примеров используется вывод в монитор порта (в консоль), о котором подробно написано в следующем уроке. На данный момент достаточно понимать, что:
Serial.begin(115200); // запуск связи
Serial.println(любые_данные); // вывод данных в консоль
Структура программы #
Рекомендуется изучить следующие уроки:
Инструкции #
Программа - это последовательность действий, которые выполняет процессор. Программа выполняется "сверху вниз и слева направо" и состоит из инструкций, в C/C++ инструкции разделяются символом ;
. Инструкции принято писать по одной на строку для удобства и повышения читаемости кода:
инструкция1;
инструкция2;
В рамках обычной программы все действия выполняются по порядку друг за другом - синхронно: программа не перейдёт к следующей строке кода, пока не будет выполнена текущая строка
Блок кода #
Набор инструкций, заключённый в фигурные скобки {}
, называется блоком кода:
{
инструкция1;
инструкция2;
}
Скетч #
Минимальная программа на Arduino выглядит следующим образом:
void setup() {
// этот код выполнится однократно при запуске
}
void loop() {
// этот код выполняется циклично после выполнения setup
}
Данный код можно вставить в Arduino IDE и загрузить в плату.
Это - требование фреймворка, без функций setup
и loop
программа не скомпилируется, т.к. они вызываются внутри системных файлов
Программа для Arduino называется скетч (sketch, набросок). От обычной самостоятельной программы на C/C++ она отличается тем, что основной код "скрыт" от программиста - основная программа находится в файлах фреймворка Arduino, она содержит некий системный код, который выполняется независимо от нашего скетча. Скетч связан с основной программой при помощи функций setup
и loop
- программа вызывает эти функции: setup
однократно при запуске МК, а loop
- постоянно на протяжении всего остального времени работы МК. Именно внутри этих функций мы и будем писать свою программу.
setup() #
Блок setup
выполняется при запуске, поэтому в нём обычно настраиваются датчики, запускаются интерфейсы связи и производятся всякие предполётные проверки - то, что нужно сделать один раз и больше не трогать.
void setup() {
запустить_связь;
настроить_датчик;
}
loop() #
Базовый принцип программирования Arduino - так называемый суперцикл: программа зациклена в вечном цикле и выполняется "по кругу" сверху вниз, начинает с начала когда достигает конца. Это самый простой и визуально понятный способ организации программы: в loop
можно опрашивать кнопки и реагировать на нажатия, читать данные с датчиков и выводить на дисплей и так далее:
void loop() {
опросить_кнопку;
прочитать_датчик;
обновить_дисплей;
}
Особенности работы в рамках суперцикла описаны в отдельном уроке.
Функции #
Рекомендуется изучить следующие уроки:
Для удобства организации программы существуют функции (в других языках могут называться процедуры) - блок кода, у которого есть имя. По этому имени функцию можно вызвать, чтобы выполнить содержащийся в ней код:
void func() {
инструкция1;
инструкция2;
}
А вызываются - через имя()
:
func(); // выполнить инструкцию 1 и 2
func(); // выполнить инструкцию 1 и 2
Пример:
void hello() {
Serial.println("Hello!");
}
void setup() {
Serial.begin(115200);
hello(); // вывод Hello!
hello(); // вывод Hello!
}
void loop() {
}
Функция может принимать аргументы указанного типа:
void print(int x) {
Serial.println(x);
}
void setup() {
Serial.begin(115200);
print(123); // вывод 123
}
void loop() {
}
Функция может возвращать данные указанного типа:
int sum(int x, int y) {
return x + y;
}
void setup() {
Serial.begin(115200);
int s = sum(3, 4);
Serial.println(s); // вывод 7
Serial.println(sum(10, 20)); // вывод 30
}
void loop() {
}
delay #
Для простоты и наглядности примеров в ближайших уроках мы будем использовать функцию delay(время)
- приостановить выполнение программы на указанное время в миллисекундах (в 1 секунде 1000 миллисекунд):
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println("Hello!");
delay(500); // ждать полсекунды
}
Данная программа выводит в порт строку Hello
два раза в секунду. Если убрать delay
- строка будет выводиться с максимально возможной скоростью.
Данные #
Константы в программе #
В коде программы могут быть константы различного типа:
1234
- число по основанию 100xab12
- число по основанию 163.14
- десятичная дробь, число с плавающей точкой'a'
- символ в одиночных кавычках"строка"
- строка в двойных кавычках
Переменные и константы #
Рекомендуется изучить следующие уроки:
Переменная - именованная ячейка памяти, которая может хранить значение указанного типа:
тип имя1; // создана переменная
тип имя2 = значение; // создана и инициализирована значением
К переменной можно присвоить значение в процессе работы, в том числе другую переменную или результат вычислений:
void setup() {
Serial.begin(115200);
int a = 0; // переменная a типа int
int b = 123; // переменная b типа int
Serial.println(a); // вывод 0
Serial.println(b); // вывод 123
a = b; // a теперь равно b
b = 456; // присвоить 456 к b
Serial.println(a); // вывод 123
Serial.println(b); // вывод 456
}
void loop() {
}
Arduino-типы #
Фреймворк Arduino добавляет два типа данных, которые являются синонимами к стандартным типам:
byte
- синонимunsigned char
(uint8_t
)boolean
- синонимbool
Классы и объекты* #
Это сложная тема, но мы коснёмся её в самом начале уроков, т.к. классы и объекты встречаются уже в самом начале работы с Arduino
Класс - это созданный пользователем составной тип данных, который содержит в себе переменные и функции. Объект - это переменная, созданная от класса как от типа данных:
int var; // переменная var типа int
Class obj; // объект obj типа Class
Class obj2; // ещё один
Обращение к инструментам объекта осуществляется при помощи точки .
:
Serial.begin(115200); // вызвать метод begin объекта Serial
Serial.println(); // вызвать метод println объекта Serial
// объект Serial создан в системных файлах Arduino
Операции #
Математические #
Рекомендуется изучить следующие уроки:
Синтаксис и правила математических операций такие же, как "на бумаге":
void setup() {
Serial.begin(115200);
int a = 10;
int b = a * 3;
Serial.println(b); // вывод 30
b = (a + 5) * (a - 5);
Serial.println(b); // вывод 75
b /= 5;
Serial.println(b); // вывод 15
float pi = 3.14;
float r = 10;
float l = 2 * pi * r;
Serial.println(l); // вывод 62.80
}
void loop() {
}
Логика и сравнение #
Рекомендуется изучить следующие уроки:
В программе можно сравнивать значения и выполнять действия по результату логических выражений:
void setup() {
Serial.begin(115200);
int a = 10;
int b = 20;
if (a >= 0) Serial.println("a больше или равно 0");
if (b == 20) Serial.println("b равно 20");
if (a > b) {
Serial.println("a больше b");
} else {
Serial.println("a меньше b");
}
if (a + b == 30) Serial.println("a + b равно 30");
else Serial.println("a + b не равно 30");
Serial.println(a == 10); // вывод 1, если a равно 10, иначе 0
Serial.println(a == 20); // вывод 1, если a равно 20, иначе 0
if (a >= 0 && a <= 10) Serial.println("a в диапазоне от 0 до 10");
if (a == 0 || a == 10) Serial.println("a равно 0 ИЛИ 10");
if (a == 10 && b == 20) Serial.println("a равно 10 И b равно 20");
}
void loop() {
}
Выбор #
Рекомендуется изучить следующие уроки:
Оператор выбора позволяет выбирать, какой код будет выполняться, исходя из переданного значения:
void setup() {
Serial.begin(115200);
int a = 10;
switch (a) {
case 0:
Serial.println("a равно 0");
break
case 10:
Serial.println("a равно 10");
break;
default:
Serial.println("a неизвестно");
break;
}
}
void loop() {
}
Циклы #
for #
Рекомендуется изучить следующие уроки:
Цикл-счётчик позволяет одной строкой создать блок кода, который будет выполняться согласно заданным условиям:
void setup() {
Serial.begin(115200);
for (int i = 0; i < 5; i++) {
Serial.print(i);
Serial.print(',');
}
// вывод 0,1,2,3,4,
}
void loop() {
}
while #
Рекомендуется изучить следующие уроки:
Выполняется, пока верно условие:
void setup() {
Serial.begin(115200);
int i = 5;
while (i > 0) {
Serial.print(i);
Serial.print(',');
i--;
}
// вывод 5,4,3,2,1,
}
void loop() {
}
Массивы* #
Рекомендуется изучить следующие уроки:
- Массивы - для начала первую половину
Массив - несколько переменных одного типа, объединённых под одним именем. Обращаться к элементам массива нужно через квадратные скобки []
:
void setup() {
Serial.begin(115200);
int arr[] = {1, 2, 3, 4, 5};
// вывод
for (int i = 0; i < 5; i++) {
Serial.print(arr[i]);
}
// печать 01234
Serial.println();
// изменение
for (int i = 0; i < 5; i++) {
arr[i] = i * 2;
// i = 0, 1, 2, 3
// i*2 = 0, 4, 6, 8
}
// вывод
for (int i = 0; i < 5; i++) {
Serial.print(arr[i]);
}
// печать 02468
Serial.println();
// вывод
for (int v : arr) {
Serial.print(v);
}
// печать 02468
Serial.println();
}
void loop() {
}
include #
Данная команда позволяет подключить в программу другой файл или библиотеку. Подробнее читайте в уроке про директивы препроцессора, а ближе к практике - в уроке про использование библиотек.
#include <math.h> // подключить системную библиотеку math.h
#include <SPI.h> // подключить Arduino-библиотеку SPI.h
void setup() {
}
void loop() {
}
Полезные страницы #
- Набор GyverKIT – наш большой стартовый набор Arduino, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
- Поддержать автора за работу над уроками
