Использование функций в скетче

Узнайте, как определять и использовать функции в скетче.

Последнее обновление: 25.01.2022

Разбиение кода на функции позволяет программисту создавать модульные фрагменты кода, которые выполняют определённую задачу, а затем возвращают управление в то место программы, откуда функция была «вызвана». Типичная ситуация для создания функции — необходимость выполнить одно и то же действие несколько раз в программе.

Для программистов, привыкших работать с BASIC, функции в Arduino предоставляют (и расширяют) возможности подпрограмм (GOSUB в BASIC).

Стандартизация фрагментов кода в виде функций имеет несколько преимуществ:

  • Функции помогают программисту оставаться организованным. Зачастую это помогает концептуализировать программу.

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

  • Это также снижает вероятность ошибок при изменении кода, если код необходимо изменить.

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

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

Пример

Анатомия функции Arduino

Чтобы «вызвать» нашу простую функцию умножения, мы передаём ей параметры того типа данных, который она ожидает:

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();

Как видите, даже если функция не имеет параметров и не ожидается возврат значения, скобки ( и ) вместе с ; всё равно должны быть указаны.