Перейти к содержанию

Функция map в Ардуино, команда float mapf

Функция map в Ардуино, команда float mapf

Функция map в Ардуино переносит значение из текущего диапазона в новый диапазон значений, заданный параметрами. Команда map() в Arduino IDE работает только с целыми числами. Дробная часть числа не округляется в соответствии с математическими правилами пропорционального переноса, а просто отбрасывается и не учитывается. Попробуем использовать функцию map и map float в Arduino с примерами программ.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • светодиоды и резисторы
  • фоторезистор
  • макетная плата
  • коннекторы

Дополнительные материалы на эту тему:

  1. Функция random, randomseed в Ардуино
  2. Функция millis, многозадачность Ардуино
  3. Типы данных, типы переменных в Ардуино

Иногда значения, которые мы получаем на микроконтроллере при считывании данных с аналогового датчика, могут выходить за пределы нужного нам диапазона. И бывает необходимо перевести их в новый диапазон, чтобы правильно использовать данные в программе. Обратите внимание, что функция map Arduino IDE может также инвертировать диапазон, то есть «нижний предел» может быть больше «верхнего предела».

Функция map в Arduino описание, синтаксис

Функция map в Ардуино, команда float mapf

Синтаксис map:

  • map(value, fromLow, fromHigh, toLow, toHigh)

Параметры map:

  • value: значение для переноса
  • fromLow: нижняя граница текущего диапазона
  • fromHigh: верхняя граница текущего диапазона
  • toLow: нижняя граница нового диапазона
  • toHigh: верхняя граница нового диапазона

Пример программы с функцией map Arduino

Подключение светодиода и фоторезистора Ардуино

Следующий пример программы демонстрирует применение функции мап. Светодиод должен светиться тем ярче, чем окружающее пространство темнее. То есть значение в функции analogWrite должно быть обратно пропорционально значению с датчика освещенности (фоторезистора) analogRead. Необходимо инвертировать для этого value и установить новые границы, чтобы значение изменилось с 0/1023 на 255/0.

Скетч с фоторезистором и командой map Arduino


#define LED 10
#define LDR A1

int val, led;
 
void setup() {
  Serial.begin(9600); 
  pinMode(LDR, INPUT);
  pinMode(LED, OUTPUT);
}
 
void loop() {
  value = analogRead(LDR);
  Serial.println(val);

  led = map(val, 0, 1023, 255, 0);
  analogWrite(LED, led);
  delay(100);
}

Функция map float Arduino, дробные числа

В следующем примере данные с фоторезистора (значения от 0 до 1023) мы переведем в вольты (значения от 0 до 5) и выведем их на монитор порта. Чтобы значения были с дробным числом, для более точного измерения напряжения на аналоговом входе, следует использовать функцию float mapf в скетче. Не меняя схему из первого примера, загрузите следующую программу в микроконтроллер и откройте монитор порта Arduino IDE.

#define LED 10
#define LDR A1

int val, led;

void setup() {
  Serial.begin(9600);
  pinMode(LDR, INPUT);
  pinMode(LED, OUTPUT);
}

void loop() {
  val = analogRead(LDR);
  float data = mapf(val, 0, 1023, 0, 5);

  Serial.print(data);
  Serial.println(" V");

  led = map(val, 0, 1023, 255, 0);
  analogWrite(LED, led);
  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;
}

Заключение. При преобразовании переменной float с помощью map() дробная часть числа не округляется, а просто отбрасывается (не учитывается). Этот факт необходимо учитывать при работе с типом данных float в языке Arduino. Обратите внимание, что функция map использует деление на 2, что является очень затратной операцией. Поэтому функция работает очень медленно и не должна прерываться при запуске.

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

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

newzaym
➜