СОДЕРЖАНИЕ ►
Функция map в Ардуино переносит значение из текущего диапазона в новый диапазон значений, заданный параметрами — map(value, fromLow, fromHigh, toLow, toHigh). Команда map() оперирует только целыми числами. Дробная часть числа не округляется по правилами математики при пропорциональном переносе, а просто отбрасывается. Рассмотрим использование функции map в Arduino IDE с примерами.
Функция map в Arduino IDE
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega
- светодиод
- фоторезистор
- резисторы
- макетная плата
- коннекторы
map(value, fromLow, fromHigh, toLow, toHigh)
Параметры
- value: значение для переноса
- fromLow: нижняя граница текущего диапазона
- fromHigh: верхняя граница текущего диапазона
- toLow: нижняя граница нового диапазона
- toHigh: верхняя граница нового диапазона

Следующий пример программы демонстрирует применение функции мап. Светодиод должен светиться тем ярче, чем окружающее пространство темнее. То есть значение в функции analogWrite() должно быть обратно пропорционально значению с датчика освещенности analogRead(). Для этого необходимо инвертировать переменную value и установить новые границы, чтобы значение изменилось с 0/1023 на 255/0.
Ардуино map функция пример программы
void setup() { Serial.begin(9600); pinMode(A0, INPUT); // подключаем аналоговый датчик pinMode(10, OUTPUT); // подключаем светодиод } void loop() { // переменная "val" находится в интервале от 0 до 1023 int val = analogRead(A0); // преобразуем аналоговое значения в 8-битное число (от 255 до 0) val = map(val, 0, 1023, 255, 0); Serial.print(val); Serial.println(" val"); // включаем светодиод с новым значением val analogWrite(10, val); delay(100); }
Пояснения к коду:
- функция map может инвертировать диапазон, то есть «нижняя граница» может быть больше «верхней границы». Пример: map(val, 0, 1023, 255, 0);
Ардуино map float дробные числа
Напомним, что дробная часть числа при преобразовании с помощью функции map() не округляется, а просто отбрасывается (не учитывается). Этот факт следует учитывать при работе с типом данных float в языке программирования Ардуино. Для более точного измерения напряжения на аналоговом входе, следует использовать функцию float mapf в скетче. Не меняя схему из первого примера, загрузите следующий код.
void setup() { Serial.begin(9600); pinMode(A0, INPUT); // подключаем аналоговый датчик pinMode(10, OUTPUT); // подключаем светодиод } void loop() { // переменная "val" находится в интервале от 0 до 1023 int val = analogRead(A0); // преобразуем аналоговое значения в 8-битное число (от 0 до 255) val = map(val, 0, 1023, 0, 255); Serial.print(val); Serial.println(" val"); // включаем светодиод с новым значением val analogWrite(10, val); // функцией float mapf преобразуем данные с фоторезистора в вольты float data = mapf(val, 0, 1023, 0, 5); Serial.print(data); Serial.println(" V"); delay(100); } float mapf(float value, float fromLow, float fromHigh, float toLow, float toHigh) { float result; result = (value - fromLow) * (toHigh - toLow) / (fromHigh - fromLow) + toLow; return result; }
Пояснения к коду:
- на монитор порта будет выводитьcя переменная int val (значение яркости светодиода), а также переменная float data (значение напряжения, поступающего на аналоговый вход).










value = map(val, 0, 1023, 0, 255);
Скороей всего верней будет
value = map(value, 0, 1023, 0, 255);
Спасибо, исправили ошибку в примере
Стоит учесть, что в функции map используется 2 раза деление, а для avr микроконтроллеров это очень затратная по тактам операция (от 160 до 688 тактов, зависит от типа операндов). Так что функция очень медленная, и в те же прерывания ее ставить не следует.
Для этого необходимо инвертировать переменную value и установить новые границы, чтобы значение изменилось с 0/1023 на 255/0.
val = map(val, 0, 1023, 0, 255);
Serial.print(val);
Serial.println(» val»);
Вы задали новые границы, но не инвертировали.
Спасибо
У Вас провод воткнут на картинке в A0, а в коде A1
Исправили код с функцией мап
В схеме указан пин 9, а в коде пин 10