Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование микроконтроллера Arduino в информационно-управляющих системах. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
Важно: На рисунках 30 и 31 видно, что при запуске симуляции на светодиод подается ток, хотя плата Arduino не подключена к питанию. Это происходит потому, что в симуляторе по умолчанию к плате Arduino подведено питание через USB тип-
В. Однако подсоединенный шнур не отображается в симуляторе для экономии места
рабочего пространства. Условно считается, что все платы Arduino, помещенные в рабочее пространство, питаются от USB тип-В (5В).
41
4 Краткий справочник языка Wiring
4.1 Структура программы на языке Wiring
Скетчи (программы для платформы Arduino) пишутся на языке «Wiring», основанном на языке С. По своей сути, Wiring – это обрезанная, упрощенная и
дополненная специальными функциями версия языка С. В данной главе будут
рассмотрены основные элементы языка Wiring, необходимые как для выполнения
комплекса лабораторных работ данного пособия, так и для создания скетчей
практически для любых проектов на базе Arduino.
Любая программа на языке С обязательно должна иметь функцию «main». Эта
функция, как следует из ее названия, является основной для программы, ведь при
запуске программы первым делом выполняются команды, находящиеся внутри этой
функции. Поэтому, функция main так же называется «точкой входа в программу».
В языке Wiring нет функции main, вместо нее есть сразу две других «основных» функций – «Setup» и «Loop». Обратите внимание на рисунок 32: при запуске ArduinoIDE, среда автоматически создает новый пустой файл скетча и генерирует функции Setup и Loop. Кроме того, в них помещаются комментарии – подсказки: «putyoursetupcodehere, torunonce» - поместите ваш setup-код здесь, чтобы выполнить его один раз; «putyourmaincodehere, torunrepeatedly» - поместите ваш основной код здесь, чтобы он выполнялся многократно.
42
Функции
Setup
Loop
Сколько раз выполняется
Один раз при запуске
программы
Бесконечное количество раз, сразу после выполнения функции
Setup
Рисунок 32 – Автоматически генерируемая «заготовка» для написания скетча
Рассмотрим подробнее функции Setup и Loop. В отличие от языка С, в Wiring «основная функция» и «точка входа в программу» – это две разные функции, а не одна – main. При запуске скетча, точкой входа в программу является функция Setup.
Операторы в ней выполняются один раз, после чего управление передается функции
Loop, операторы который выполняются в бесконечном цикле. В таблице 4 данная информация представлена нагляднее.
Таблица 4 – Сравнение функций Setup и Loop
43
Продолжение таблицы 4
Функции
Setup
Loop
Назначение
Точка входа в программу. Подходит для так
называемыхSetup-
функций, задающих параметры для последующей работы с основным кодом. Например, функция
pinMode(), задающая
режим работы цифровыхпинов. Эту функцию достаточно выполнить один раз перед тем как работать с
пином.
Аналог функции main.
Подходит для основного
кода программы.
Таким образом, вот так выглядит блок-схема любой программы для Arduino (рисунок 33). Обратите внимание, что для Loop не используется блок «ромб», так
как в данной схеме нет ветвления, и не используется блок «Цикл», так как
бесконечное повторение блока Loop в скетче происходит на аппаратном уровне, а не
программном, путем многократного чтения определенных сегментов памяти
микроконтроллера.
Рисунок 33 – блок-схема скетча на языке Wiring
44
Обратите внимание, что программа не запустится, если нет хотя бы одной из
Оператор
Назначение
Пример
=
Оператор присваивания. Присваивает переменной слева от оператора значение переменной, выражения или функции,
находящейся справа.
a = b; a = 2+2; a = digitalRead(11);
+
Арифметическоесложение.
a = a+2;
-
Арифметическое
вычитание.
a = a – 2;
*
Арифметическое
умножение.
a = a*2;
/
Целочисленное деление.
a = 9/2; //a будет равно 4
%
Остаток от деления.
a 9%2 //а будет равно 1
Оператор
Назначение
Пример
min()
Возвращает наименьшее из
двух значений.
c = min(a,b);
max()
Возвращает наибольшее из
двух значений.
c = max(a,b); abs()
Возвращает модуль числа.
a = abs(b);
функций Loop или Setup. Таким образом, «минимальная» программа для Arduino, которая может быть скомпилирована, загружена в память и запущена – это автоматически генерируемый шаблон (рисунок 32), т.е. пустые блоки Loop и Setup. Такая программа заставит Arduino просто простаивать, не выполняя никаких команд.
4.2 Арифметические операторы
В таблице 5 приведены основные арифметические операторы языка Wiring.
Таблица 5 – Арифметические операторы
4.3 Математические функции
В таблице 6 приведены основные математические функции языка Wiring.
Таблица 6 – Математические операторы
45
Оператор
Назначение
Пример
constrain()
Функция проверяет и, если необходимо, задает новое значение так, чтобы оно было в области допустимых значений, заданной
параметрами функции.
a = constrain(a, 1, 10);
//ограничивает значения a
диапазоном от 1 до 10. Если а, например, будет равно 17, то ему
присвоится новое значение – 10.
map()
Функция пропорционально переносит значение из текущего диапазона в новый
диапазон, заданный параметрами.
a = map(a, 0, 1023, 0, 255);
//в данном примере -
пропорционально переносит значения переменной а с аналогового
диапазона 0-1023 в цифровой 0-255.
Новое значение сохраняется в ту же
переменную (а), заменяя исходное.
pow()
Возводит в заданную
степень. Может возводить в дробную степень.
a = pow(a, 3) //возводит переменную a в куб
sq()
Возвращает квадрат числа.
a = sq(a);
sqrt()
Возвращает квадратный
корень числа.
a = sqrt(a);
sin()
Возвращает синус угла, заданного в радианах. Результат функции всегда в
диапазоне от -1 до 1.
b = sin(a);
cos()
Возвращает косинус угла, заданного в радианах. Результат функции всегда в
диапазоне от -1 до 1.
b = cos(a);
tan()
Возвращает тангенс угла, заданного в радианах в передаваемом параметре. Результат функции в диапазоне от минус бесконечность до плюс
бесконечность.
b = tan(a);
Продолжение таблицы 6
4.4 Управляющие операторы
В таблице 7 приведены управляющие операторы языка Wiring.
46
Таблица 7 – Управляющие операторы
Оператор
Назначение
Пример
if
if используется в сочетании
с другими операторами (например, с операторами
сравнения) и проверяет,
достигнута ли истинность
условия.
if (a>2) digitalWrite(13, HIGH);
if (b==a) { digitalWrite(13, LOW); b=2; }
if...else
В отличие от if, имеется ветвь else, выполняющаяся
в случае неистинности
проверяемого условия.
If (a>2) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); }
for
Цикл с параметром. Выполняется с указанием точного количества
повторений (итераций).
for (i=0; i <= 255; i++){
analogWrite(13, i);
delay(30 ;
}
switch… case
Аналогично конструкции if,
позволяет управлять работой программы путем проверки некоторого условия, при этом предоставляет удобство при работе с большим количеством альтернативных вариантов (а не только истинности или
ложности проверяемого условия).
switch (a) { case 1:
//выполняется, когда a равно 1 break; // использование break в конце //каждого case обязательно
case 2: //выполняется когда a равно 2 break; default:
// выполняется, если не выбрана ни
одна альтернатива
}
while
Цикл с предусловием. Выполняется, пока истинно условие. while(true); или while(1); также используется как бесконечный цикл, прерывающий выполнение программы (например, если необходимо, чтобы блок
Loop выполнился один раз,
то в конце блока следует
добавить while(1); )
while(a>b){ a=a+1; }
while(booleana){ if (b>2) a=false; }
//в данном случае, а является булевой
//переменной и может принимать
лишь //значения true или false, а также //являться условием для цикла while.
47
Продолжение таблицы 7
Оператор
Назначение
Пример
do... while
Цикл с постусловием. Выполняется, пока истинно
условие. В отличие от while,
условие проверяется в конце итерации. Таким образом, тело цикла будет выполнено хотя бы один раз, даже если
условие заведомо ложно.
do { delay(50); a = analogRead(3); } while (b < 100);
break
Break используется для принудительного выхода из
циклов for, while или do..while до их завершения.
Также используется для завершения работы
оператора switch.
for (i=0; i<= 255; i++){ analogWrite(13, i); delay(30); if (digitalRead(7)) break; }
continue
Continue пропускает
оставшиеся операторы в текущей итерации цикла и переходит к следующей
итерации.
for (a = 0; a < 255; a++){ if (digitalRead(7)) continue; digitalWrite(13, a); delay(30); }
goto
Перемещение выполнения программы к определенной
метке-указателю в самой
программе, при этом пропускается весь код до
самой метки.
metka: a=b+2; if (b==10) { gotometka; }
Оператор
Назначение
Пример
==
Равно.
if (a==b) digitalWrite(13, HIGH);
!=
Не равно.
if (a!=b) digitalWrite(13, HIGH);
<
Меньше.
if (a<2) digitalWrite(13, HIGH);
>
Больше.
if (a>4) digitalWrite(13, HIGH);
<=
Меньшеилиравно.
if (a<=b+1) digitalWrite(13, HIGH);
>=
Больше или равно.
if (a>=0) digitalWrite(13, HIGH);
4.5 Операторы сравнения
В таблице 8 приведены операторы сравнения в языке Wiring.
Таблица 8 – Операторы сравнения
48
Операторы сравнения используются в сочетании с управляющими
Оператор
Назначение
Пример
&&
Логическое И. Истина,
если оба операнда - истина.
if (a>b && b<10) digitalWrite(13, LOW);
||
Логическое ИЛИ. Истина, если хотя бы один операнд
- истина.
if (a>5 || a=0) digitalWrite(13, HIGH);
!
Логическое НО. Ложь, если
операнд – истина, и наоборот.
If (!a) digitalWrite(13, LOW); //в данном случае переменная а имеет //тип boolean.
Оператор
Назначение
Пример
++
Инкремент. Увеличивает значение переменной на
единицу.
for(i=0, i<=255, i++) { … } //наиболее распространенное //применение инкремента – в цикле //с параметром
--
Декремент. Уменьшат значение переменной на
единицу.
while(a>0) a--;
+=
a+=b;эквивалентa=a+b;
a+=2; //a=a+2;
-=
a-=b;эквивалентa=a-b;
a-=10; //a=a-10;
*=
a*=b;эквивалентa=a*b;
a*=b; //a=a*b;
/=
a/=b;эквивалентa=a/b;
a/=2; //a=a/2;
операторами и логическими операторами.
4.6 Логические операторы
В таблице 9 приведены логические операторы в языке Wiring.
Таблица 9 – Логические операторы
Логические операторы используются в сочетании с управляющими
операторами и операторами сравнения.
4.7 Унарные операторы
В таблице 10 приведены унарные операторы в языке Wiring.
Таблица 10 – Унарные операторы [1]
49
Унарные операторы являются короткими способами записи арифметических
Тип
Диапазон значений
Размер
boolean
true или false (1 или 0, HIGH или LOW)
1 байт
char
Один алфавитно-цифровой символ (литера)
1 байт
byte
От 0 до 255
1 байт
int
От -32768 до 32767
2 байта
word
От 0 до 65535
2 байта
long
От -2147483648 до 2147483647
4 байта
float
От -3,4028235E+38 до 3,4028235E+38
4 байта
double
От -3,4028235E+38 до 3,4028235E+38
Полный аналог float. Поддерживается Arduino
для совместимости кода с
другими платформами.
4 байта
string
Текстовая строка. Длина ограничивается объемом
оперативной памяти.
Ограничивается объемом оперативной
памяти.
void
Ключевое слово, используется в функциях вместо типа данных, если функция не должна
возвращать значение.
-
действий над переменными; были созданы и используются только для удобства; не
несут дополнительных функций и технически ничем не отличаются от своих
полных версий.
4.8 Типы данных и константы
В таблице 11 приведены основные типы данных в языке Wiring.
Таблица 11 – Типы данных [1]
В таблице 12 приведены константы в языке Wiring.
50
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]