Использование функций в скетче
Узнайте, как определять и использовать функции в скетче.
Последнее обновление: 25.01.2022
Разбиение кода на функции позволяет программисту создавать модульные фрагменты кода, которые выполняют определённую задачу, а затем возвращают управление в то место программы, откуда функция была «вызвана». Типичная ситуация для создания функции — необходимость выполнить одно и то же действие несколько раз в программе.
Для программистов, привыкших работать с BASIC, функции в Arduino предоставляют (и расширяют) возможности подпрограмм (GOSUB в BASIC).
Стандартизация фрагментов кода в виде функций имеет несколько преимуществ:
Функции помогают программисту оставаться организованным. Зачастую это помогает концептуализировать программу.
Функции закрепляют одно действие в одном месте, поэтому функцию нужно продумать и отладить лишь однажды.
Это также снижает вероятность ошибок при изменении кода, если код необходимо изменить.
Функции делают весь скетч меньше и компактнее, поскольку разделы кода используются многократно. Они упрощают повторное использование кода в других программах, делая его более модульным, а в качестве приятного побочного эффекта использование функций также нередко делает код более читаемым.
В скетче Arduino есть две обязательные функции: setup() и loop(). Остальные функции должны быть созданы вне фигурных скобок этих двух функций. В качестве примера создадим простую функцию для умножения двух чисел.
Пример
Чтобы «вызвать» нашу простую функцию умножения, мы передаём ей параметры того типа данных, который она ожидает:
void loop(){
int i = 2;
int j = 3;
int k;
k = myMultiplyFunction(i, j); // k теперь содержит 6
}
Наша функция должна быть объявлена вне любой другой функции, поэтому myMultiplyFunction() можно разместить как выше, так и ниже функции loop().
Весь скетч целиком будет выглядеть следующим образом:
void setup(){
Serial.begin(9600);
}
void loop() {
int i = 2;
int j = 3;
int k;
k = myMultiplyFunction(i, j); // k теперь содержит 6
Serial.println(k);
delay(500);
}
int myMultiplyFunction(int x, int y){
int result;
result = x * y;
return result;
}
Ещё один пример
Эта функция считает значение с датчика пять раз с помощью analogRead() и вычисляет среднее из пяти показаний. Затем она масштабирует данные до 8 бит (0–255) и инвертирует их, возвращая инвертированный результат.
int ReadSens_and_Condition(){
int i;
int sval = 0;
for (i = 0; i < 5; i++){
sval = sval + analogRead(0); // датчик на аналоговом пине 0
}
sval = sval / 5; // среднее значение
sval = sval / 4; // масштабирование до 8 бит (0 - 255)
sval = 255 - sval; // инверсия выходного сигнала
return sval;
}
Чтобы вызвать нашу функцию, достаточно присвоить её результат переменной.
int sens;
sens = ReadSens_and_Condition();
Как видите, даже если функция не имеет параметров и не ожидается возврат значения, скобки ( и ) вместе с ; всё равно должны быть указаны.