analogRead()
Считывает напряжение на аналоговом входе и возвращает число типа int от 0 до 1023 — удобно для работы с потенциометрами, датчиками света и температуры.
Полная статья
Описание
analogRead() преобразует напряжение на аналоговом входе в целое число — это и есть суть работы аналого-цифрового преобразователя (ADC). Функция удобна везде, где нужно измерить непрерывный сигнал: уровень освещённости с фоторезистора, положение потенциометра, температуру с аналогового датчика.
Например, Arduino UNO оснащён 10-битным ADC: напряжение от 0 до +5 В преобразуется в число от 0 до 1023. Шаг квантования при этом составляет около 4,9 мВ — то есть функция различает изменения напряжения примерно в 5 мВ.
Диапазон входного напряжения можно сдвинуть с помощью analogReference(), а разрядность analogRead() на некоторых платах можно увеличить через analogReadResolution(). По умолчанию разрядность установлена в 10 бит для обратной совместимости.
Синтаксис
analogRead(pin)
Параметры
pin: номер или имя аналогового входного контакта, с которого нужно считать значение. На большинстве плат аналоговые входы обозначаются как A0, A1 и так далее.
Возвращает
Целое число типа int — результат преобразования. Диапазон зависит от разрядности ADC:
- 0–1023 при 10-битном разрешении
- 0–4095 при 12-битном разрешении
Чем выше напряжение на входе, тем больше возвращаемое значение.
Примеры кода
Следующий код считывает аналоговое значение с контакта analogPin и выводит его в монитор порта.
int analogPin = A3; // средний вывод потенциометра подключён к аналоговому пину 3
// крайние выводы подключены к GND и VCC
int val = 0; // переменная для хранения считанного значения
void setup() {
Serial.begin(9600); // инициализация serial
}
void loop() {
val = analogRead(analogPin); // считываем значение с входного пина
Serial.println(val); // отладочный вывод значения
delay(200);
}
Чтобы перевести «сырое» значение ADC в напряжение, используйте простую пропорцию: voltage = rawValue * (Vref / 1023.0) для 10-битного ADC. Если опорное напряжение равно 5 В, значение 512 будет примерно соответствовать 2,5 В.
Где применяется
- Потенциометр — регулировка яркости, скорости или любого другого параметра в зависимости от положения ручки.
- Фоторезистор или LDR — измерение уровня освещённости для автоматического управления подсветкой.
- Аналоговый датчик температуры (например, TMP36) — чтение напряжения, пропорционального температуре.
- Джойстик — считывание положения по двум осям через два аналоговых входа.
Практические замечания
- Вход без сигнала даёт случайные значения. Если к аналоговому входу ничего не подключено,
analogRead()будет возвращать хаотично меняющиеся числа — это нормальное поведение, а не ошибка. Причина — наводки от соседних цепей, электростатика и высокая чувствительность входа. - Время преобразования. Одно измерение занимает около 100 мкс, поэтому максимальная частота опроса — порядка 10 000 раз в секунду. Для большинства задач этого более чем достаточно.
- Напряжение не должно превышать рабочее. Подавать на аналоговый вход напряжение выше питания платы (обычно 5 В или 3,3 В) опасно: это может повредить микроконтроллер. Используйте делитель напряжения, если сигнал выходит за допустимый диапазон.
- Пересчёт в напряжение. Формула зависит от опорного напряжения:
voltage = rawValue * (Vref / 1023.0)для 10-битного ADC. Если опора 3,3 В — подставьте3.3, если 5 В —5.0. - Шумные показания. Если значения «прыгают» даже при стабильном сигнале, попробуйте усреднить несколько измерений подряд или добавить небольшой конденсатор (100 нФ) между аналоговым входом и GND.
На что обратить внимание
Показания analogRead() редко бывают идеально стабильными. Даже при постоянном напряжении значение может слегка колебаться из-за шума питания, длинных проводов, особенностей датчика или самой схемы. Для интерфейсов вроде потенциометра это обычно не проблема, а для измерительных задач лучше усреднять несколько чтений и следить за качеством земли и питания.