Не отступай и не сдавайся !!!
Ардуино, ESP32, ESP8266, LoRa. Обучение. Моделирование. Программирование под заказ.
Измерение и контроль параметров: температура, влажность, освещённость, давление, наличие напряжения, датчик движения, тревожная кнопка (дача, квартира, дом, цех, теплица, офис). Выдача измеренных параметров на персональную страницу в Интернете, на планшет, в смартфон. В случае выхода параметров за заданные границы - оповещение по электронной почте, sms.

Базовый курс программирования Ардуино на языке C++.

 

 

  • Подготовка технического задания для проекта!!!
  • Изготовление действующего макета проекта!!!
  • Дополнительные матеиалы
    • БИТОВЫЕ ОПЕРАЦИИ.
    • РАБОТА С РЕГИСТРАМИ. https://alexgyver.ru/lessons/registers/
    • УКАЗАТЕЛИ И ССЫЛКИ. https://alexgyver.ru/lessons/pointers/
    • РАБОТА С ДИНАМИЧЕСКОЙ ПАМЯТЬЮ. https://alexgyver.ru/lessons/dynamic-memory/
    • ОПТИМИЗАЦИЯ КОДА. https://alexgyver.ru/lessons/code-optimisation/
    • СТРУКТУРЫ И ПЕРЕЧИСЛЕНИЯ. https://alexgyver.ru/lessons/struct/
    • ОБЪЕКТЫ И КЛАССЫ. https://alexgyver.ru/lessons/class/
    • ПИШЕМ СВОЮ БИБЛИОТЕКУ. https://alexgyver.ru/lessons/library-writing/
    • ОПТИМИЗАЦИЯ КОДА. https://alexgyver.ru/lessons/code-optimisation/

 

Установка и настройка Arduino IDE на компьютер.

Оглавление >>>

Структура программы Ардуино.

Структура программы Ардуино  достаточно проста и состоит из 3-х частей: область описания глобальных переменных, модулей setup() и loop(). В минимальном варианте состоит из двух частей - модулей setup() и loop().


// Описание глобальных переменных, подключаемых модулей и библиотек

#define PinBlink  13  // Встроенный светодиод. Диагностическая индикация режима работы
#define PinRele   12  // Pin управления реле
#define PinKnopka 11  // Pin для анализа состояния кнопки

void setup() { // выполняется один раз при запуске программы
  pinMode(PinBlink,  OUTPUT);
  pinMode(PinRele,   OUTPUT);
  pinMode(PinKnopka, INPUT_PULLUP);
}

void loop() { // выполняется постоянно в цикле
  // основной код, выполняется в цикле
}

Функция setup() выполняется один раз, при включении питания или сбросе контроллера. Обычно в ней происходят начальные установки переменных, регистров. Функция должна присутствовать в программе, даже если в ней ничего нет.

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

Оглавление >>>

Первоначальные правила синтаксиса языка C.

Учебную программу скачать.

;  точка с запятой  Выражения могут содержать сколь угодно много пробелов, переносов строк. Признаком завершения выражения является символ ”точка с запятой ”.

z = x + y;       // Вычисление результата. Как увеличить количество пробелов

Serial.print(z);    // Вывод на экран результата

 

{   }  фигурные скобки определяют блок функции или выражений. Например, в функциях setup() и loop().

/* … */ блок комментария, обязательно закрыть.

/* это блок      комментария  */

// однострочный комментарий, закрывать не надо, действует до конца строки.

// это одна строка комментария

Оглавление >>>

Переменные и типы данных.

Учебную программу скачать.

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

Тип данных Разрядность, бит Диапазон чисел
boolean 8 true, false
char 8 -128 … 127
unsigned char 8 0 … 255
byte 8 0 … 255
int 16 -32768 … 32767
unsigned int 16 0 … 65535
word 16 0 … 65535
long 32 -2147483648 … 2147483647
unsigned long 32 0 … 4294967295
short 16 -32768 … 32767
float 32 -3.4028235+38 … 3.4028235+38
double 32 -3.4028235+38 … 3.4028235+38

Типы данных выбираются исходя из требуемой точности вычислений, форматов данных и т.п. Не стоит, например, для счетчика, считающего до 100, выбирать тип long. Работать будет, но операция займет больше памяти данных и программ, потребует больше времени.

 

Объявление переменных.

При объявлении переменной сначала указывается тип данных, а затем имя переменной.

int   x;         // объявление переменной с именем x типа int
float widthBox;  // объявление переменной с именем widthBox типа float

Все переменные должны быть объявлены до того, как они будут использоваться. Переменная может быть объявлена в любой части программы, но от места объявления зависит, какие блоки программы могут её использовать — это называется областью видимости.

Переменные, объявленные в начале программы (до функции void setup()), считаются глобальными и доступны в любом месте программы. Локальные переменные объявляются внутри функций или таких блоков, как цикл for, и могут использоваться только внутри этих блоков. Допускаются переменные с одинаковым именем, но с разными областями видимости.

int mode;  // переменная mode доступна всем функциям

void setup() {
  // пустой блок, начальные установки не требуются
}

void loop() {
  long count;  // переменная count доступна только в функции loop()

  for (int i = 0; i < 10; i++) { // переменная i доступна только внутри цикла
  }
}

При объявлении переменной можно задать её начальное значение — проинициализировать её.

int  x = 0;    // переменная x с начальным значением 0
char d = 'a';  // переменная d с начальным значением, равным коду символа 'a'

При арифметических операциях с разными типами данных происходит автоматическое преобразование типов. Но лучше всегда использовать явное преобразование — так код понятнее и надёжнее.

int  x;  // переменная int
char y;  // переменная char
int  z;  // переменная int

z = x + (int) y;  // переменная y явно преобразована в int
Оглавление >>>

Системы счисления (двоичная, восьмеричная, десятичная, шестнадцатиричная).

Учебную программу скачать.

Подробная информация.

Примеры позиционных систем счисления (вес цифры зависит от её положения в числе).

Название Основание Цифры Примечание
Двоичная (бинарная) 2 0 1  
Воьмеричная (Octal) 8 0 1 2 3 4 5 6 7  
Десятичная (Decimal) 10 0 1 2 3 4 5 6 7 8 9  
Шестнадцатиричная (Hexadecimal) 16 0 1 2 3 4 5 6 7 8 9 A B C D E F  
Оглавление >>>

Арифметические операции.

Учебную программу скачать.

= присваиваниее
+ сложение
- вычитание
* произведение
/ деление
% остаток от деления
Оглавление >>>

Операции отношения.

Учебную программу скачать.

== равно
!= не равно
< меньше
> больше
<= меньше или равно
>= больше или равно
Оглавление >>>

Логические операции.

Учебную программу скачать.

&& логическое И
|| логическое ИЛИ
! логическое НЕ
Оглавление >>>

Операции над указателями.

Учебную программу скачать.

* косвенная адресация
& получение адреса переменной
Оглавление >>>

Битовые операции.

& И
| ИЛИ
^ ИСКЛЮЧАЮЩЕЕ ИЛИ
~ ИНВЕРСИЯ
<< СДВИГ ВЛЕВО
>> СДВИГ ВПРАВО
Оглавление >>>

Операции смешанного присваивания.

Учебную программу скачать.

++ + 1 к переменной
-- - 1 к переменной
+= сложение
-= вычитание
*= умножение
/= деление
%= остаток от деления
&= битовое И
|= битовое ИЛИ
Оглавление >>>

Выбор вариантов, управление программой.

Учебную программу скачать.

Выбор вариантов, управление программой.

Оглавление >>>

Оператор условного перехода IF ...

// Оператор IF проверяет условие в скобках и выполняет последующее выражение
// или блок в фигурных скобках, если условие истинно.

if (x == 5)      // если x == 5, выполняем z = 0
  z = 0;

if (x > 5) {     // если x > 5, выполняем блок
  z = 0;
  y = 8;
}
Оглавление >>>

Оператор условного перехода IF ... ELSE ....

// IF … ELSE — выбор между двумя вариантами

if (x > 5) {        // если x > 5, выполняем этот блок
  z = 0;
  y = 8;
}
else {                // в противном случае выполняем этот блок
  z = 0;
  y = 0;
}
Оглавление >>>

Оператор условного перехода IF ... ELSEIF ... .

// ELSE IF — позволяет сделать множественный выбор

if (x > 5) {        // если x > 5, выполняем этот блок
  z = 0;
  y = 8;
}
else if (x > 20) { // иначе, если x > 20, выполняем этот блок
  // (пустой блок — условие выполнено, но действий нет)
}
else {                // в противном случае выполняем этот блок
  z = 0;
  y = 0;
}
Оглавление >>>

Оператор условного перехода SWITCH CASE ... .

// SWITCH CASE — множественный выбор. Сравнивает переменную (в примере x)
// с несколькими константами (5 и 10) и выполняет блок, где переменная равна константе.

switch (x) {

  case 5:
    // код выполняется, если x == 5
    break;

  case 10:
    // код выполняется, если x == 10
    break;

  default:
    // код выполняется, если не совпало ни одно предыдущее значение
    break;

}
Оглавление >>>

Массивы.

// Массив — это область памяти, где последовательно хранятся несколько переменных.

// Объявляется массив так:
int   ages[10];    // массив из 10 переменных типа int
float weight[100]; // массив из 100 переменных типа float

// При объявлении массивы можно инициализировать:
int ages[10] = { 23, 54, 34, 24, 45, 56, 23, 23, 27, 28 };

// Обращаются к переменным массивов так:
x = ages[5];    // x присваивается значение из 5-го элемента массива
ages[9] = 32; // 9-му элементу массива задаётся значение 32

// Нумерация элементов массивов всегда с нуля.
Оглавление >>>

Оператор цикла FOR ... .

// Цикл FOR. Конструкция позволяет организовывать циклы с заданным количеством итераций.
// Синтаксис:

for ( действие до начала цикла; условие продолжения цикла; действие в конце каждой итерации ) {
  // код тела цикла
}

// Пример цикла из 100 итераций:
for (i = 0; i < 100; i++) { // начальное значение 0, конечное 99, шаг 1
  sum = sum + i;
}
Оглавление >>>

Оператор цикла WHILE ... .

// Цикл WHILE. Оператор позволяет организовывать циклы с конструкцией:

while ( выражение ) {
  // код тела цикла
}

// Цикл выполняется до тех пор, пока выражение в скобках истинно.
// Пример цикла на 10 итераций:
x = 0;
while (x < 10) {
  // код тела цикла
  x++;
}

// DO WHILE — цикл с условием на выходе.

do {
  // код тела цикла
} while ( выражение );

// Цикл выполняется, пока выражение истинно.
Оглавление >>>

Оператор выхода из цикла BREAK ... .

// BREAK — оператор выхода из цикла. Используется для того, чтобы прервать выполнение циклов for, while, do while.

x = 0;
while (x < 10) {
  if (z > 20) break; // если z > 20, то выйти из цикла
  // код тела цикла
  x++;
}
Оглавление >>>

Оператор пропуска операторов до конца тела цикла CONTINUE... .

// CONTINUE — пропуск операторов до конца тела цикла.

x = 0;
while (x < 10) {
  // код тела цикла
  if (z > 20) continue; // если z > 20, вернуться на начало тела цикла
  // код тела цикла
  x++;
}
Оглавление >>>

Оператор безусловного перехода GOTO ... .

// GOTO — оператор безусловного перехода.

goto metka1; // переход на metka1
// … (здесь может быть любой код)

metka1:
Оглавление >>>

Функции.

Учебную программу скачать.

Функции позволяют выполнять одни и те же действия с разными данными. У функции есть:

  • имя, по которому ее вызывают;
  • аргументы – данные, которые функция использует для вычисления;
  • тип данных, возвращаемый функцией.

Описывается пользовательская функция вне функций setup() и loop().

void setup() {
  // код выполняется один раз при запуске программы
}

void loop() {
  // основной код, выполняется в цикле
}

// объявление пользовательской функции с именем functionName
type functionName(type argument1, type argument2, …, type argumentN) {
  // тело функции
  return ();
}
// Пример функции, вычисляющей сумму квадратов двух аргументов.

int sumQwadr(int x, int y) {
  return (x * x + y * y);
}

// Вызов функции происходит так:
d = 2;
b = 3;
z = sumQwadr(d, b); // в z будет сумма квадратов переменных d и b

Функции бывают встроенные, пользовательские, подключаемые.

Очень коротко, но этих данных должно хватить для того, чтобы начать писать программы на C для систем Ардуино.

Последнее, что я хочу рассказать в этом уроке, как принято оформлять программы на C. Думаю, если вы читаете этот урок в первый раз, стоит пропустить этот раздел и вернутся к нему позже, когда будет что оформлять.

Оглавление >>>

Рекомендации по оформлению программ на языке C.

Учебную программу скачать.

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

Имена в языке C.

Имена, представляющие типы данных, должны быть написаны в смешанном регистре. Первая буква имени должна быть заглавная (верхний регистр).

Signal, TimeCount

Переменные должны быть записаны именами в смешанном регистре, первая буква строчная (нижний регистр).

signal, timeCount

Константы должны быть записаны в верхнем регистре. В качестве разделителя нижнее подчеркивание.

MAX_TEMP, RED

Методы и функции должны быть названы глаголами, записанными в смешанном регистре, первая буква в нижнем регистре.

getTime, setTime

Оглавление >>>

Дополнительные материалы.


© 2000 - 2026
Хостинг нашего сайта осуществляется узлом www.cherepovets-city.ru