Урок 11. Связываем analogRead() и analogWrite()

Перед тем как использовать аналоговые данные для управления другими компонентами в программе, может потребоваться масштабировать их или ограничить определёнными минимальными и максимальными значениями.

Допустим, вы хотите применить показания с аналогового входа для регулировки яркости светодиода через analogWrite() (см. в справочнике).

analogRead() возвращает числа в диапазоне от 0 до 1023, тогда как analogWrite() принимает значения только от 0 до 255. В подобной ситуации используется функция map(), позволяющая преобразовать диапазон analogRead() в диапазон, подходящий для analogWrite().

map(value, fromLow, fromHigh, toLow, toHigh) (см. в справочнике) — преобразует один диапазон значений в другой.

map() принимает четыре параметра:

  • значение, подлежащее масштабированию,

  • нижняя граница исходного диапазона,

  • верхняя граница исходного диапазона,

  • нижняя граница целевого диапазона,

  • верхняя граница целевого диапазона.

Вот небольшой пример:

int potPin = A0;
int ledPin = 9;

void setup(){
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop(){
  int analogVal = analogRead(potPin); // analogVal между 0 и 1023
  int scaledVal  = map(analogVal, 0, 1023, 0, 255); // масштабируемая величина 0 до 255
  Serial.print("analogVal = ");
  Serial.print(analogVal);
  Serial.print("   scaledVal = ");
  Serial.print(scaledVal);
  analogWrite(ledPin, scaledVal);
}

Также обратите внимание на constrain(x, a, b) (см. в справочнике) — ограничивает число x пределами a и b. Если x меньше a, функция возвращает a; если x больше b — возвращает b; в остальных случаях возвращает само x.