Аналогові входи 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 размітка не підтримується! Використовуйте звичайтий текст.
    Погано           Добре
Стійка нейлонова М3 12мм + 6мм

Стійка нейлонова М3 12мм + 6мм

Стійка для кріплення усіляких електронних модулів до корпусу пристроюВисота стійки 12 ммДовжина зовн..

5.18грн.

Arduino функції та як з ними боротися

Arduino функції та як з ними боротися

Ця стаття із серії уроки Arduino. Тема цього уроку: Arduino функції і як з ними боротися.Ми дізнаємо..

Arduino повернення більше однієї змінної функції

Arduino повернення більше однієї змінної функції

Привіт друзі! З відео Arduino функції ми вже знаємо, що в функцію можна передавати багато змінних, а..

Отримання даних через UART Arduino Nano

Отримання даних через UART Arduino Nano

Усім користувачам контролерів Arduino відомо, що можна передавати дані через апаратний порт UART кон..

Sonoff basic розумний вимикач WiFi

Sonoff basic розумний вимикач WiFi

Напруга живлення 90 ... 250 В змінного струмуМаксимальний струм комутації 10 А..

308.20грн.