АЦП: читаем потенциометр и аналоговые датчики
Учимся измерять плавные сигналы — поворот ручки, яркость света, температуру.
АЦП (аналого-цифровой преобразователь, ADC) превращает напряжение на выводе в число, понятное программе.
Цифровое против аналогового
Цифровой вход видит только 0 или 1. Но потенциометр, фоторезистор, термистор выдают плавное напряжение от 0 до 3.3 В. АЦП измеряет это напряжение и переводит в число — например, от 0 до 4095.
Разрядность и диапазон
АЦП ESP32 — 12-разрядный. Это значит, что напряжение делится на 2^12 = 4096 уровней: от 0 (0 В) до 4095 (около 3.3 В при максимальном затухании). Посмотрим, как отсчёты переводятся в вольты:
def raw_to_voltage(raw, vref=3.3, bits=12):
max_value = (2 ** bits) - 1 # 4095
return raw / max_value * vref
for raw in (0, 1024, 2048, 3072, 4095):
v = raw_to_voltage(raw)
print(f"отсчёт {raw:4d} -> {v:.2f} В")Вывод:
отсчёт 0 -> 0.00 В отсчёт 1024 -> 0.83 В отсчёт 2048 -> 1.65 В отсчёт 3072 -> 2.48 В отсчёт 4095 -> 3.30 В
Код чтения на плате
from machine import Pin, ADC
import time
pot = ADC(Pin(34))
pot.atten(ADC.ATTN_11DB) # расширяем диапазон до ~3.3 В
pot.width(ADC.WIDTH_12BIT) # 12 бит -> 0..4095
while True:
raw = pot.read()
voltage = raw / 4095 * 3.3
print("отсчёт:", raw, " напряжение:", round(voltage, 2), "В")
time.sleep(0.5)Зачем atten (затухание)
Без настройки АЦП ESP32 измеряет лишь до ~1.1 В. Параметр atten(ADC.ATTN_11DB) добавляет внутреннее затухание, расширяя измеряемый диапазон примерно до 3.3 В. Это нужно почти всегда, иначе показания «упрутся» в потолок при низком напряжении.
Как работает под капотом
Внутри АЦП работает по принципу последовательного приближения: схема как бы «угадывает» напряжение, сравнивая его с эталонами и уточняя бит за битом — за 12 шагов получается 12-битное число. У ESP32 два блока АЦП, но ADC2 конфликтует с Wi-Fi — при включённой сети используйте выводы ADC1 (GPIO32–39). Точность АЦП ESP32 не идеальна: показания «шумят», и для аккуратных измерений их усредняют по нескольким отсчётам.
Частые ошибки
- Забыть
atten. Диапазон будет ~1.1 В, и значения «насытятся». - Брать вывод ADC2 при работающем Wi-Fi. Чтение зависнет или вернёт мусор — берите ADC1.
- Доверять одному отсчёту. Усредняйте 8–16 чтений для стабильности.
Итог
- АЦП превращает плавное напряжение в число (на ESP32 — 0–4095).
- Напряжение = отсчёт / 4095 × опорное (≈3.3 В).
atten(ADC.ATTN_11DB)расширяет диапазон до полного.- При Wi-Fi используйте ADC1 (GPIO32–39) и усредняйте показания.