Arduino:Основы/Функции

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Функции[1]

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

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

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

  • Функции помогают программисту быть организованнее, что способствует более широкому пониманию создаваемого скетча
  • Функция помещает одно действие в одном месте, поэтому работы по созданию и отладке функции нужно провести всего раз
  • Это также снижает шансы ошибок при модификации (если код по какой-то причине нужно изменить)
  • Благодаря функциям код, написанный в одном скетче, можно без особого труда использовать в другом, что делает такие скетчи более модульными. Кроме того, это имеет интересный побочный эффект – использование функций делает код более читаемым

Скетчу Arduino нужно как минимум две функции (их часто называют «блоками») – setup() и loop(). Прочие функции вписываются вне скобочек, обрамляющих две эти функции. К примеру, давайте создадим простую функцию, умножающую два числа.

Пример

Function anatomy.jpg

Чтобы вызвать эту умножающую функцию, мы передаем ей параметры. Эти параметры должны иметь тип данных, совместимый с этой функцией.

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

См.также

Внешние ссылки