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

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 3377 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Функции[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();

См.также

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

  1. www.arduino.cc - Functions