Аналоговые сигналы и АЦП

Мир аналоговый: свет, температура, влажность меняются плавно. Чтобы микроконтроллер их понял, нужен АЦП.

АЦП превращает непрерывное напряжение в число. Без него ESP32 видел бы только «включено/выключено», а не «насколько ярко» или «насколько тепло».

Цифровой вывод знает лишь два состояния. Но датчик света, температуры или влажности выдаёт аналоговый сигнал — напряжение, плавно меняющееся в диапазоне. Чтобы программа могла с ним работать, его нужно превратить в число. Этим занимается АЦП — аналого-цифровой преобразователь (по-английски ADC). Он измеряет входное напряжение и выдаёт целое значение.

Ключевой параметр — разрядность. У ESP32 АЦП обычно 12-битный: он делит весь диапазон напряжения на 2 в степени 12 = 4096 ступенек, от 0 до 4095. Значение 0 соответствует 0 В, 4095 — опорному напряжению (около 3,3 В). Зная это, мы переводим «сырое» число обратно в напряжение, а потом — в физическую величину.

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

   датчик (0..3.3 В) ---> [ АЦП 12 бит ] ---> число 0..4095
                                |
                  напряжение = код / 4095 * 3.3

Типичный аналоговый датчик света — фоторезистор в делителе напряжения. Чем ярче свет, тем меньше его сопротивление и тем другое напряжение приходит на вход АЦП. Программа читает код, переводит его в напряжение и принимает решение — например, включить лампу в темноте. Посчитаем это преобразование.

# Преобразование показаний АЦП ESP32 в напряжение и яркость

V_REF = 3.3        # опорное напряжение, В
MAX_CODE = 4095    # 12-битный АЦП: 0..4095

def adc_to_voltage(code):
    return code / MAX_CODE * V_REF

# Несколько показаний с датчика света
for raw in [0, 1024, 2048, 3072, 4095]:
    v = adc_to_voltage(raw)
    # грубо переведём напряжение в условную яркость 0..100%
    brightness = v / V_REF * 100
    print(f"код {raw:>4} -> {v:.2f} В -> яркость {brightness:.0f}%")

# Правило: включаем лампу, если темно (напряжение ниже порога)
THRESHOLD_V = 1.0
test_code = 800
v = adc_to_voltage(test_code)
print(f"\nПри коде {test_code}: {v:.2f} В")
print("Лампа: ВКЛ" if v < THRESHOLD_V else "Лампа: ВЫКЛ")

Запусти «Посчитай сам ▶». Ты видишь, как сырой код 0–4095 превращается в напряжение, а затем в осмысленное решение. Это сердце любого датчика в IoT.

Важно помнить про калибровку и нелинейность: АЦП ESP32 не идеально точен, особенно у краёв диапазона. Для серьёзных измерений показания усредняют по нескольким выборкам и при необходимости калибруют по эталону.

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

  • Подавать на АЦП больше опорного напряжения. Свыше ~3,3 В вход «упирается» в 4095 и можно повредить вход.
  • Доверять одному измерению. Шум искажает результат; усредняй несколько выборок.
  • Забыть про нелинейность. У краёв диапазона АЦП ESP32 врёт сильнее.

Best practices

  • Усредняй 8–16 выборок для стабильного значения.
  • Держи сигнал в комфортной середине диапазона, используя делитель.
  • Калибруй датчик по известной точке (например, известная освещённость или температура).

Где это встречается

АЦП — это орган чувств любого умного устройства. Микрофон, датчик газа, измеритель влажности почвы, фоторезистор, аналоговый джойстик — все они выдают напряжение, которое читает АЦП. Без него микроконтроллер был бы глух и слеп к плавным величинам окружающего мира и понимал бы только грубые «да/нет».

Обратная задача — превратить число в напряжение — решает ЦАП (цифро-аналоговый преобразователь). Он есть не у всех контроллеров, но у ESP32 присутствует и позволяет, например, синтезировать звук или плавно управлять аналоговыми устройствами. Вместе АЦП и ЦАП образуют мост между цифровым миром программ и аналоговым миром физики. И качество этого моста — разрядность, точность, скорость — напрямую определяет, насколько «честно» устройство воспринимает реальность.

Запомни главное

  • АЦП превращает аналоговое напряжение в число (0–4095 у 12-битного ESP32).
  • Код переводят в напряжение, а затем в физическую величину.
  • Усредняй несколько выборок и держи сигнал в середине диапазона.
  • Калибруй датчик по известной точке для точных измерений.

Итог: АЦП превращает аналоговое напряжение в число (0–4095 у 12-битного ESP32), которое мы переводим в напряжение и физическую величину. Это позволяет читать свет, тепло и влажность. Теперь у устройства есть мозг и органы чувств — пора дать ему голос: подключим его к сети.

Проверьте себя
1. Что делает АЦП (ADC) в микроконтроллере?
AУсиливает Wi-Fi
BПревращает аналоговое напряжение в число
CХранит программу
DПодаёт питание
2. 12-битный АЦП ESP32 выдаёт значения в диапазоне:
A0–1
B0–255
C0–4095
D0–65535