Arduino:Основы/Функции: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
Строка 23: | Строка 23: | ||
Чтобы вызвать эту умножающую функцию, мы передаем ей параметры. Эти параметры должны иметь тип данных, совместимый с этой функцией. | Чтобы вызвать эту умножающую функцию, мы передаем ей параметры. Эти параметры должны иметь тип данных, совместимый с этой функцией. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
void loop(){ | void loop(){ | ||
int i = 2; | int i = 2; | ||
Строка 37: | Строка 37: | ||
В итоге скетч будет выглядеть следующим образом: | В итоге скетч будет выглядеть следующим образом: | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
void setup(){ | void setup(){ | ||
Serial.begin(9600); | Serial.begin(9600); | ||
Строка 63: | Строка 63: | ||
Эта функция пять раз считывает значения с датчика при помощи функции [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogRead()|analogRead()]], а затем высчитывает среднее из этих пяти значений. Далее она подгоняет данные к '''8-битному формату''' (т.е. к диапазону '''от «0» до «255»'''), инвертирует их и возвращает инвертированный результат. | Эта функция пять раз считывает значения с датчика при помощи функции [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogRead()|analogRead()]], а затем высчитывает среднее из этих пяти значений. Далее она подгоняет данные к '''8-битному формату''' (т.е. к диапазону '''от «0» до «255»'''), инвертирует их и возвращает инвертированный результат. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
int ReadSens_and_Condition(){ | int ReadSens_and_Condition(){ | ||
int i; | int i; | ||
Строка 81: | Строка 81: | ||
Чтобы вызвать эту функцию, мы просто присваиваем ее переменной. | Чтобы вызвать эту функцию, мы просто присваиваем ее переменной. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
int sens; | int sens; | ||
Версия от 18:17, 14 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Функции[1]
Сегментирование кода по функциям позволяет программисту создавать модульные кусочки кода, выполняющие установленные задачи и возвращающие полученные результат в ту область кода, из которого эта функция была «вызвана». Типичная причина для использования функции – если программисту нужно выполнить в скетче одно и то же действие несколько раз.
Если вы из числа программистов, привыкших к 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();