Потенциометр и АЦП
Читаем напряжение, рисуем график и выясняем, почему Wi-Fi мешает половине входов.
АЦП (аналого-цифровой преобразователь) измеряет напряжение от 0 до 3,3 В и выдаёт число от 0 до 4095 — у ESP32 он 12-битный. Подключите потенциометр, как показано справа, и покрутите ручку.
const int POT = 34;
void setup() {
Serial.begin(115200);
}
void loop() {
int raw = analogRead(POT); // 0…4095
int mv = analogReadMilliVolts(POT); // уже в милливольтах, с поправкой
Serial.printf("raw:%d mV:%d\n", raw, mv);
delay(50);
}Откройте Плоттер по последовательному соединению: строки вида имя:значение он рисует как графики с подписями.
АЦП1 и АЦП2: главный подвох
У ESP32 два АЦП. АЦП2 (GPIO0, 2, 4, 12–15, 25–27) занят радиомодулем, пока включён Wi-Fi, и analogRead() на этих выводах перестаёт работать. АЦП1 (GPIO32–39) работает всегда.
Правило простое: аналоговые датчики подключайте к GPIO32, 33, 34, 35, 36 (VP) или 39 (VN). Тогда скетч не сломается, когда вы добавите в проект Wi-Fi.
Точность
АЦП ESP32 нелинеен у краёв диапазона: точнее всего он измеряет примерно от 0,15 до 2,45 В, а около 3,1 В упирается в максимум 4095. Поэтому на краях хода потенциометра числа «залипают» на 0 и 4095 — это не поломка. Функция analogReadMilliVolts() учитывает заводскую калибровку чипа и даёт более честные милливольты, чем пересчёт raw * 3300 / 4095.
Не подавайте на входы больше 3,3 В. Чтобы измерить, например, 12 В аккумулятора, нужен резистивный делитель напряжения.
Показания немного «шумят». Сгладить их можно средним из нескольких измерений: сложите 16 значений analogRead() в цикле и разделите на 16.