map()
Описание
Перепроецирует число из одного диапазона в другой. То есть значение fromLow будет отображено в toLow, значение fromHigh — в toHigh, промежуточные значения — в промежуточные значения и т.д.
Не ограничивает значения рамками диапазона, потому что значения вне диапазона иногда нужны и полезны. Функцию constrain() можно использовать до или после этой функции, если нужно ограничить значения диапазонами.
Обратите внимание, что «нижние границы» любого из диапазонов могут быть больше или меньше, чем «верхние границы», поэтому функция map() может использоваться для разворота диапазона чисел, например:
y = map(x, 1, 50, 50, 1);
Функция также корректно обрабатывает отрицательные числа, поэтому следующий пример тоже допустим и работает правильно.
y = map(x, 1, 50, 50, -100);
Функция map() использует целочисленную арифметику, поэтому не выдаёт дробных значений, даже когда математика их подразумевает. Дробные остатки отбрасываются, без округления или усреднения.
Синтаксис
Используйте следующую функцию для перепроецирования диапазона переменной в другой:
map(value, fromLow, fromHigh, toLow, toHigh)
Параметры
Функция принимает следующие параметры:
value: входная переменная с числом для перепроецирования.fromLow: нижняя граница текущего диапазона значения.fromHigh: верхняя граница текущего диапазона значения.toLow: нижняя граница целевого диапазона значения.toHigh: верхняя граница целевого диапазона значения.
Возвращаемое значение
Перепроецированное значение. Тип данных: long.
Пример кода
Перепроецирует 10-битное (0–1023) аналоговое входное значение в 8-битное (0–255) и управляет ШИМ-выходом на пине 9. Входные и выходные значения выводятся в Serial Monitor.
/* Перепроецировать аналоговое значение в 8 бит (от 0 до 255) */
void setup() {
Serial.begin(9600);
}
void loop() {
int val = analogRead(0);
Serial.print("Input value: ");
Serial.print(val);
val = map(val, 0, 1023, 0, 255); // функция перепроецирования
Serial.print(", Output value: ");
Serial.println(val);
analogWrite(9, val); // ШИМ-выход
delay(200);
}
Если подключить потенциометр к аналоговому пину (A0) и светодиод к пину 9, можно управлять яркостью светодиода поворотом потенциометра.
Приложение
Для тех, кто склонен к математике, ниже приведена вся функция целиком.
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;
}
Примечания и предупреждения
Предупреждение
Как уже упоминалось, функция map() использует целочисленную арифметику. Поэтому дроби могут отбрасываться. Например, дроби 3/2, 4/3, 5/4 — все будут возвращены функцией map() как 1, несмотря на их различные фактические значения. Поэтому, если ваш проект требует точных вычислений (например, напряжение с точностью до 3 знаков после запятой), не используйте map(), а реализуйте вычисления вручную в коде.