7 min read 40 - 55 min practice

ESP32 Project 2 - Simple I/O

Hallo semuanya, jumpa lagi, pada project ke dua ini kita akan melakukan setidaknya ada dua eksperimen berikut:

  1. Simple I/O, menyalakan satu lampu LED dengan saklar push button
  2. Kita kembangkan dengan banyak lampu LED untuk membuat efek yang menarik

Baik, pertemuan perkuliahan hari ini sangat menarik, bagaimana microcontroller esp32 kita membaca sinyal baik itu digital (1/0) maupun analog (ada rentangnya). Namun pada project dua ini kita fokuskan terlebih dahulu pada sinyal digital ya. Jadi hasil akhirnya adalah jika kita tekan tombol push button maka lampu LED menyala begitupun jika kita lepas maka lampu LED mati.

Simple I/O

Eksperimen pertama ini mengacu pada referensi berikut ya https://randomnerdtutorials.com/esp32-digital-inputs-outputs-arduino/.

Komponen

Komponen yang perlu kita siapkan adalah sebagai berikut:

  1. Board esp32
  2. Breadboard
  3. Lampu LED 5mm 1 buah
  4. Resistor 200 ohm 1 buah
  5. Push button 1 buah
  6. Resistor 10k ohm 1 buah
  7. Kabel jumper male to male 5 buah

Rangkaian

Silahkan ikuti rangkaian berikut sesuai dengan referensi rujukan:

Rangkaian arus simple I/O
Gambar rangkaian arus simple I/O

Pada rangkaian tersebut GPIO5 bertindak sebagai OUTPUT menyalakan LED melalui arus resistor 200ohm menuju Ground, sementara GPIO 4 membaca sinyal push button melalui resistor 10K ohm ke ground, fungsi dari 10K ohm ini agar pembacaan tetap stabil saat tombol dilepas.

Berhubung esp32 yang saya miliki pin 3.3v dan GPIO 5 dan GPIO4 nya bersebrangan, dan hanya satu sisi saja yang bisa dipakai, jadi saya akalin belah dua breadboard bagian tengahnya , sebaiknya si beli breadboard lagi lalu sambung dengan sebelahnya karena sudah ga sabar sehingga sy belah dua, jangan ditiru ya..

Berikut hasil rangkaian yang saya lakukan:

Hasil rangkaian
Gambar rangkaian yang sesuai sketsa

Code

setelah berhasil terangkai dengan baik, code untuk menjalankan simple I/O tersebut dengan Arduiono IDE adalah sebagai berikut

// Complete Instructions: https://RandomNerdTutorials.com/esp32-digital-inputs-outputs-arduino/

// set pin numbers
const int buttonPin = 4;  // the number of the pushbutton pin
const int ledPin =  5;    // the number of the LED pin

// variable for storing the pushbutton status 
int buttonState = 0;

void setup() {
  Serial.begin(115200);  
  // initialize the pushbutton pin as an input
  pinMode(buttonPin, INPUT);
  // initialize the LED pin as an output
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // read the state of the pushbutton value
  buttonState = digitalRead(buttonPin);
  Serial.println(buttonState);
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH
  if (buttonState == HIGH) {
    // turn LED on
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off
    digitalWrite(ledPin, LOW);
  }
}

angka 115200 pada baris Serial.begin(115200) adalah Baud Rate, artinya mikrokontrell akan mengirim dan menerima data dengan kecepatan 115.200 bit per detik.

Okee, saatnya kita coba upload programnyaa..

Ujian tak pernah berhenti, sekarang lampu ga mau nyala sama sekali , bingung apa yang salah ya, coba upload ulang masih sama lampu tidak menyala, sampai mikir apa karna breadboardnya dibelah jadi ada yg konslet ya, yaudah saya coba ulang project 1 dengan menjalankan external LED, alhamdulillah menyala tanpa kendala.

Hmm, iseng coba upload sketch kosong terus upload ulang code simple I/O diatas, dan Alhamdulillah lampu LEDnya menyala tanpa ditekan push button ??? . Akhirnya rehat sejenak.. terus diulang lagi upload sketch kosong dan upload ulang code simple I/O, dan alhamdulillah udah ga begitu sensitif tapi terkadang masih suka nyala kalo ada aura tangan mendekat. Berikut video keberhasilan eksperimen ke satu ini.

Video Eksperimen Simple I/O berhasil dengan push button

Advance I/O

Pada eksperimen kedua advance I/O ini kita kembangkan dengan komponen LED yang lebih banyak dan kita coba bereksperimen menyalakan lampu led dengan ritme yang menarik.

Komponen

Pada eksperimen kedua ini kita menambahkan 3 lampu LED, sehingga seluruh komponen yang digunakan seperti ini:

  1. Board esp32
  2. Breadboard
  3. Lampu LED 5mm 4 buah
  4. Resistor 200 ohm 4 buah
  5. Push button 1 buah
  6. Resistor 10k ohm 1 buah
  7. Kabel jumper male to male 8 buah

Rangkaian

Rangkaian awal yang saya gunakan adalah sebagai berikut:

Hasil rangkaian
Gambar rancangan rangkaian awal advance I/O dengan 4 LED

Mirip dengan rangkaian sebelumnya, hanya pada rangkaian tersebut terdapat banyak output yakni dari GPIO5, GPIO17, GPIO18, PIO19 yang menyalakan LED melalui arus resistor 200ohm menuju Ground, sementara GPIO 4 membaca sinyal push button melalui resistor 10K ohm ke ground, fungsi dari 10K ohm ini agar pembacaan tetap stabil saat tombol dilepas.

Berikut hasil rangkaian awal yang saya lakukan:

Hasil rangkaian
Tampilan rangkaian awal advance I/O dengan 4 LED

sampai sini, baiknya lanjut aja dulu ke bagian code, tapi kalo penasaran sebenernya rangkaian awal tersebut GAGAL , penjelasannya dan buktinya ada di video code dibawah yaa.

Jadi ini adalah rancangan rangkaian kedua dengan menambahkan GND

Hasil rangkaian
Tampilan rangkaian kedua menambahkan GND advance I/O dengan 4 LED

Berikut adalah rancangan kedua yang telah saya susun

Hasil rangkaian
Tampilan hasil rangkaian kedua menambahkan GND advance I/O dengan 4 LED

Code

Code dibawah ini berguna untuk menyalakan lampu secara berurut dari lampu kesatu hingga keempat dengan delay 200ms ketika push button ditekan, ketika push button dilepas maka lampu akan mati

// Complete Instructions: https://RandomNerdTutorials.com/esp32-digital-inputs-outputs-arduino/

// set pin numbers
const int buttonPin = 4;  // the number of the pushbutton pin
const int ledPin1 =  5;    // the number of the LED pin
const int ledPin2 =  17;    // the number of the LED pin
const int ledPin3 =  18;    // the number of the LED pin
const int ledPin4 =  19;    // the number of the LED pin

// variable for storing the pushbutton status 
int buttonState = 0;

void setup() {
  Serial.begin(115200);  
  // initialize the pushbutton pin as an input
  pinMode(buttonPin, INPUT);
  // initialize the LED pin as an output
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
}

void loop() {
  // read the state of the pushbutton value
  buttonState = digitalRead(buttonPin);
  Serial.println(buttonState);
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH
  if (buttonState == HIGH) {
    // turn LED on
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);

    delay(500);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);

    delay(500);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin4, LOW);

    delay(500);
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, HIGH);
    
    delay(500);
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, HIGH);
    digitalWrite(ledPin3, HIGH);
    digitalWrite(ledPin4, HIGH);
  } else {
    // turn LED off
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW);
    digitalWrite(ledPin4, LOW);
  }
}

Berikut adalah video hasil eksperimen dari script diatas dengan rangkaian awal:

Video Eksperimen Advanced I/O gagal menggunakan rangkain awal dengan push button

Video tersebut menunjukkan ketika push button ditekan lampu yang menyala hanya lampu LED 1 dan LED 2 kemudian ketika push button dilepas LED nya tidak mati, malah looping menyalaa teruus. Ada apa lagii ini yaa, mulai lagi curiga dengan ESP32 nya apa rusak ya karena lampu merah LED builtin nya tidak menyala teruus. Udah pingin beli lagi baru, tapi tunggulah kita coba coba.

Jadi yang telah saya coba adalah, membuat rangkaian dan code yang tanpa perlu tekan push button agar LED menyala, hasilnya tetap saja, hanya LED 1 dan LED 2 yang menyala. Hmm, terlintas apa karena arusnya kurang yaa, jadi lampu LED 3 dan LED 4 nya ga kuat. Oke jadi sy tambahkan GND di ujung daan alhamdulillah ke empat lampunya berhasil menyala, sehingga sy rancang ulang rangkaian kedua seperti digambar atas sebelumnyaa ya pada bagian rangkaian.

daan bener dengan rangkain kedua programnya berjalan dengan baik:

Video Eksperimen Advanced I/O berhasil menggunakan rangkain kedua dengan push button

tapi sadar ga si, dari video tersebut sepertinya ada bug, soalnya pas push button itu dilepas lampu LED tidak mati, tapi menyelesaikan dahulu sekuensial loopnya baru mati.

Jadi sekarang kita coba buat animasi LED Knight dan perbaiki bug tersebut, dengan code berikut:

// Complete Instructions: https://RandomNerdTutorials.com/esp32-digital-inputs-outputs-arduino/

// set pin numbers
const int buttonPin = 4;  // the number of the pushbutton pin

const int ledPins[] = {5, 17, 18, 19}; 
const int numLeds = 4;

// variable for storing the pushbutton status 
int buttonState = 0;

void setup() {
  Serial.begin(115200);  
  // initialize the pushbutton pin as an input
  pinMode(buttonPin, INPUT);
  // initialize the LED pin as an output
  for (int i = 0; i < numLeds; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}

void loop() {
  // read the state of the pushbutton value
  buttonState = digitalRead(buttonPin);
  Serial.println(buttonState);
  if (buttonState == HIGH) {
    for (int i = 0; i < numLeds; i++) {
      if (digitalRead(buttonPin) == LOW) break; 
      
      digitalWrite(ledPins[i], HIGH);
      delay(200);
      digitalWrite(ledPins[i], LOW);
    }
    
    if (digitalRead(buttonPin) == HIGH) {
      for (int i = 0; i < numLeds; i++) digitalWrite(ledPins[i], HIGH);
      delay(300);
      for (int i = 0; i < numLeds; i++) digitalWrite(ledPins[i], LOW);
      delay(200);
    }
  } else {
    // turn LED off
    for (int i = 0; i < numLeds; i++) {
      digitalWrite(ledPins[i], LOW);
    }
  }
}

Taraa! Videonyaa berjalan dengan baaik

Video Eksperimen Advanced I/O dengan efek LED Knight

Kesimpulan

Project kedua ini, pelajaran yang bisa kita ambil, membuat lampu menyala tidak hanya sekadar soal menulis kode yang benar, tapi juga sangat bergantung pada rangkaian listrik yang tepat, saya rangkum sebagai berikut:

  1. Bahaya Floating Pin: Insiden lampu yang menyala sendiri saat didekati tangan pada eksperimen Simple I/O masih menjadi misterius
  2. Konektivitas Breadboard: Masalah pada eksperimen Advanced I/O di mana LED 3 dan 4 tidak menyala ternyata bukan karena ESP32 nya yang rusak. Setelah saya tambah Ground (GND) di ujung lampunya, alhamdulillah keempat lampu menyala.
  3. Logika Blocking pada Kode: Pada eksperimen Advance I/O ada bug di mana sistem terlambat merespons saat push button dilepas, solusinya tambah pengecekan kondisi secara iteratif (menggunakan break). Karena script delay membuat sistem keluar setelah siklus animasi looping selesai.

Oke sampai sini dulu ya laporannya, terimakasih sudah mampir kesini!

Bagaimana tanggapan Anda tentang tulisan ini?

Kembali ke daftar tulisan