Chapter 3

Chapter 3: Program Pertama (Blink LED)

Sekarang kita akan membuat program pertama kita dari nol dan memahami setiap barisnya. Program klasik untuk pemula: Blink LED!

Struktur Program ESP32

Setiap program ESP32 di Arduino IDE memiliki 2 fungsi wajib:

void setup() {
  // Code yang dijalankan SEKALI saat ESP32 booting
}

void loop() {
  // Code yang dijalankan BERULANG-ULANG selamanya
}

Analogi:

  • setup() = Persiapan sebelum masak (cuci tangan, siapkan bahan)
  • loop() = Masak terus menerus tanpa henti

Buat file baru dan ketik code ini:

// Pin LED onboard ESP32
#define LED_PIN 2

void setup() {
  // Set pin LED sebagai OUTPUT
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);  // Nyalakan LED
  delay(1000);                   // Tunggu 1 detik (1000ms)
  digitalWrite(LED_PIN, LOW);   // Matikan LED
  delay(1000);                   // Tunggu 1 detik
}

Penjelasan Code

1. Define Pin

#define LED_PIN 2
  • #define = Buat konstanta (variable yang tidak berubah)
  • LED_PIN = Nama konstanta kita
  • 2 = GPIO pin 2 (LED onboard ESP32)

Kenapa pakai define?

  • Code lebih readable
  • Mudah diganti jika pakai pin lain
  • Tidak makan memory (compile time replacement)

2. Setup Function

void setup() {
  pinMode(LED_PIN, OUTPUT);
}
  • pinMode() = Set mode GPIO pin
  • Parameter 1: Pin yang diset (LED_PIN = 2)
  • Parameter 2: Mode pin (OUTPUT atau INPUT)

OUTPUT = Pin bisa mengirim sinyal (HIGH/LOW) INPUT = Pin bisa menerima sinyal dari sensor/button

3. Loop Function

void loop() {
  digitalWrite(LED_PIN, HIGH);  // Nyalakan LED
  delay(1000);                   // Tunggu 1 detik
  digitalWrite(LED_PIN, LOW);   // Matikan LED
  delay(1000);                   // Tunggu 1 detik
}

digitalWrite():

  • Mengirim sinyal HIGH (3.3V) atau LOW (0V) ke pin
  • HIGH = Nyalakan LED
  • LOW = Matikan LED

delay():

  • Pause program untuk beberapa milliseconds
  • delay(1000) = 1 detik
  • delay(500) = 0.5 detik

Upload & Test

  1. Ketik code di atas
  2. Klik Verify (icon centang) untuk check error
  3. Klik Upload (icon panah)
  4. Tunggu hingga upload selesai
  5. LED onboard harusnya berkedip setiap 1 detik!

Experiment Time! ๐Ÿงช

Coba ubah delay() values:

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(100);  // Cepat!
  digitalWrite(LED_PIN, LOW);
  delay(100);
}

Hasilnya: LED berkedip cepat (10x per detik)

Experiment 2: Pola SOS (Morse Code)

void loop() {
  // S = 3 short blinks
  for(int i=0; i<3; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    delay(200);
  }

  delay(400);

  // O = 3 long blinks
  for(int i=0; i<3; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(600);
    digitalWrite(LED_PIN, LOW);
    delay(200);
  }

  delay(400);

  // S = 3 short blinks
  for(int i=0; i<3; i++) {
    digitalWrite(LED_PIN, HIGH);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    delay(200);
  }

  delay(2000);  // Pause sebelum repeat
}

Hasilnya: LED blink pola SOS!

Experiment 3: Fade LED (PWM)

Buat LED nyala dengan brightness yang berubah-ubah:

#define LED_PIN 2

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // Fade in (0 โ†’ 255)
  for(int brightness = 0; brightness <= 255; brightness++) {
    analogWrite(LED_PIN, brightness);
    delay(5);
  }

  // Fade out (255 โ†’ 0)
  for(int brightness = 255; brightness >= 0; brightness--) {
    analogWrite(LED_PIN, brightness);
    delay(5);
  }
}

Hasilnya: LED fade in/out smooth!

Menambah External LED

Sekarang kita coba pakai LED external:

Hardware Setup:

ESP32 Pin 4  โ”€โ”€โ”€โ”€โ”€โ”€โ”
                   โ”‚
                   โ”œโ”€โ”€โ”€ LED (Anode/+)
                   โ”‚
                   โ””โ”€โ”€โ”€ Resistor 220ฮฉ
                        โ”‚
                        โ””โ”€โ”€โ”€ GND

Wiring:

  1. Kaki panjang LED (anode/+) โ†’ GPIO 4
  2. Kaki pendek LED (cathode/-) โ†’ Resistor 220ฮฉ โ†’ GND

Code:

#define INTERNAL_LED 2  // LED onboard
#define EXTERNAL_LED 4  // LED external

void setup() {
  pinMode(INTERNAL_LED, OUTPUT);
  pinMode(EXTERNAL_LED, OUTPUT);
}

void loop() {
  // Blink alternate
  digitalWrite(INTERNAL_LED, HIGH);
  digitalWrite(EXTERNAL_LED, LOW);
  delay(500);

  digitalWrite(INTERNAL_LED, LOW);
  digitalWrite(EXTERNAL_LED, HIGH);
  delay(500);
}

Hasilnya: Kedua LED blink bergantian!

Serial Monitor untuk Debugging

Tambahkan Serial.print() untuk debugging:

#define LED_PIN 2

void setup() {
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(115200);  // Start serial communication
  Serial.println("ESP32 Blink Program Started!");
}

void loop() {
  Serial.println("LED ON");
  digitalWrite(LED_PIN, HIGH);
  delay(1000);

  Serial.println("LED OFF");
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

Cara lihat Serial Monitor:

  1. Upload code
  2. Buka Tools โ†’ Serial Monitor
  3. Set baud rate: 115200
  4. Harusnya muncul text “LED ON” dan “LED OFF” bergantian

Common Mistakes & Fixes

โŒ LED Tidak Nyala

Penyebab:

  • Pin salah (cek pinout ESP32)
  • Wiring terbalik (cek polaritas LED)
  • Resistor terlalu besar (> 1kฮฉ)

Solusi:

  • Coba pin lain
  • Balik kaki LED
  • Pakai resistor 220ฮฉ atau 330ฮฉ

โŒ LED Redup

Penyebab:

  • Resistor terlalu besar

Solusi:

  • Kurangi nilai resistor (min 220ฮฉ untuk safety)

โŒ ESP32 Restart Terus

Penyebab:

  • Short circuit
  • Power tidak cukup

Solusi:

  • Check wiring
  • Gunakan USB port langsung (bukan USB hub)

Best Practices

  1. Selalu pakai resistor untuk LED (220ฮฉ - 1kฮฉ)
  2. Check polaritas LED (kaki panjang = positive)
  3. Use meaningful names untuk variables
  4. Add comments untuk code yang kompleks
  5. Test incrementally - jangan langsung code banyak

Kesimpulan

Sekarang Anda sudah bisa:

โœ… Membuat program blink LED โœ… Memahami struktur setup() dan loop() โœ… Menggunakan pinMode(), digitalWrite(), delay() โœ… Menambahkan external LED โœ… Debugging dengan Serial Monitor โœ… Experiment dengan berbagai pola blink

Di chapter selanjutnya, kita akan belajar GPIO lebih dalam: Input (Button) dan Output (Multiple LEDs).


Previous: โ† Chapter 2 - Setup Environment Next: Chapter 4 - GPIO Input & Output โ†’