PinLab › Projekti › Zatemnilnik s potenciometrom
#03 Začetnik ⏱ 25 min

ESP32: Zatemnilnik s potenciometrom

Vrtiš gumb → LED postopoma sveti močneje. Dva nova pojma: analogni vhod (ADC, 0–4095) in analogni izhod prek PWM (0–255).

Odpri interaktivno v 3D →

Kaj se naučiš

analogRead in 12-bitni ADCPWM z ledcAttach / ledcWriteFunkcija map()Zakaj ADC1 (GPIO 32–39)

Potrebuješ

Kako deluje

Vhod: ESP32 nima »analognega očesa«, ima pa ADC — vezje, ki meri napetost in jo pretvori v število. 12 bitov → 4096 stopenj: 0 V = 0, 3,3 V = 4095. analogRead(34) vrne to število.

Izhod: digitalni pin pozna samo 0 ali 3,3 V. A če ga prižigaš in ugašaš zelo hitro (5 kHz), oko vidi povprečje. 25 % vklopljeno → šibek sij, 100 % → poln. To je PWM (Pulse Width Modulation). Z ledcAttach(pin, 5000, 8) povemo: 5000 Hz, 8 bitov (0–255). map() pretvori 0–4095 v 0–255.

Vezava

OdDoZakaj
ESP32 · 3V3Potenciometer, skrajni pin (stolpec 26)Zgornji konec upora na 3,3 V. NIKOLI 5 V — ADC prenese največ 3,3 V.
Potenciometer, skrajni pin (stolpec 24)letev −Spodnji konec na 0 V. Skozi cel potenciometer teče 3,3 V / 10 kΩ = 0,33 mA.
Potenciometer, srednji pin (stolpec 25)ESP32 · D34 (GPIO 34, ADC1)Drsnik »pobere« napetost 0–3,3 V glede na položaj. GPIO 34 je samo-vhodni ADC1 pin — idealen.
ESP32 · D18 (PWM)LED → 220 Ω → letev −PWM: pin se prižiga/ugaša 5000-krat na sekundo; odstotek »vklopljenega« časa = svetlost.
ESP32 · GNDletev −Skupna masa.

Korak za korakom

  1. LED (19c, 20c) + upor 20a → letev −.
  2. Potenciometer s tremi pini v 24c, 25c, 26c.
  3. 3V3 → 26a (rdeča), 24a → letev − (črna), 25a → D34 (zelena).
  4. D18 → 19a za LED. GND → letev −.
  5. Naloži kodo, odpri Serial Monitor. Vrtiš → številke se spreminjajo 0 … 4095 in LED jim sledi.

Koda (Arduino IDE)

// Projekt 3: Zatemnilnik — ADC vhod + PWM izhod
const int POT_PIN = 34;   // ADC1_CH6, samo vhod
const int LED_PIN = 18;

void setup() {
  Serial.begin(115200);
  // PWM: pin, frekvenca 5 kHz, ločljivost 8 bitov (0–255)
  ledcAttach(LED_PIN, 5000, 8);
  // Za Arduino-ESP32 core 2.x namesto zgornje vrstice:
  //   ledcSetup(0, 5000, 8); ledcAttachPin(LED_PIN, 0);  in 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);
}

Tipične težave

Vrednost trepeta za ±20? Normalno za ADC ESP32. Povpreči 10 branj.
Skrajni 3 % se »lepijo« na 0 in 4095 — ADC tam ni linearen.
Če pozneje dodaš WiFi — ADC2 pini (0,2,4,12–15,25–27) nehajo delovati. Zato GPIO 34.

Odpri interaktivno v 3D →

Več projektov (še 7) z brezplačno prijavo v tečaju. Projekti →