Урок 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.