Ep 2 : Input & Output in ESP32

Bonaventura Bagas Sukarno
7 min readFeb 7, 2021

--

Input determines Output
-Kuldeep Singh

Basic dari sebuah sistem teknologi salah satunya adalah bagaimana input dan output (I/O) saling mempengaruhi. Pada berbagai device teknologi yang kita gunakan sehari-hari (e.g. phone, speaker, keyboard, etc.) mengharuskan kita untuk melakukan metode input tertentu agar dikeluarkan output yang diinginkan.

ESP32 DevKit GPIO (www.studiopieters.nl)

Pada microcotroller ESP32 board, terdapat pin input dan output yang berfungsi untuk melakukan suatu fitur. Pin-pin ini disebut General Purpose Input Output atau GPIO. GPIO dapat diatur untuk menentukan input dan output yang diberikan melalui kode program sehingga spesifikasi projek tercapai. Referensi penggunaan GPIO dapat dilihat di : ESP32 Pinout Reference: Which GPIO pins should you use? | Random Nerd Tutorials

I/O dapat dibedakan menjadi sinyal digital dan analog. Sinyal digital hanya berada dalam 2 kondisi, yaitu ON dan OFF — seperti nilai diskrit atau variabel boolean dalam pemrograman — . Sedangkan sinyal analog berada dalam kondisi yang continue.

Pada blog ini, bagian pertama akan dibahas project ESP32 berkaitan dengan digital I/O yang menerima input dari push button untuk menentukan output pada LED.

Things used in this project

  1. ESP32 — DevKitC
  2. BreadBoard
  3. Kabel jumper male-to-male (8 pcs)
  4. 3mm LED (4 pcs)
  5. Resistor 330 Ohm (4 pcs)
  6. Resistor 10k Ohm (1 pcs)
  7. Pushbutton (1 pcs)
  8. Kabel USB micro-B
  9. Laptop

Note :

Schematic

Diagram Skema Projek Digital I/O

Jika semua komponen sudah ready, maka kita dapat mulai menyusun perangkat sesuai gambar. Perlu diperhatikan bahwa :

  • Sangat disarankan untuk tetap meletakkan board ESP32 pada breadboard dan menyambungkan dengan komponen lain menggunakan kabel jumper untuk menghindari kerusakan pada board akibat kaki ESP32 yang terbuka. Walaupun sebenarnya penyusunan project dengan kaki board terbuka tetap bisa dilakukan, tetapi cukup berisiko.
  • Resistor digunakan untuk membagi tegangan supaya LED tidak cepat panas — umur LED menjadi semakin lama — . Jenis resistor yang digunakan pada LED adalah resistor 330 Ohm, sedangkan pada pushbutton digunakan resistor 10k Ohm.
  • Kutub positif (+) dari LED terletak pada kaki yang lebih panjang. Maka pada kaki tersebut disambungkan dengan sumber tegangan, sedangkan kaki yang lainnya disambungkan dengan ground.
  • Setiap komponen I/O disambungkan sesuai dengan GPIO yang menerima input dan output. Sesuai dengan gambar, sambungkan Yellow LED ke GPIO 13, Green LED ke GPIO 12, Red LED ke GPIO 14, Blue LED ke GPIO 27, dan Pushbutton ke GPIO 4.
  • Usahakan memilih warna kabel jumper yang berbeda untuk memudahkan penyusunan perangkat.

Program

Jadi program ini yang digunakan dalam project Digital I/O. Pada 8 baris pertama diinisialisasi variabel nomor pin.

// mengeset nomor pin
const int buttonPin = 4; // nomor pin pushbotton
const int ledPinYellow = 13; // nomor pin LED
const int ledPinGreen = 12;
const int ledPinRed = 14;
const int ledPinBlue = 27;

Pushbutton disambungkan ke GPIO 4, Yellow LED ke GPIO 13, Green LED ke GPIO 12, Red LED ke GPIO 14, dan Blue LED ke GPIO 27.

Bagian selanjutnya diinisialisasi variabel untuk menyimpan status pushbutton, sbb :

// variabel untuk menyimpan kondisi pushbotton
int buttonStatus = 0;

Nilai 0 menandakan pushbutton dalam kondisi default (tidak ditekan).

Pada setup(), diinisialisasi paramater baudrate, input, dan output yang digunakan.

Serial.begin(115200);

Nilai 115200 menunjukkan parameter baudrate yang digunakan. Parameter ini digunakan untuk memvisualisasi perubahan yang terjadi ke layar.

// mengeset pin pushbutton sebagai input  
pinMode(buttonPin, INPUT);
// mengeset pin LED sebagai output
pinMode(ledPinYellow, OUTPUT);
pinMode(ledPinGreen, OUTPUT);
pinMode(ledPinRed, OUTPUT);
pinMode(ledPinBlue, OUTPUT);

pinMode() digunakan untuk mengeset INPUT dan OUTPUT.

Pada loop(), terdapat kode program untuk membaca input dan instruksi output.

// membaca status dari pushbutton dan mencetak kondisi ke layar  buttonStatus = digitalRead(buttonPin);  Serial.println(buttonStatus);

Fungsi digitalRead() diatas digunakan untuk membaca status pushbutton dari variabel buttonPin, dan disimpan pada variabel buttonStatus.

Pada bagian selanjutnya, kode program digunakan untuk mentukan instruksi output.

// mengecek apakah pushbutton sedang ditekan  
// LED menyala jika sedang ditekan
if (buttonStatus == HIGH) {
digitalWrite(ledPinYellow, HIGH);
digitalWrite(ledPinGreen, HIGH);
digitalWrite(ledPinRed, HIGH);
digitalWrite(ledPinBlue, HIGH); // LED menyala
}

Jika pushbutton sedang ditekan, maka prosedur digitalWrite() akan dijalankan dengan parameter seluruh LED dengan nilai HIGH sehingga seluruh LED akan menyala.

else {    
digitalWrite(ledPinYellow, LOW);
digitalWrite(ledPinGreen, LOW);
digitalWrite(ledPinRed, LOW);
digitalWrite(ledPinBlue, LOW); // LED mati
}

Sementara itu, jika pushbutton sedang tidak ditekan, LED akan mati (diset dengan parameter LOW).

Result

Setelah kode program selesai di-upload, well device berhasil berjalan sesuai dengan spesifikasi program yang diberikan.

Kondisi saat Pushbutton tidak ditekan
Nilai yang tercetak dilayar saat pushbutton tidak ditekan

Berikut ini foto saat pushbutton tidak ditekan. Semua LED dalam keadaan mati serta dilayar tercetak nilai 0 yang menandakan pushbutton sedang tidak ditekan.

Kondisi saat Pushbutton ditekan
Nilai yang tercetak dilayar saat pushbutton ditekan

Saat pushbutton ditekan, seluruh LED akan menyala serta tercetak nilai 1 dilayar.

Berikut video eksperimen dari project ini

Input dari pushbutton menentukan output. Ketika pushbutton ditekan, maka LED akan menyala. Selain itu, nilai yang tercetak di layar bergantung pada kondisi pushbutton.

Addition

Pada bagian tambahan ini, dibahas project yang berkaitan dengan analog I/O. Device akan dirangkai dan diprogram untuk dapat menerima analog input melalui potentiometer dan mengeluarkan analog ouput berupa LED yang dapat meredup dan menerang.

Things used in this project

  1. ESP32 — DevKitC
  2. BreadBoard
  3. Kabel jumper male-to-male (9 pcs)
  4. 3mm LED (4 pcs)
  5. Resistor 330 Ohm (4 pcs)
  6. Potentiometer (1 pcs)
  7. Kabel USB micro-B
  8. Laptop

Note :

  • Hanya terdapat perbedaan di komponen input dari bagian sebelumnya.
  • Dapat digunakan potentiometer dengan berbagai nilai resistansi.

Schematic

Diagram Skema Projek Analog I/O

Jika komponen sudah tersedia, maka rangkaian dapat disusun seperti rangkaian diatas. Perlu diperhatikan :

  • Kaki tengah potentiometer disambungkan ke pin GPIO, sedangkan kaki bagian pinggir disambungkan ke kutub posotif (+) dan kutub negatif (-).
  • Menyambungkan Yellow LED ke GPIO 13, Green LED ke GPIO 12, Red LED ke GPIO 14, Blue LED ke GPIO 27, dan Potentiometer ke GPIO 34.

Program

Program ini digunakan pada project bagian kedua. Pada 8 baris pertama, kode yang digunakan mirip dengan kode program bagian pertama.

const int potPin = 34;    // GPIO 34 tempat pin potentiometer

Hanya pada baris ke-4, diinisialisasi GPIO 34 yang digunakan potentiometer.

Pada baris kode selanjutnya, diinisialisasi variabel yang digunakan untuk menyimpan nilai input.

// mengeset variabel 
int potValue = 0; // menyimpan nilai potentiometer
int outputValue = 0; // menyimpan nilai output PWM (analog out)

Variabel potValue akan menyimpan nilai masukan potentiometer. Karena default resolusi dalam 12 bits, maka variabel ini akan memiliki range 0–4095. Sedangkan variabel outputValue akan menyimpan nilai yang akan dikeluarkan output dalam range 0–255, karena resolusi output diset pada 8 bits.

// setting PWM
const int frekuensi = 5000;
const int ledChannel = 0;
const int resolusi = 8;

Pada setting PWM, digunakan frekuensi PWM 5000 Hz, LED Channel bernilai 0, dan resolusi diset ke 8 bits (kecerahan LED dalam range 0–255).

Pada setup(), diinisialisasi paramater baudrate, konfigurasi LED PWM, dan attach variabel output.

Serial.begin(115200);  
// configurasi LED PWM
ledcSetup(ledChannel, frekuensi, resolusi);
// meng-attach pin GPIO
ledcAttachPin(ledPinYellow, ledChannel);
ledcAttachPin(ledPinGreen, ledChannel);
ledcAttachPin(ledPinRed, ledChannel);
ledcAttachPin(ledPinBlue, ledChannel);

ledcSetup() mengkonfigurasikan nilai LED PWM yang sudah didefinisikan sebelumnya, sedangkan fungsi ledcAttachPin() berfungsi untuk meng-attach seluruh output ke ledChannel.

Pada loop(), terdapat kode program untuk membaca input, me-rescale input, dan mengeluarkan output.

// membaca input dari potentiometer  
potValue = analogRead(potPin);

analogRead() berfungsi untuk membaca analog input dari potentiomer dan menyimpan nilai bacaan ke variabel potValue.

// me-rescale range nilai 0-4095 ke 0-255  
outputValue = map(potValue, 0, 4095, 0, 255);

map() digunakan untuk me-rescale nilai dari range 0–4095 ke 0–255, karena nilai LED PWM berada dalam range 0–255.

// mengeluarkan output sesuai input yang sudah di-rescale  ledcWrite(ledChannel, outputValue);   

ledcWrite() akan berjalan untuk men-generate sinyal analog output ke ledChannel yang sudah di-attach.

// mencetak nilai varibel ke layar  
Serial.print("Potentiometer = ");
Serial.print(potValue);
Serial.print("\t Output = ");
Serial.println(outputValue);
// menunggu 20 ms sebelum loop selanjutnya
delay(20);

Kode program selanjutnya, yaitu Serial.print() dan Serial.println() akan mencetak nilai dari variabel potValue dan outputValue ke layar. Kemudian terdapat delay(20) agar state bertahan selama 20 ms sebelum loop selanjutnya.

Result

Setelah kode program selesai di-upload, well device berhasil berjalan sesuai dengan spesifikasi program yang diberikan.

Kondisi saat potentiometer diputar
Nilai yang tercetak di layar

Berikut video eksperimen dari project bagian kedua

Terang redupnya LED ditentukan oleh input potentiometer. Saat nilai input membesar maka LED akan semakin terang, sedangkan saat nilai input mengecil maka LED akan meredup. Sementara itu, nilai input dan hasil re-scale juga tercetak di layar.

Thanks for reading
See you on another ep! 😄

--

--

Responses (2)