Основы языка С++ для ардуино
https://alexgyver.ru/lessons/arduino-reference/
Структура скетча для ардуино.
Эти две функции void setup() и void loop() обязательно должны быть прописаны в скетче, даже если внутри них ничего нет.
void setup() {
  // Выполняется ОДИН РАЗ при старте.
  // Здесь настраиваем пины, запускаем Serial, подключаем библиотеки.
}

void loop() {
  // Выполняется БЕСКОНЕЧНО в цикле, пока плата включена.
  // Здесь основная логика программы.
}
Настройка пинов (контактов)
Прежде чем использовать пин, его нужно обязательно настроить. Обычно эти команды прописываются в функции void setup(), но можно использовать их где угодно. Можно даже менять функционал контакта в процессе работы.
pinMode(13, OUTPUT);          // Настроить пин 13 как ВЫХОД (для светодиода, реле)
pinMode(2, INPUT);            // Настроить пин 2 как ВХОД (для кнопки, датчика)
pinMode(2, INPUT_PULLUP);     // ВХОД с внутренней подтяжкой к +5В (кнопка на GND)

digitalWrite(13, HIGH);       // Подать +5В на пин (включить светодиод)
digitalWrite(13, LOW);        // Подать 0В на пин (выключить светодиод)
Использование пинов
После настройки пина можно либо посылать с него сигнал, либо считывать сигнал, который на него приходит извне
// ------------------------------------------------------------
// РАБОТА C ЦИФРОВЫМИ ПИНАМИ (ЛИБО 0 ЛИБО 1)
// ------------------------------------------------------------
digitalWrite(3, 1); //подать +5В на контакт D3 
digitalWrite(3, 0); //подать GND на контакт D3 

int state = digitalRead(2);   // Прочитать состояние пина D2 и записать это состояние в переменную state. В данном случае в переменную state будет записано либо 0, если на контакт D2 подается GND, либо 1, если +5В


// ------------------------------------------------------------
// РАБОТА С АНАЛОГОВЫМИ ПИНАМИ (ПЛАВНОЕ ИЗМЕНЕНИЕ ЗНАЧЕНИЙ)
// ------------------------------------------------------------

int value = analogRead(A0);   // Прочитать аналоговое значение. Команда analogRead(A0) измеряет напряжение на контакте A0 от 0 до 5В и преобразует его в число от 0 до 1023. В результате в переменную value будет записано число от 0 до 1023 в зависимости от напряжения, подаваемого на контакт A0 в момент выполнения данной команды.

analogWrite(9, 128);          // ШИМ на пине D9: 0 (выкл) .. 255 (макс). ШИМ Работает только на пинах: 3,5,6,9,10,11. В результате выполнения этой команды светодиод, подключенный к контакту D9 будет гореть с 50% яркостью, т.к. 128 это половина от 255.
Задержки и время
delay(1000);                  // Пауза 1000 мс (1 секунда) — блокирует программу
delayMicroseconds(100);       // Пауза 100 микросекунд

unsigned long t = millis();   // записать в переменную t время с момента старта в мс
unsigned long m = micros();   // записать в переменную m время с момента старта в микросекундах
Типы переменных
ПВ зависимости от того, какой тип мы напишем перед именем переменной при ее создании (int, long, float ...), будет зависеть какую именно информацию сможет хранить эта переменная. Под разный тип переменной выделяется разное количество памяти и по разному обрабатывается содержимое.
int counter = 0;              // Целое: -32768..32767 (2 байта)
long bigNum = 100000;         // Длинное целое (4 байта)
unsigned long time = 0;       // Беззнаковое длинное (для millis)
float voltage = 2.5;          // Число с плавающей точкой
bool ledState = false;        // Логический тип: true / false
char symbol = 'A';            // Символ
byte b = 255;                 //целое  0..255

const int LED_PIN = 13;       // Константа (нельзя изменить).
#define LED_PIN 13            // То же самое через директиву препроцессора
Конструкция IF (условие и логика)
Мы можем выполнять разные куски кода в зависимости от условия. Например выполнять разные действия в зависимости от значения какой-либо переменной.
// ------------------------------------------------------------
// ПРОСТОЕ ИСПОЛЬЗОВАНИЕ IF 
// ------------------------------------------------------------

if (value > 500) {
  // здесь код, который будет выполнен, если переменная value больше 500
}  else {
  // здесь код, который будет выполнен, если условие value > 500 не верно
}


// ------------------------------------------------------------
// РАСШИРЕННОЕ ИСПОЛЬЗОВАНИЕ IF (количество else if() не ограничено)
// ------------------------------------------------------------

if (value > 500) {
  // здесь код, который будет выполнен, если переменная value больше 500
} else if (value < 200) {
   // здесь код, который будет выполнен, если переменная value меньше 200
} else {
  // здесь код, который будет выполнен, если первые два условия не верны
}

// Логические операторы:
//       &&  — И
//       ||  — ИЛИ
//       !  — НЕ
//        ==  — равно
//        !=  — не равно
//        >  <  >=  <=  — сравнения
switch...case (если много вариантов)
В Arduino (как и в C/C++) конструкция switch...case нужна, чтобы выбрать один из нескольких вариантов действий в зависимости от значения переменной. Это часто удобнее и читабельнее, чем длинная цепочка if‑else, особенно когда вариантов много.
switch (mode) {
    case 0:
      // код, написанный здесь будет выполнен, если переменная mode равна 0
       break;

    case 1:
       // код, написанный здесь будет выполнен, если переменная mode равна 1
      break;

    case 2:
       // код, написанный здесь будет выполнен, если переменная mode равна 2
      break;

    default:
      // код, написанный здесь будет выполнен, если переменная mode не равна ни одному из перечисленных значений выше
      break;
  }
Циклы
Циклы нужны, если какой-либо код нужно выполнить несколько (или много) раз.
for (int i = 0; i < 5; i++) {
  // повторить 5 раз (i = 0,1,2,3,4)
}

while (условие) {
  // код здесь будет выполняться по кругу, пока условие верно
}

do {
  // выполнить хотя бы один раз
} while (условие);
Массивы
Массив - это несколько переменных с одним именем. У каждой ячейки в массиве есть номер начиная с нуля. Каждая ячейка - это переменная. При создании массива можно использовать такие же типы, как при создании переменных (int, float и т.д.)
 int arr[5];                  // создаем массив по имени arr, в котором 5 переменных типа int
 int arr[5] = {};             //создаем массив по имени arr, в котором 5 переменных типа int и заполняем все переменные нулями
 int arr[] = {1, 2, 3, 4, 5};    //создаем массив по имени arr, в котором неколько переменных, переменная arr[0]=0, arr[1]=2, arr[2]=3 и т.д. Всего 5 ячеек. 

Serial.print(arr[3]);      //отправляем содержимое четвертой ячейки массива arr в сериал порт (в данном случае число 4)

    // вывод на экран содержимого первых 5 ячеек массива arr
    for (int i = 0; i < 5; i++) {
        Serial.print(arr[i]);
    }


      // заполняем массив arr квадратами чисел от 0 до 4
    for (int i = 0; i < 5; i++) {
        arr[i] = i * 2;
        // i = 0,1,2,3,4
        // i*2 = 0,2,4,6,8
    }
Последовательный порт serial
Serial.begin(9600);                 // Инициализация (обычно в setup)

Serial.print("value = ");         // Вывод без перевода строки (будет выведена строка "value ="
Serial.println(value);              // Вывод с переводом строки (будет выведено значение переменной value)
Математика и преобразование
int v = map(value, 0, 1023, 0, 255);   // Пересчёт диапазона: 0..1023 → 0..255
int c = constrain(v, 0, 255);          // Ограничить значение в диапазоне
int a = abs(-5);                       // Модуль числа = 5
int mn = min(3, 7);                    // Минимум = 3
int mx = max(3, 7);                    // Максимум = 7
float p = pow(2, 3);                   // Степень: 2^3 = 8.0
float r = sqrt(16);                    // Корень = 4.0
Частные константы
HIGH / LOW          // 1 / 0 — уровни сигнала
true / false        // логические значения (1 или 0)
LED_BUILTIN         // встроенный светодиод (обычно пин 13)
Шпаргалка по наиболее часто встречающимся командам
Если хочется больше, идем сюда: https://alexgyver.ru/lessons/arduino-reference/
// ============================================================
//  ШПАРГАЛКА ПО ARDUINO: ЧАСТО ИСПОЛЬЗУЕМЫЕ КОМАНДЫ
// ============================================================

// ------------------------------------------------------------
// 1. СТРУКТУРА СКЕТЧА
// ------------------------------------------------------------

void setup() {
  // Выполняется ОДИН РАЗ при старте.
  // Здесь настраиваем пины, запускаем Serial, подключаем библиотеки.
}

void loop() {
  // Выполняется БЕСКОНЕЧНО в цикле, пока плата включена.
  // Здесь основная логика программы.
}


// ------------------------------------------------------------
// 2. ЦИФРОВЫЕ ПИНЫ: НАСТРОЙКА И УПРАВЛЕНИЕ
// ------------------------------------------------------------

pinMode(13, OUTPUT);          // Настроить пин 13 как ВЫХОД (для светодиода, реле)
pinMode(2, INPUT);            // Настроить пин 2 как ВХОД (для кнопки, датчика)
pinMode(2, INPUT_PULLUP);     // ВХОД с внутренней подтяжкой к +5В (кнопка на GND)

digitalWrite(13, HIGH);       // Подать +5В на пин (включить светодиод)
digitalWrite(13, LOW);        // Подать 0В на пин (выключить светодиод)

int state = digitalRead(2);   // Прочитать состояние пина: HIGH (1) или LOW (0)


// ------------------------------------------------------------
// 3. АНАЛОГОВЫЙ ВВОД (ADC) И ШИМ-ВЫВОД
// ------------------------------------------------------------

int value = analogRead(A0);   // Прочитать аналоговое значение: 0..1023

analogWrite(9, 128);          // ШИМ на пине ~9: 0 (выкл) .. 255 (макс)
                              // Работает только на пинах с "~": 3,5,6,9,10,11


// ------------------------------------------------------------
// 4. ЗАДЕРЖКИ И ВРЕМЯ
// ------------------------------------------------------------

delay(1000);                  // Пауза 1000 мс (1 секунда) — блокирует программу
delayMicroseconds(100);       // Пауза 100 микросекунд

unsigned long t = millis();   // записать в переменную t время с момента старта в мс
unsigned long m = micros();   // записать в переменную m время с момента старта в микросекундах

// ------------------------------------------------------------
// 5. ПЕРЕМЕННЫЕ И ТИПЫ ДАННЫХ
// ------------------------------------------------------------

int counter = 0;              // Целое: -32768..32767 (2 байта)
long bigNum = 100000;         // Длинное целое (4 байта)
unsigned long time = 0;       // Беззнаковое длинное (для millis)
float voltage = 2.5;          // Число с плавающей точкой
bool ledState = false;        // Логический тип: true / false
char symbol = 'A';            // Символ
byte b = 255;                 // 0..255

const int LED_PIN = 13;       // Константа (нельзя изменить)

#define LED_PIN 13            // То же самое через директиву препроцессора


// ------------------------------------------------------------
// 6. УСЛОВИЯ И ЛОГИКА
// ------------------------------------------------------------

if (value > 500) {
  // выполнить, если условие истинно
} else if (value > 200) {
  // иначе, если второе условие истинно
} else {
  // иначе
}

// Логические операторы:
// &&  — И       ||  — ИЛИ       !  — НЕ
// ==  — равно   !=  — не равно
// >  <  >=  <=  — сравнения


// ------------------------------------------------------------
// 7. ЦИКЛЫ
// ------------------------------------------------------------

for (int i = 0; i < 5; i++) {
  // повторить 5 раз (i = 0,1,2,3,4)
}

while (digitalRead(2) == LOW) {
  // выполнять, пока кнопка нажата
}

do {
  // выполнить хотя бы один раз
} while (условие);


// ------------------------------------------------------------
// 8. МАССИВЫ
// ------------------------------------------------------------
void setup() {
    Serial.begin(115200);

    // int arr[5];                  // 5 ячеек int
    // int arr[5] = {};             // 5 ячеек int с инициализацией нулями
    int arr[] = {1, 2, 3, 4, 5};    // 5 ячеек int с инициализацией (авто-количество)

    // вывод
    for (int i = 0; i < 5; i++) {
        Serial.print(arr[i]);
    }
    // печать 12345
    Serial.println();

    // изменение
    for (int i = 0; i < 5; i++) {
        arr[i] = i * 2;
        // i = 0,1,2,3,4
        // i*2 = 0,2,4,6,8
    }

    // перебор через for и вывод
    for (int i = 0; i < 5; i++) {
        Serial.print(arr[i]);
    }
    // печать 02468
    Serial.println();

    // перебор через for (foreach) и вывод
    for (int v : arr) {
        Serial.print(v);
    }
    // печать 02468
    Serial.println();
}

void loop() {
}


// ------------------------------------------------------------
// 9. ПОСЛЕДОВАТЕЛЬНЫЙ ПОРТ (Serial)
// ------------------------------------------------------------

Serial.begin(9600);                 // Инициализация (обычно в setup)

Serial.print("Значение: ");         // Вывод без перевода строки
Serial.println(value);              // Вывод с переводом строки
Serial.println(voltage, 2);         // Вывод float с 2 знаками после точки

if (Serial.available() > 0) {       // Проверка: есть ли входящие данные
  char c = Serial.read();           // Прочитать 1 байт
}


// ------------------------------------------------------------
// 10. МАТЕМАТИКА И ПРЕОБРАЗОВАНИЯ
// ------------------------------------------------------------

int v = map(value, 0, 1023, 0, 255);   // Пересчёт диапазона: 0..1023 → 0..255
int c = constrain(v, 0, 255);          // Ограничить значение в диапазоне
int a = abs(-5);                       // Модуль числа = 5
int mn = min(3, 7);                    // Минимум = 3
int mx = max(3, 7);                    // Максимум = 7
float p = pow(2, 3);                   // Степень: 2^3 = 8.0
float r = sqrt(16);                    // Корень = 4.0




// ------------------------------------------------------------
// 12. ЧТЕНИЕ НАПРЯЖЕНИЯ С ДЕЛИТЕЛЯ / ПОТЕНЦИОМЕТРА
// ------------------------------------------------------------

int raw = analogRead(A0);                    // 0..1023
float voltage = raw * (5.0 / 1023.0);        // Перевод в вольты


// ------------------------------------------------------------
// 13. ЧАСТЫЕ КОНСТАНТЫ
// ------------------------------------------------------------

HIGH / LOW          // 1 / 0 — уровни сигнала
INPUT / OUTPUT      // режимы пинов
INPUT_PULLUP        // вход с подтяжкой
true / false        // логические значения
LED_BUILTIN         // встроенный светодиод (обычно пин 13)
A0..A5              // аналоговые пины

// ------------------------------------------------------------
// 14. ПЕРЕСЧЕТ ИЗ ОДНОГО ДИАПАЗОНА В ДРУГОЙ
// ------------------------------------------------------------

map(value, fromLow, fromHigh, toLow, toHigh);
// value — значение, которое нужно пересчитать.
// fromLow, fromHigh — нижняя и верхняя границы исходного диапазона.
// toLow, toHigh — нижняя и верхняя границы целевого диапазона.
Made on
Tilda