1. Программирование Arduino — введение
2. Структура программы, константы
3. Цифровой ввод/вывод
4. Аналоговый ввод/вывод
5. Дополнительные функции ввода/вывода
6. Работа со временем
7. Математические
рассмотрим специфичные математические функции Arduino
min(x, y)
Описание:
Возвращает меньшее из двух чисел
Код:
#define min(a,b) ((a)<(b)?(a):(b))
Параметры:
x: первое число
y: второе число
Возвращаемое значение:
Меньшее число из двух
Пример:
sensVal = min(sensVal, 100); // sensVal не меняет значения, если он меньше 100 // получается, что sensVal не сможет превысить 100.
Примечание:
т.к. min(x, y) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов
Например:
min(a++, 100); // возможен неправильный результат
лучше так:
a++; min(a, 100);
max(x, y)
Описание:
Возвращает большее из двух чисел
Код:
#define max(a,b) ((a)>(b)?(a):(b))
Параметры:
x: первое число
y: второе число
Возвращаемое значение:
Большее число из двух
Пример:
sensVal = max(sensVal, 20); // sensVal не меняет значения, если он больше 20 // получается, что sensVal не сможет быть меньше 20.
Примечание:
т.к. max(x, y) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов
Например:
max(a--, 0); // возможен неправильный результат
лучше так:
a--; max(a, 0);
abs(x)
Описание:
Возвращает модуль (абсолютную величину) числа. (http://ru.wikipedia.org/wiki/Модуль_числа)
Код:
#define abs(x) ((x)>0?(x):-(x))
Параметры:
x: число
Возвращаемое значение:
x: если x больше или равен 0.
-x: если x меньше 0.
Примечание:
т.к. abs(x) – это макрос – не стоит использовать функции внутри скобок, чтобы избежать неправильных результатов
Например:
abs(a++); // возможен неправильный результат
лучше так:
a++; abs(a);
constrain(x, a, b)
Описание:
Проверяет находится ли число x в диапазоне (a,b)
Код:
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
Параметры:
x: число для проверки
a: нижняя грань диапазона
b: верхняя грань диапазона
Возвращаемое значение:
x: если x лежит между a и b
a: если x меньше, чем a
b: если x больше, чем b
Пример:
sensVal = constrain(sensVal, 10, 150); // ограничиваем интервал значений сенсора между 10 и 150
map(value, fromLow, fromHigh, toLow, toHigh)
Описание:
Отображает число из одного диапазона в другой.
Код (\hardware\cores\arduino\WMath.cpp):
long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }
Примечание:
Функция не проверяет – содержится ли число в необходимом диапазоне, поэтому можно вызвать функцию constrain() перед или после функции map().
Так же, "нижняя граница " диапазонов может быть больше или меньше, чем "верхняя граница", т.о. функция map() может быть использована, чтобы перевернуть диапазон чисел, например:
y = map(x, 1, 50, 50, 1);
функция так же может оперировать с отрицательными числами:
y = map(x, 1, 50, 50, -100);
Функция map() оперирует целыми числами, поэтому никаких десятичных значений не выдаётся. Дробные остатки отсекаются, а не округляются или усредняются.
Параметры:
value: число для отображения
fromLow: нижняя граница текущего диапазона числа value
fromHigh: верхняя граница текущего диапазона числа value
toLow: нижняя граница целевого диапазона
toHigh: верхняя граница целевого диапазона
Возвращаемое значение:
Целое число типа long
Пример:
/* отображает аналоговое значение к 8 битам (диапазон от 0 до 255) */ int val = analogRead(0); val = map(val, 0, 1023, 0, 255); analogWrite(9, val);
pow(base, exponent)
Описание:
Функция предназначена для возведения числа в заданную степень.
Параметры:
base: число(float)
exponent: степень(float)
Возвращаемое значение:
Результат возведения в степень (double)
Пример:
http://arduino.cc/playground/Main/Fscale
sq(x)
Описание:
Вычисляет квадрат числа: число умноженное на себя.
Код:
#define sq(x) ((x)*(x))
Параметры:
x: число
Возвращаемое значение:
Квадрат числа
sqrt(x)
Описание:
Вычисляет квадратный корень числа.
Параметры:
x: число
Возвращаемое значение:
Квадратный корень числа, тип double
Тригонометрия
sin(rad)
Описание:
Вычисляет синус угла (в радианах). Результат будет между -1 и 1.
Параметры:
rad: угол в радианах (float)
Возвращаемое значение:
Синус угла, тип double
Примечание:
Serial.print() и Serial.println() в версиях IDE до 0018 не поддерживали печати типа float.
cos(rad)
Описание:
Вычисляет косинус угла (в радианах). Результат будет между -1 и 1.
Параметры:
rad: угол в радианах (float)
Возвращаемое значение:
Косинус угла, тип double
Примечание:
Serial.print() и Serial.println() в версиях IDE до 0018 не поддерживали печати типа float.
tan(rad)
Описание:
Вычисляет тангенс угла (в радианах). Результат будет между плюс и минус бесконечностью 🙂
Параметры:
rad: угол в радианах (float)
Возвращаемое значение:
Тангенсс угла, тип double
Примечание:
Serial.print() и Serial.println() в версиях IDE до 0018 не поддерживали печати типа float.
читать далее: 8. Псевдослучайные числа
Ссылки
http://arduino.cc/en/Reference/HomePage (или же в каталоге ArduinoIDE \reference\HomePage.html )
4 комментария на «“Программирование Arduino — математические функции”»
в описании функции max(x,y) явные косяки
спасибо! пофиксил.
Согласно этой страницеофициальный сайт
Serial.print() и Serial.println() в настоящее время ПОДДЕРЖИВАЮТ печать типа float.
спасибо! данное замечание было верно на момент написание материала.