Функция map в Arduino IDE

 

 

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

Пояснения к коду:

  1. функция 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;
}

Пояснения к коду:

  1. на монитор порта будет выводитьcя переменная int val (значение яркости светодиода), а также переменная float data (значение напряжения, поступающего на аналоговый вход).


8 Replies to “Функция map() в Arduino IDE, описание команды”

  1. value = map(val, 0, 1023, 0, 255);
    Скороей всего верней будет
    value = map(value, 0, 1023, 0, 255);

  2. Стоит учесть, что в функции map используется 2 раза деление, а для avr микроконтроллеров это очень затратная по тактам операция (от 160 до 688 тактов, зависит от типа операндов). Так что функция очень медленная, и в те же прерывания ее ставить не следует.

  3. Для этого необходимо инвертировать переменную value и установить новые границы, чтобы значение изменилось с 0/1023 на 255/0.
    val = map(val, 0, 1023, 0, 255);
    Serial.print(val);
    Serial.println(» val»);
    Вы задали новые границы, но не инвертировали.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.