ESP32: prvi program – LED dioda, taster i PWM

Lekcija 15 od 28 · Arduino i ESP32

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

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

Pinovi ESP32 ploče

Funkcije pinova ESP32 razvojne ploče
Funkcije pinova ESP32 razvojne ploče
PinoviZa šta služePazi na
GPIO2ugrađena plava LED dioda (na većini ploča)–
GPIO4, 5, 13, 16–19, 21–23, 25–27, 32, 33digitalni ulazi i izlazi, PWM21 i 22 su I2C (SDA, SCL)
GPIO34, 35, 36, 39samo ulazi (analogni ulaz ADC1)nemaju izlaz ni INPUT_PULLUP
GPIO0, 2, 12, 15rade, ali utiču na pokretanje pločene vezuj na njih tastere ka GND pri uključivanju
GPIO6–11zauzeti (fleš memorija)ne koristi ih
3,3 V, a ne 5 V! Na pin ESP32 nikada ne dovodi 5 V – oštetićeš čip. Senzori koji daju 5 V (npr. Echo kod HC-SR04 napajanog sa 5 V) vezuju se preko naponskog delitelja.
Raspored pinova ESP32 DevKit ploče sa 38 pinova
Raspored pinova ESP32 DevKit ploče sa 38 pinova

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 UnoESP32
funkcijaanalogWrite(pin, 0–255)ledcWrite(pin, vrednost)
pinovi sa PWM6 pinova (~)skoro svi izlazni pinovi
frekvencijastalna (oko 490 Hz)biramo (npr. 5000 Hz)
rezolucija8 bita (0–255)biramo (1–14 bita)
Starija verzija paketa (2.x): umesto 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

  1. Promeni program 1 tako da LED trepne dva puta brzo, pa jednom sporo (kao otkucaj srca).
  2. Dodaj u program 2 brojač pritisaka i ispiši ga u Serial Monitoru.
  3. Napravi semafor sa tri LED diode (GPIO 25, 26, 27, svaka sa otpornikom 220 Ω).
  4. 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?