PinLab › Проекти › Димер со потенциометар
#03 Почетник ⏱ 25 мин

ESP32: Димер со потенциометар

Вртиш копче → LED-та постепено свети посилно. Два нови концепта: аналоген влез (ADC, 0–4095) и аналоген излез преку PWM (0–255).

Отвори го интерактивно во 3D →

Што учиш

analogRead и 12-битен ADCPWM со ledcAttach / ledcWriteФункцијата map()Зошто ADC1 (GPIO 32–39)

Потребно

Како работи

Влез: ESP32 нема „аналогно око“, но има ADC — коло што го мери напонот и го претвора во број. 12 бита → 4096 нивоа: 0 V = 0, 3.3 V = 4095. analogRead(34) го враќа тој број.

Излез: дигитален пин знае само 0 или 3.3 V. Но ако го палиш и гасиш многу брзо (5 kHz), окото гледа средна вредност. 25 % вклучено → слаб сјај, 100 % → полн. Тоа е PWM (Pulse Width Modulation). Со ledcAttach(pin, 5000, 8) велиме: 5000 Hz, 8 бита (0–255). map() ги претвора 0–4095 во 0–255.

Поврзување

ОдДоЗошто
ESP32 · 3V3Потенциометар, краен пин (колона 26)Горен крај на отпорникот на 3.3 V. НИКОГАШ 5 V — ADC трпи макс 3.3 V.
Потенциометар, краен пин (колона 24)− шинаДолен крај на 0 V. Низ целиот потенциометар тече 3.3 V / 10 kΩ = 0.33 mA.
Потенциометар, среден пин (колона 25)ESP32 · D34 (GPIO 34, ADC1)Лизгачот „зема“ напон 0–3.3 V според положбата. GPIO 34 е само-влез ADC1 пин — идеален.
ESP32 · D18 (PWM)LED → 220 Ω → − шинаPWM: пинот се пали/гаси 5000 пати во секунда; процентот на „вклучено“ време = сјај.
ESP32 · GND− шинаЗаедничка маса.

Чекор по чекор

  1. LED (19c, 20c) + отпорник 20a → − шина.
  2. Потенциометар со три пина во 24c, 25c, 26c.
  3. 3V3 → 26a (црвена), 24a → − шина (црна), 25a → D34 (зелена).
  4. D18 → 19a за LED-та. GND → − шина.
  5. Качи код, отвори Serial Monitor. Вртиш → броевите се менуваат 0…4095 и LED-та го следи.

Код (Arduino IDE)

// Проект 3: Димер — ADC влез + PWM излез
const int POT_PIN = 34;   // ADC1_CH6, само влез
const int LED_PIN = 18;

void setup() {
  Serial.begin(115200);
  // PWM: пин, фреквенција 5 kHz, резолуција 8 бита (0–255)
  ledcAttach(LED_PIN, 5000, 8);
  // За Arduino-ESP32 core 2.x наместо горниот ред:
  //   ledcSetup(0, 5000, 8); ledcAttachPin(LED_PIN, 0);  и ledcWrite(0, duty)
}

void loop() {
  int raw = analogRead(POT_PIN);          // 0 … 4095
  int duty = map(raw, 0, 4095, 0, 255);   // 0 … 255
  ledcWrite(LED_PIN, duty);

  Serial.printf("ADC: %4d  ->  PWM: %3d\n", raw, duty);
  delay(50);
}

Типични проблеми

Вредноста трепери за ±20? Нормално за ESP32 ADC. Просечувај 10 читања.
Крајни 3 % се „лепат“ на 0 и 4095 — ADC-то не е линеарно таму.
Ако подоцна додадеш WiFi — ADC2 пиновите (0,2,4,12–15,25–27) престануваат да работат. Затоа GPIO 34.

Отвори го интерактивно во 3D →

Повеќе проекти (уште 7) со бесплатна најава во курсот. Проекти →