ESP32: prvi program – LED dioda, taster i PWM
Kao kod Arduina, prvi program na novoj ploči je treptanje LED diode. Na ESP32 isti program izgleda skoro isto, ali postoje važne razlike: pinovi rade na 3,3 V, analogni ulaz je 12-bitni (0–4095), a jačina LED diode podešava se funkcijama ledc. U ovoj lekciji pišemo četiri kratka programa: treptanje, taster, „disanje“ LED diode i potenciometar.
Priprema: ESP32 u Arduino IDE-u

- U Arduino IDE-u otvori Tools → Board → Boards Manager, potraži esp32 i instaliraj paket esp32 by Espressif Systems.
- Izaberi ploču ESP32 Dev Module i port na koji je ploča povezana (Tools → Port).
- Ako se port ne pojavi, instaliraj drajver za USB čip na ploči (CP2102 ili CH340) – kao kod klonova Arduina.
- Ako slanje programa stane na poruci „Connecting…“, drži taster BOOT na ploči dok ne počne upisivanje.
Pinovi ESP32 ploče

| Pinovi | Za šta služe | Pazi na |
|---|---|---|
| GPIO2 | ugrađena plava LED dioda (na većini ploča) | – |
| GPIO4, 5, 13, 16–19, 21–23, 25–27, 32, 33 | digitalni ulazi i izlazi, PWM | 21 i 22 su I2C (SDA, SCL) |
| GPIO34, 35, 36, 39 | samo ulazi (analogni ulaz ADC1) | nemaju izlaz ni INPUT_PULLUP |
| GPIO0, 2, 12, 15 | rade, ali utiču na pokretanje ploče | ne vezuj na njih tastere ka GND pri uključivanju |
| GPIO6–11 | zauzeti (fleš memorija) | ne koristi ih |

Program 1: treptanje LED diode
Ugrađena LED dioda je na pinu GPIO2, pa za prvi program ne treba ništa da povezuješ. Za spoljnu LED diodu: duža nožica (anoda) preko otpornika 220 Ω na GPIO2, kraća na GND.
// ESP32 – prvi program: treptanje LED diode
const int LED_PIN = 2; // ugrađena plava LED dioda na većini DevKit ploča (GPIO2)
void setup() {
pinMode(LED_PIN, OUTPUT); // pin je izlaz
Serial.begin(115200); // ESP32 obično radi na 115200 bauda
Serial.println("Pocinje treptanje!");
}
void loop() {
digitalWrite(LED_PIN, HIGH); // upali (3,3 V na pinu)
delay(500);
digitalWrite(LED_PIN, LOW); // ugasi (0 V)
delay(500);
}
Otvori Serial Monitor i podesi brzinu na 115200 – tu je poruka iz setup(). Ako vidiš „čudne znakove“, brzina u monitoru nije ista kao u Serial.begin().
Program 2: taster
Taster vezujemo između GPIO13 i GND, bez otpornika: INPUT_PULLUP uključuje otpornik unutar čipa koji pin drži na HIGH. Kada pritisnemo taster, pin se spaja sa GND i čita se LOW.
// ESP32 – taster pali i gasi LED diodu
const int LED_PIN = 2;
const int TASTER_PIN = 13; // taster između GPIO13 i GND
bool ledUkljucena = false;
int prethodno = HIGH; // sa INPUT_PULLUP: nepritisnut = HIGH
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(TASTER_PIN, INPUT_PULLUP); // ugrađeni otpornik ka 3,3 V
Serial.begin(115200);
}
void loop() {
int sada = digitalRead(TASTER_PIN);
// reagujemo samo u trenutku pritiska (prelaz HIGH -> LOW)
if (prethodno == HIGH && sada == LOW) {
ledUkljucena = !ledUkljucena;
digitalWrite(LED_PIN, ledUkljucena ? HIGH : LOW);
Serial.println(ledUkljucena ? "LED: ukljucena" : "LED: iskljucena");
delay(30); // kratka pauza protiv „treperenja“ kontakta
}
prethodno = sada;
}
Program pamti prethodno stanje tastera i reaguje samo na promenu (prelaz HIGH → LOW). Da smo pisali samo if (sada == LOW), LED bi treperela dok držimo taster.
Program 3: PWM – jačina svetla
Pin može da bude samo uključen ili isključen. PWM (impulsno-širinska modulacija) ga uključuje i isključuje hiljadama puta u sekundi; ako je uključen veći deo vremena, LED nam izgleda jače. Na Arduinu je to analogWrite(), a na ESP32 funkcije ledcAttach() i ledcWrite().
// ESP32 – PWM: LED dioda se polako pali i gasi („disanje“)
// Arduino core 3.x: ledcAttach(pin, frekvencija, rezolucija) i ledcWrite(pin, vrednost)
const int LED_PIN = 2;
const int FREKV = 5000; // 5000 Hz – oko ne vidi treperenje
const int REZOLUCIJA = 8; // 8 bita: vrednosti od 0 do 255
void setup() {
ledcAttach(LED_PIN, FREKV, REZOLUCIJA);
}
void loop() {
for (int jacina = 0; jacina <= 255; jacina++) { // sve jače
ledcWrite(LED_PIN, jacina);
delay(8);
}
for (int jacina = 255; jacina >= 0; jacina--) { // sve slabije
ledcWrite(LED_PIN, jacina);
delay(8);
}
}
| Arduino Uno | ESP32 | |
|---|---|---|
| funkcija | analogWrite(pin, 0–255) | ledcWrite(pin, vrednost) |
| pinovi sa PWM | 6 pinova (~) | skoro svi izlazni pinovi |
| frekvencija | stalna (oko 490 Hz) | biramo (npr. 5000 Hz) |
| rezolucija | 8 bita (0–255) | biramo (1–14 bita) |
ledcAttach(pin, frekv, rez) piše se ledcSetup(kanal, frekv, rez) i ledcAttachPin(pin, kanal), a ledcWrite prima broj kanala. Verziju vidiš u Boards Manager-u.Program 4: potenciometar (analogni ulaz)
Potenciometar ima tri nožice: krajnje na 3V3 i GND, srednju na GPIO34. ESP32 ima 12-bitni analogno-digitalni pretvarač: analogRead() vraća broj od 0 do 4095 (kod Arduina Uno od 0 do 1023).
// ESP32 – potenciometar određuje jačinu LED diode
const int POT_PIN = 34; // ADC1, samo ulaz
const int LED_PIN = 2;
void setup() {
Serial.begin(115200);
ledcAttach(LED_PIN, 5000, 8);
}
void loop() {
int vrednost = analogRead(POT_PIN); // 0 .. 4095 (12-bitni ADC)
int jacina = map(vrednost, 0, 4095, 0, 255); // preračunavanje u 0 .. 255
ledcWrite(LED_PIN, jacina);
Serial.print("ADC: ");
Serial.print(vrednost);
Serial.print(" jacina: ");
Serial.println(jacina);
delay(100);
}
Funkcija map() preračunava broj iz jednog opsega u drugi: 0–4095 u 0–255. Primeti da analogni ulaz ESP32 nije savršeno linearan – blizu 0 V i 3,3 V vrednosti „zaostaju“. Za ovu vežbu to ne smeta.
Zadaci za vežbu
- Promeni program 1 tako da LED trepne dva puta brzo, pa jednom sporo (kao otkucaj srca).
- Dodaj u program 2 brojač pritisaka i ispiši ga u Serial Monitoru.
- Napravi semafor sa tri LED diode (GPIO 25, 26, 27, svaka sa otpornikom 220 Ω).
- Spoji programe 2 i 3: svaki pritisak tastera menja jačinu LED diode u krug: 0, 64, 128, 255.
Rešenje: jačina LED diode u četiri koraka
// taster menja jačinu LED diode: 0 -> 64 -> 128 -> 255 -> 0 ...
const int LED_PIN = 2;
const int TASTER_PIN = 13;
const int JACINE[4] = { 0, 64, 128, 255 };
int korak = 0;
int prethodno = HIGH;
void setup() {
pinMode(TASTER_PIN, INPUT_PULLUP);
ledcAttach(LED_PIN, 5000, 8);
ledcWrite(LED_PIN, JACINE[korak]);
}
void loop() {
int sada = digitalRead(TASTER_PIN);
if (prethodno == HIGH && sada == LOW) {
korak = (korak + 1) % 4; // posle poslednjeg ide prvi
ledcWrite(LED_PIN, JACINE[korak]);
delay(30);
}
prethodno = sada;
}
Proveri znanje
Otvori kviz
Kviz: ESP32 – LED dioda, taster i PWM
1. Koliki napon sme da se dovede na pin ESP32?
2. Koji opseg vraća analogRead() na ESP32?
3. Šta radi INPUT_PULLUP?
4. Kojim funkcijama se na ESP32 (paket 3.x) menja jačina LED diode?
