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

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

1 void loop(){
2 int i = 2;
3 int j = 3;
4 int k;
5 
6 k = myMultiplyFunction(i, j); // переменная k теперь хранит «6»
7 }

Нашу функцию нужно объявить вне других функций, имеющихся в скетче. Таким образом, функцию myMultiplyFunction() можно поставить выше или ниже блока-функции loop().

В итоге скетч будет выглядеть следующим образом:

 1 void setup(){
 2   Serial.begin(9600);
 3 }
 4 
 5 void loop() {
 6   int i = 2;
 7   int j = 3;
 8   int k;
 9 
10   k = myMultiplyFunction(i, j); // переменная k теперь хранит «6»
11   Serial.println(k);
12   delay(500);
13 }
14 
15 int myMultiplyFunction(int x, int y){
16   int result;
17   result = x * y;
18   return result;
19 }

Еще пример

Эта функция пять раз считывает значения с датчика при помощи функции analogRead(), а затем высчитывает среднее из этих пяти значений. Далее она подгоняет данные к 8-битному формату (т.е. к диапазону от «0» до «255»), инвертирует их и возвращает инвертированный результат.

 1 int ReadSens_and_Condition(){
 2   int i;
 3   int sval = 0;
 4 
 5   for (i = 0; i < 5; i++){
 6     sval = sval + analogRead(0);    // датчик на аналоговом контакте 0 
 7   }
 8 
 9   sval = sval / 5;    // среднее
10   sval = sval / 4;    // подгонка под 8 бит (0 - 255)
11   sval = 255 - sval;  // инвертирование 
12   return sval;
13 }

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

1 int sens;
2 
3 sens = ReadSens_and_Condition();

См.также

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