Аналоговый ввод: потенциометр и analogRead

Кнопка знает только «да» и «нет». Потенциометр — это крутилка, которая отвечает на вопрос «насколько?» бесконечным числом оттенков.

Аналоговый ввод — это умение Arduino измерять напряжение, а не просто видеть «есть/нет». Крутишь ручку — получаешь число от 0 до 1023. Это глаза и уши всех датчиков.

Сейчас подключим потенциометр (переменный резистор-крутилку) и будем читать его положение числом. На этом принципе работают регуляторы громкости, джойстики и большинство датчиков.

Потенциометр — это делитель напряжения

   5V ----[ верхняя половина R ]----+---- A0  (сюда идёт измеряемое напряжение)
                                    |
                              (ползунок крутилки)
                                    |
   GND ---[ нижняя половина R ]-----+

  Крутим ручку -> меняется соотношение половин -> меняется напряжение на A0

У потенциометра три ножки: крайние на 5V и GND, средняя (ползунок) — на A0. Поворот ручки сдвигает ползунок, меняя, какую долю от 5 В мы снимаем со средней ножки. Это и есть делитель напряжения.

Делитель напряжения

        Vвых = Vпит * R2 / (R1 + R2)

   5V --[ R1 ]--+--[ R2 ]-- GND
                |
              Vвых (например, на A0)

Это фундаментальная схема всей электроники: два сопротивления делят напряжение пропорционально. У потенциометра R1 и R2 — это две части одной дорожки, которые меняются при повороте.

Код

void setup() {
  Serial.begin(9600);
}

void loop() {
  int value = analogRead(A0);   // 0..1023
  Serial.println(value);
  delay(100);
}

Как работает под капотом

Внутри чипа сидит АЦП (аналого-цифровой преобразователь). Он измеряет напряжение на пине и переводит его в число. У классической Uno АЦП 10-битный: диапазон 0–5 В превращается в число 0–1023 (2 в степени 10 = 1024 уровня). 0 В → 0, 5 В → 1023, 2.5 В → ~512. У Uno R4 АЦП может быть точнее (до 14 бит), но по умолчанию тоже отдаёт 0–1023.

# Та же логика на Python: напряжение -> число АЦП и обратно
def adc_from_voltage(volts, vref=5.0, max_value=1023):
    volts = max(0.0, min(vref, volts))
    return round(volts / vref * max_value)

def voltage_from_adc(value, vref=5.0, max_value=1023):
    return round(value / max_value * vref, 2)

for v in (0.0, 1.25, 2.5, 5.0):
    a = adc_from_voltage(v)
    print(v, "В ->", a, "-> снова", voltage_from_adc(a), "В")

Частые ошибки

  • Используют digitalRead вместо analogRead. Тогда получишь только 0 или 1, а не плавную шкалу.
  • Путают analogRead и analogWrite. Read — измерить (0–1023), Write — выдать ШИМ (0–255).
  • Крайние ножки потенциометра перепутаны местами. Не страшно — просто крутилка работает «наоборот».

Best practices

  • Открой монитор порта (Serial Monitor, 9600 бод) и смотри числа — это лучший способ понять, что читает плата.
  • Запомни магические границы: analogRead даёт 0–1023, analogWrite принимает 0–255. Их часто нужно «состыковать» функцией map().
  • Не подавай на аналоговый пин больше 5 В — это повредит АЦП.

Разрядность и что значат 1024 уровня

Почему именно 0–1023, а не 0–1000 или 0–100? Потому что АЦП хранит результат в двоичном виде, а 10 бит дают ровно 2 в степени 10 = 1024 разных значения (от 0 до 1023). Это называется разрядностью АЦП. Чем больше бит, тем мельче «ступенька» измерения: 10 бит на диапазоне 5 В дают шаг около 5 мВ — то есть плата различает изменения напряжения примерно в пять тысячных вольта. Для большинства датчиков этого с запасом достаточно.

У новых плат вроде Uno R4 АЦП можно перевести в режим повышенной разрядности (например, 14 бит — до 16383 уровней), что полезно для точных измерений. Но по умолчанию, ради совместимости со всем существующим кодом, analogRead везде отдаёт привычные 0–1023. Поэтому в учебных примерах мы всегда исходим из этого диапазона — и именно его подставляем в map(), когда переводим показания датчика в яркость или градусы.

Итоги

Потенциометр — это управляемый делитель напряжения. analogRead через АЦП превращает 0–5 В в число 0–1023. Так Arduino получает «чувство меры». Осталось научиться красиво перекладывать один диапазон в другой — это функция map().

Проверьте себя
1. Какой диапазон чисел возвращает analogRead на классической Uno?
A0–255
B0–1023
C0–100
DHIGH/LOW
2. Чем по сути является потенциометр в схеме?
AИсточником питания
BУправляемым делителем напряжения
CКонденсатором
DДиодом