Аналогові входи ESP32: особливості, приклади та рекомендації

Особливості АЦП ESP32

  • Кількість каналів: до 18 аналогових входів, але частина з них може бути недоступною під час роботи Wi-Fi або Bluetooth.
  • Розрядність: 12 біт (значення від 0 до 4095).
  • Діапазон напруги: 0–3,3 В.

ESP32 має два аналого-цифрових перетворювача: ADC1 і ADC2. Рекомендується використовувати ADC1 для точніших вимірювань, оскільки ADC2 конфліктує з Wi-Fi.

Приклад програми: читання аналогового значення

int sensorPin = 34; // Вхід ADC1int value = 0;void setup() {  Serial.begin(115200);}void loop() {  value = analogRead(sensorPin);  Serial.println(value);  delay(500);}

Настройка ADC: analogReadResolution и analogSetPinAttenuation

Для більш гнучкої роботи з АЦП в ESP32 можна використовувати додаткові функції налаштування:

analogReadResolution()

Ця функція дозволяє задати розрядність результату перетворення. За замовчуванням ESP32 має 12 біт (значення від 0 до 4095). Але у деяких випадках можна зменшити точність для прискорення обробки або спрощення обчислень.

  • analogReadResolution(9) → значення від 0 до 511.
  • analogReadResolution(10) → значення від 0 до 1023.
  • analogReadResolution(11) → значення від 0 до 2047.
  • analogReadResolution(12) → значення від 0 до 4095 (рекомендоване).

analogSetPinAttenuation()

Функція дозволяє змінювати атенюацію (ослаблення сигналу), щоб адаптувати вхідний діапазон напруги для конкретного піну. Це важливо, оскільки стандартний діапазон вимірювання ESP32 становить приблизно 0–1.1 В, але його можна розширити.

  • ADC_0db → діапазон 0–1.1 В (за замовчуванням, максимальна точність).
  • ADC_2_5db → діапазон 0–1.5 В.
  • ADC_6db → діапазон 0–2.2 В.
  • ADC_11db → діапазон 0–3.3 В (для роботи з повним діапазоном живлення).

Приклад коду


#include <Arduino.h>

void setup() {
  Serial.begin(115200);

  // Задаємо розрядність 12 біт (0-4095)
  analogReadResolution(12);

  // Розширюємо діапазон піну 34 до 3.3 В
  analogSetPinAttenuation(34, ADC_11db);
}

void loop() {
  int val = analogRead(34);
  Serial.println(val);
  delay(500);
}

Таким чином можна налаштувати точність і діапазон вимірювання для кожного аналогового входу ESP32 окремо.

Приклад з програмним фільтром сигналу

int sensorPin = 34;int filteredValue = 0;void setup() {  Serial.begin(115200);}void loop() {  int raw = analogRead(sensorPin);  filteredValue = (filteredValue * 9 + raw) / 10; // ковзне середнє  Serial.println(filteredValue);  delay(200);}

Таблиця пінів ADC ESP32

Канал Пін ESP32 ADC1/ADC2 Примітка
ADC1_CH0 GPIO36 ADC1 Працює завжди
ADC1_CH1 GPIO37 ADC1 Працює завжди
ADC1_CH2 GPIO38 ADC1 Працює завжди
ADC1_CH3 GPIO39 ADC1 Працює завжди
ADC1_CH4 GPIO32 ADC1 Рекомендується для сенсорів
ADC1_CH5 GPIO33 ADC1 Рекомендується для сенсорів
ADC2_CH0 GPIO4 ADC2 Не працює при ввімкненому Wi-Fi
ADC2_CH1 GPIO0 ADC2 Не працює при ввімкненому Wi-Fi
ADC2_CH2 GPIO2 ADC2 Не працює при ввімкненому Wi-Fi

Підводні камені ESP32 ADC

  • Нелінійність: значення АЦП можуть помітно відхилятися від реальної напруги.
  • Вплив Wi-Fi: під час передачі даних точність вимірювань знижується.
  • ADC1 і ADC2: у них різні характеристики, ADC2 практично не використовується для точних вимірювань.

Калібрування та покращення точності

  • Використовуйте esp_adc_cal для корекції вимірювань.
  • Вимикайте АЦП у режимі енергозбереження, коли він не потрібен.
  • Застосовуйте програмне фільтрування (ковзне середнє, медіана).

Висновки

Вбудовані АЦП ESP32 підходять для більшості побутових і IoT-застосувань: моніторинг напруги, датчики температури, освітленості, потенціометри. Але для завдань, де потрібна висока точність і стабільність, краще використовувати зовнішні спеціалізовані АЦП (наприклад, ADS1115).

<< Проекти << Усі товари >> Статті, уроки >>

Написати відгук

Примітка: HTML размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Розумний дім #10: Датчик CO2

Розумний дім #10: Датчик CO2

Розумний дім #10: Датчик CO₂ Контроль якості повітря в приміщенні — один із ключових ел..

Таймери Arduino UNO — Частина 1. Вступ

Таймери Arduino UNO — Частина 1. Вступ

Таймери Arduino UNO — Частина 1. Вступ Теорія Що таке таймер у мікроконтролері ATmega3..

Міні ESP32

Міні ESP32

Плата контролера ESP32. Цікавий мініатюрний формат WiFi Bluetooth контролера. Напруга живлення 5В ..

300.26грн.

Цикли 4 — Цикл do...while

Цикли 4 — Цикл do...while

Цикли 4 — Цикл do...while Вступ Цикл do...while — це різновид циклу while, але з однією ..

Модуль 2 — Основи електроніки: напруга, струм, опір і кнопковий ліхтарик

Модуль 2 — Основи електроніки: напруга, струм, опір і кнопковий ліхтарик

Модуль 2 — Основи електроніки (курс для початківців) Мета модуля: ознайомитися з базовими е..