Каждая программа Arduino имеет минимум две функции:
void setup() {
// инициализация оборудования, запускается один раз при старте
}
void loop() {
// основной цикл программы, выполняется бесконечно
}
setup() — используется для настройки: скорость Serial, режимы пинов, запуск библиотек.loop() — содержит основной алгоритм; после достижения конца кода автоматически начинается заново.if (x < 5) {
// выполняется если условие истинно
}
else if (x == 5) {
// выполняется если первое условие ложно, а это истинно
}
else {
// выполняется если все условия ложны
}
for (int i = 0; i < 255; i++) {
// выполняется 255 раз, переменная i увеличивается
}
while (x < 5) {
// выполняется пока условие истинно
}
do {
// выполняется хотя бы один раз
} while (условие);
switch (mode) {
case 0:
// блок выполняется, если mode == 0
break;
case 1:
// если mode == 1
break;
default:
// выполняется, если совпадений нет
break;
}
Особенности:
break завершает текущий case. Без него выполнение пойдёт дальше (fall-through).Комментарии используются для пояснений и игнорируются компилятором.
// однострочный комментарий
/* многострочный
комментарий */
Директивы препроцессора выполняются до компиляции:
#define ANSWER 42 // константа
#include <Wire.h> // подключение библиотеки
#define — задаёт макрос (замена текста).#include — вставляет содержимое другого файла (обычно библиотеку).Arduino использует ряд предопределённых констант и форматов записи чисел:
Логические уровни:
HIGH — высокий уровень (логическая «1», напряжение ~5В на Uno).LOW — низкий уровень (логический «0», напряжение ~0В).Режимы работы пинов:
INPUT — пин на вход (по умолчанию).OUTPUT — пин на выход.INPUT_PULLUP — вход с подтягивающим резистором к VCC (~20–50 кОм).Булевы значения:
true — логическая истина (эквивалент 1).false — логический ноль (эквивалент 0).Форматы записи чисел:
53 — десятичная запись.B1100101 — двоичная запись (результат = 101 в десятичной системе).0x5B4A — шестнадцатеричная запись (в десятичной = 23370).Типы данных определяют, какие значения может хранить переменная и сколько байт памяти она занимает.
boolean — логический тип (true/false), занимает 1 байт.
char — символьный тип (например 'A'), диапазон −128…127, 1 байт.
byte — беззнаковый символ, диапазон 0…255, 1 байт.
int — целое число, диапазон −32 768…32 767, занимает 2 байта.
unsigned int — целое без знака, диапазон 0…65 535, 2 байта.
long — длинное целое, диапазон −2 147 483 648…2 147 483 647, 4 байта.
unsigned long — длинное целое без знака, диапазон 0…4 294 967 295, 4 байта.
float — число с плавающей точкой, диапазон примерно ±3.4028235E+38, занимает 4 байта.
Примечание:
doubleна Uno и Nano полностью идентиченfloat(тоже 4 байта).
sizeof(myInt) — оператор, возвращает размер переменной/типа в байтах.sizeof(int) на Uno вернёт 2.Операторы — это символы, которые позволяют выполнять действия над переменными.
= — присваивание+, - — сложение, вычитание*, / — умножение, деление% — остаток от деления== — равно!= — не равно<, <= — меньше, меньше или равно>, >= — больше, больше или равно&& — логическое «И» (оба условия истинны)|| — логическое «ИЛИ» (одно из условий истинно)! — логическое «НЕ» (инверсия)& — побитовое «И» (AND)| — побитовое «ИЛИ» (OR)^ — побитовое «Исключающее ИЛИ» (XOR)~ — побитовое отрицание (NOT, инверсия всех битов)<< — сдвиг влево (умножение на 2^n)>> — сдвиг вправо (деление на 2^n)Массивы позволяют хранить несколько значений в одной переменной. Индексация начинается с 0.
int a[6]; // массив из 6 элементов (индексы 0–5)
int pins[] = {2,4,8,5,6}; // массив инициализируется сразу
int vals[6] = {2,4,9,3,5}; // часть элементов задана, остальные = 0
Строки в Arduino (на базе AVR) — это массивы символов, оканчивающиеся '\0' (нулевым символом).
char s1[16]; // строка до 15 символов + '\0'
char s2[] = "Arduino"; // авто добавит '\0'
char s3[8] = {'A','r','d','u','i','n','o','\0'};
Особенности:
\0.String, но на Uno она расходует много памяти.Приведение типов позволяет преобразовывать одно значение в другое:
char(x); // в символ
int(x); // в целое число
long(x); // в длинное целое
byte(x); // в байт (0..255)
word(x); // в 16-битное число (0..65535)
float(x); // в число с плавающей точкой
Пример:
float v = 5.7;
int n = int(v); // n = 5 (целая часть)
Работа с цифровыми входами и выходами:
pinMode(pin, INPUT); // режим вход
pinMode(pin, OUTPUT); // режим выход
pinMode(pin, INPUT_PULLUP); // вход с подтяжкой к VCC
int v = digitalRead(pin); // считывание: 0 или 1
digitalWrite(pin, HIGH); // установить высокий уровень
digitalWrite(pin, LOW); // установить низкий уровень
Примечание: INPUT_PULLUP удобен для кнопок (экономия на внешнем резисторе).
На Uno доступны пины A0–A5 (10-битное преобразование: 0..1023).
analogReference(DEFAULT); // по умолчанию 5В
analogReference(INTERNAL); // ~1.1В (ATmega328P)
analogReference(EXTERNAL); // внешний опорный сигнал
int a = analogRead(A0); // чтение 0..1023
analogWrite(5, 128); // PWM (0..255) на пине ~5
Важно: analogWrite() не настоящий ЦАП, а ШИМ (широтно-импульсная модуляция).
unsigned long t = millis(); // миллисекунды с момента запуска
unsigned long u = micros(); // микросекунды с момента запуска
delay(1000); // пауза в миллисекундах
delayMicroseconds(10); // пауза в микросекундах
Особенности:
millis() переполняется каждые ~49 дней.millis(), а не delay().Позволяют реагировать на события немедленно, не дожидаясь выполнения loop().
attachInterrupt(digitalPinToInterrupt(pin), isr, RISING);
// isr — функция-обработчик, без аргументов и без return
// режим: RISING, FALLING, CHANGE, LOW
detachInterrupt(digitalPinToInterrupt(pin)); // отключение
noInterrupts(); // отключение всех прерываний
interrupts(); // включение всех прерываний
Дополнительные функции ввода-вывода:
tone(pin, freq); // генерация тона
tone(pin, freq, duration_ms); // тон на заданное время
noTone(pin); // остановить
shiftOut(dataPin, clockPin, MSBFIRST, value); // побитовая передача
unsigned long p = pulseIn(pin, HIGH); // длительность импульса HIGH
min(x,y); // минимальное
max(x,y); // максимальное
abs(x); // модуль
sin(rad); cos(rad); tan(rad); // тригонометрия (радианы)
pow(b,e); sqrt(x); // степень и корень
map(v, inMin, inMax, outMin, outMax); // масштабирование
constrain(v, vMin, vMax); // ограничение диапазона
randomSeed(seed); // инициализация
long r1 = random(100); // от 0 до 99
long r2 = random(10, 20); // от 10 до 19
Примечание: randomSeed() лучше инициализировать «шумным» значением, например analogRead(A0) без подключённого датчика.
Последовательная связь (через USB или TX/RX):
Serial.begin(9600); // скорость в бодах
Serial.print("T=");
Serial.println(temp); // печать с переводом строки
Особенности:
9600, 115200).Serial.available() проверяет, есть ли входящие данные.loop() удобно печатать значения переменных.3, 5, 6, 9, 10, 1110 (SS), 11 (MOSI), 12 (MISO), 13 (SCK)A4 (SDA), A5 (SCL)2 (INT0), 3 (INT1)Примечание: значения размера типов и диапазоны актуальны для платформы AVR (Arduino Uno/Nano, ATmega328P).