ESP32 Challenge #2: Digital Inputs and Digital Outputs (+ Analog Output Using PWM Generator)

Gisela Ivenita
16 min readFeb 6, 2021

--

Selamat memasuki challenge ke-2. Saatnya menikmati keseruan bersama dengan ESP32. Eits, tapi kali ini kita akan berkreasi dengan komponen-komponen lain juga!

Pada ESP32 Development Board kita dapat melihat bagian yang berbentuk seperti kaki-kaki, kalian udah pada tau gak maksud kaki-kaki tersebut? Fungsinya tuh buat apa? Gak mungkin buat pajangan aja supaya keliatan keren ya, kan?

Setiap board ESP32 memiliki kaki-kaki yang bisa disebut General Purpose Input Output (GPIO) atau dengan kata lain pin Input dan Output yang digunakan sebagai interface untuk berkomunikasi dengan dunia luar. Board ESP32 sudah memiliki nama dan fungsi default untuk memudahkan, walaupun masih bisa diubah-ubah tergantung dengan program yang dibuat. Kalau ingin melihat defaultnya bisa kalian cek pada link berikut: https://randomnerdtutorials.com/getting-started-with-esp32/ Jangan lupa sesuaikan dengan jenis ESP32 Development Board yang kalian punya ya! Selain itu, untuk mengecek pin mana yang berfungsi sebagai input/output atau keduanya, silahkan klik pada link berikut: https://randomnerdtutorials.com/esp32-pinout-reference-gpios/

Interface I/O pada ESP32 bermacam-macam, antara lain Analog-to-Digital Converter (ADC), Serial-Parallel Interface (SPI), UART, I2C, kanal output PWM, Digital-to-Analog Converter (DAC), I2S, dan GPIO Capacitive Sensing. Kalian akan mempelajari hal ini satu per satu kok. Jadi, sabar aja guys :D

GPIO berfungsi untuk menerima sinyal input digital/analog dan mengeluarkan sinyal output digital/analog. Fakta menariknya, tidak semua GPIO memiliki nomor yang terurut. Pada board ESP32 DevKit V1 dengan 30 pin terdapat GPIO hingga GPIO 39, di mana tergantung dengan spesifikasi.

ESP32 Digital Inputs and Digital Outputs

Pada challenge kali ini, kalian ditantang agar ESP32 membaca input dari suatu push button supaya bisa mengendalikan lampu LED sebagai output. Nah, kalian diminta untuk berkreasi, jumlah LED dan saklar yang digunakan, bagaimana LED ketika menyala, apakah blink, menyala atau mati, silahkan bereksperimen sesuai keinginan kalian!

Buat pemanasan kita akan coba membuat dari dasarnya terlebih dahulu, ya.

VERSION 1

Pada versi 1, kita akan membuat satu buah LED menyala ketika push button (saklar) ditekan dan mati ketika push button tidak ditekan. Simple, bukan?

Komponen dan perangkat yang digunakan sebagai berikut:

  1. ESP32 Development Board (1 buah)
Gambar 1. ESP32 Development Board (30 pin)

2. Breadboard

Gambar 2. Breadboard 830 titik (1 buah)
Gambar 3. Breadboard 400 titik (2 buah)

Pada percobaan kali ini, aku memakai 1 buah breadboard 830 titik dan 2 buah breadboard 400 titik. Tapi kalian bisa menyesuaikan dengan breadboard yang tersedia, kok!

3. LED (1 buah)

Gambar 4. LED

4. Resistor 330 Ohm (1 buah)

Gambar 5. Resistor 330 Ohm

5. Resistor 10K Ohm (1 buah)

Gambar 6. Resistor 10K Ohm

6. Push button (1 buah)

Gambar 7. Push button

7. Kabel male to male (5 buah)

Gambar 8. Kabel male to male

Jika kalian membuat kaki-kaki ESP32 tidak berada pada breadboard, maka kalian juga memerlukan kabel male to female, tetapi cara ini tidak dianjurkan karena sangat rentan jika terkena air atau terjadi listrik statis yang dapat merusak ESP32.

8. Micro USB Cable

Gambar 9. Micro USB Cable

9. Laptop/komputer yang terdapat Aplikasi Arduino IDE (sudah terinstall package board ESP32).

Gambar 10. Aplikasi Arduino IDE

Jika belum memiliki aplikasi Arduino IDE yang sudah terinstall package board ESP32, silahkan mengikuti langkah-langkah pada link berikut: https://giselaivenita.medium.com/esp32-challenge-1-blinking-the-on-board-led-very-easy-bffaa6e5b943

Setelah semua komponen tersedia, langsung aja kita rangkai komponen seperti gambar skema berikut:

Gambar 11. Diagram Skema Rangkaian 1 LED

ESP32 Development Board akan mengeluarkan output melalui GPIO 5 di mana dihubungkan dengan kutub positif (Anoda) LED sehingga LED akan menyala (dengan tegangan 3.3 V). Jika kalian lupa bagian mana yang merupakan kutub positif dan negatif, kalian bisa membedakannya dengan cara melihat kaki LED. Kaki LED yang paling panjang merupakan kutub positif dan kaki yang lebih pendek merupakan kutub negatif. Kutub negatif (Katoda) LED dihubungkan dengan resistor 330 Ohm agar terhubung ke ground (kabel berwarna hitam). Ingat bahwa arus listrik mengalir dari kutub positif ke kutub negative atau kutub positif ke ground. Resistor ditambahkan supaya arus tidak terlalu besar. Apabila arus terlalu besar, LED akan menjadi panas.

Kabel berwarna merah merupakan power supply yang terhubung ke push button (saklar). Terdapat rangkaian parallel yang menghubungkan input GPIO 4 ke resistor 10K Ohm, di mana resistor terhubung ke ground atau bisa disebut dengan resistor pull down yang berfungsi sebagai pembagi tegangan atau berfungsi untuk membuang sebagian arus supaya tidak menyebabkan panas.

Hati-hati dalam merangkai karena bisa menyebabkan board ESP32 menjadi panas sehingga bisa mengurangi waktu pemakaian ESP32 atau membuatnya meleleh.

Pada aplikasi Arduino IDE, silahkan copy paste kode program 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);
}
}

Keterangan program:

Pada awal program, kita inisialisasi terlebih dulu variable untuk mengetahui nomor pin/GPIO mana yang digunakan, karena tidak berubah maka dibuat constant.

const int buttonPin = 4;const int ledPin = 5;

Karena GPIO 4 sebagai input, maka kita buat variable buttonPin dengan nomor pin 4, sedangkan GPIO 5 sebagai output yang terhubung ke LED, maka kita buat variable ledPin dengan nomor pin 5.

int buttonState = 0;

Selanjutnya, kita inisialisasi variable buttonState yang berfungsi menyimpan status push button dengan nilai 0.

Seperti yang sudah pernah aku bahas di ESP32 Challenge #1 bahwa terdapat 2 fungsi utama dalam memprogram menggunakan Arduino dan ESP32.

1. Fungsi setup

Pada setup terdapat:

Serial.begin(115200);

Serial.begin berfungsi untuk menentukan kecepatan penyampaian data melalui port serial dalam bits per second. Arduino Uno mendukung kecepatan hingga 115200.

pinMode(buttonPin, INPUT);pinMode(ledPin, OUTPUT);

PinMode berfungsi untuk menentukan pin mana yang menjadi input dan output. Dalam hal ini, buttonPin atau push button akan menjadi input dan ledPin atau LED akan menjadi outputnya.

2. Fungsi loop

buttonState = digitalRead(buttonPin);

Variabel buttonState berfungsi membaca nilai dari push button.

Serial.println(buttonState);

Serial.println berfungsi mengirimkan data button ke port serial.

if (buttonState == HIGH) {// turn LED ondigitalWrite(ledPin, HIGH);} else {// turn LED offdigitalWrite(ledPin, LOW);

Selanjutnya, terdapat percabangan dengan 2 kondisi:

  1. Jika buttonState HIGH atau push button ditekan, maka LED akan menyala (akan bertegangan tinggi)
  2. Jika buttonState LOW atau push button tidak ditekan, maka akan mematikan LED.

Nah, semua sudah siap, langsung aja kita compile programnya dan kita lihat hasilnya!!

Gambar 12. Rangkaian

VERSION 2

Pada versi 2, kita akan membuat dua buah LED menyala secara bergantian. LED A akan menyala dan LED B akan mati ketika push button (saklar) ditekan, sedangkan LED A akan mati dan LED B akan menyala ketika push button tidak ditekan.

Komponen dan perangkat yang digunakan sama dengan versi 1, tetapi terdapat penambahan jumlah komponen sebagai berikut:

  1. ESP32 Development Board (1 buah)
  2. Breadboard (1 buah breadboard 830 titik dan 2 buah breadboard 400 titik)
  3. LED (2 buah)
  4. Resistor 330 Ohm (2 buah)
  5. Resistor 10K Ohm (1 buah)
  6. Push button (1 buah)
  7. Kabel male to male (6 buah)
  8. Micro USB Cable (1 buah)
  9. Laptop/komputer yang terdapat Aplikasi Arduino IDE (sudah terinstall package board ESP32)

Selanjutnya, kalian hanya mengubah sedikit skema rangkaian dari versi 1. Silahkan mengikuti skema berikut:

Gambar 13. Diagram Skema Rangkaian 2 LED

Skema pada rangkaian dengan 2 LED ini tidak jauh berbeda dengan skema rangkaian 1 LED saja. Pada skema ini, GPIO 15 juga berperan sebagai output yang dihubungkan dengan kutub positif (Anoda) LED ke-2. Kutub negatif (Katoda) LED ini juga dihubungkan dengan resistor 300 Ohm agar terhubung ke ground.

Kode program yang digunakan hanya menambah sedikit dari kode program versi 1:

// set pin numbers
const int buttonPin = 4; // the number of the pushbutton pin
const int ledPin1 = 15; // the number of the LED pin
const int ledPin2 = 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(ledPin1, OUTPUT);
pinMode(ledPin2, 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 LED1 on and LED2 off
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
} else {
// turn LED1 off and LED2 on
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
}
}

Keterangan program:

const int buttonPin = 4; // the number of the pushbutton pin
const int ledPin1 = 15; // the number of the LED pin
const int ledPin2 = 5; // the number of the LED pin

Pada program versi 2 ini, kita menambahkan inisialisasi variabel ledPin karena menggunakan 2 LED, dengan LED pertama menggunakan GPIO 15 dan LED kedua menggunakan GPIO 5, sementara buttonPin tetap menggunakan GPIO 4.

int buttonState = 0;

Untuk inisialisasi variable buttonState sama seperti versi 1.

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);
}

Pada fungsi setup, kita hanya menambahkan satu lagi LED sebagai output dengan tetap menggunakan instruksi pinMode.

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 LED1 on and LED2 off
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
} else {
// turn LED1 off and LED2 on
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
}
}

Pada fungsi setup, kita menambahkan pada bagian percabangan sebagai berikut:

  1. Jika push button (saklar) ditekan, maka ledPin1 akan menyala dan ledPin2 akan mati.
  2. Jika push button tidak ditekan, maka ledPin1 akan mati dan ledPin2 akan menyala.

Sehingga setiap kondisi push button memengaruhi kondisi kedua LED.

Langsung aja kita compile dan lihat perbedaannya dengan versi 1, yuk!

Gambar 14. Rangkaian dengan 2 LED

VERSION 3

Pada versi 3, kita akan membuat dua buah LED menyala secara bersamaan. ketika push button (saklar) ditekan dan dua buah LED akan melakukan blink secara bergantian ketika push button tidak ditekan. Jadi, disini kita mencoba menggunakan kembali pelajaran yang kita dapat dari challenge pertama tetapi dengan modifikasi sedikit.

Komponen dan perangkat serta skema yang digunakan pada versi 3 sama persis dengan versi 2. Pada versi ini, kita hanya akan melakukan modifikasi pada kode program.

Kode program yang digunakan sebagai berikut.

// set pin numbers
const int buttonPin = 4; // the number of the pushbutton pin
const int ledPin1 = 15; // the number of the LED pin
const int ledPin2 = 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(ledPin1, OUTPUT);
pinMode(ledPin2, 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 LED1 and LED2 on
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
} else {
// blink
// turn the LED on (HIGH is the voltage level)
digitalWrite(ledPin1, HIGH);
// wait for half a second
delay(500);
// turn the LED off by making the voltage LOW
digitalWrite(ledPin1, LOW);
// wait for half a second
delay(500);
// turn the LED on (HIGH is the voltage level)
digitalWrite(ledPin2, HIGH);
// wait for half a second
delay(500);
// turn the LED off by making the voltage LOW
digitalWrite(ledPin2, LOW);
// wait for half a second
delay(500);
}
}

Keterangan program:

Pada versi 3, kita hanya memodifikasi program versi 2 pada bagian percabangan (if dan else) saja.

if (buttonState == HIGH) {
// turn LED1 and LED2 on
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
}

Jika push button (saklar) ditekan, maka kedua LED akan menyala.

else {
// blink
// turn the LED on (HIGH is the voltage level)
digitalWrite(ledPin1, HIGH);
// wait for half a second
delay(500);
// turn the LED off by making the voltage LOW
digitalWrite(ledPin1, LOW);
// wait for half a second
delay(500);
// turn the LED on (HIGH is the voltage level)
digitalWrite(ledPin2, HIGH);
// wait for half a second
delay(500);
// turn the LED off by making the voltage LOW
digitalWrite(ledPin2, LOW);
// wait for half a second
delay(500);
}

Jika push button tidak ditekan, maka akan dijalankan program blink dengan delay 500 ms atau 0.5 s, di mana LED 1 akan menyala terlebih dahulu dilanjutkan dengan LED 2, dengan delay sesuai masukan angka delay pada program.

Nah, langsung aja kita coba lagi, yuk!

Untuk foto rangkaian sama seperti program versi 2.

ANALISIS EKSPERIMEN

  1. Pada challenge ke-2 yang berhubungan dengan input dan output, nomor pin yang digunakan sangat berpengaruh. Tidak semua nomor GPIO dapat berfungsi sebagai input dan output. Oleh sebab itu, pemilihan nomor GPIO sangat penting.
  2. Dalam pemasangan komponen pada breadboard harus dilakukan dengan teliti dan hati-hati guna menghindari panas yang dapat merusak ESP32 Development Board.
  3. Dapat dilakukan modifikasi jumlah LED, jumlah push button (saklar), dan bagaimana cara LED tersebut menyala atau mati di mana akan memengaruhi kode program yang digunakan. Biasanya semakin banyak LED dan push button (saklar) maka lebih banyak variabel yang perlu diinisialisasi di awal program, serta perlu diperhatikan nomor GPIO yang digunakan, apakah nomor tersebut sudah benar berfungsi sebagai input dan/atau output. Cara LED menyala atau mati dapat diatur pada bagian if dan else pada fungsi loop program. Jika menginginkan LED menyala maka tegangannya tinggi (HIGH), sebaliknya jika ingin mematikan LED maka tegangan dibuat LOW. Dua LED juga dapat dibuat menyala secara bergantian seperti contoh VERSION 2. Selain itu, LED dapat dibuat blink/kedap-kedip dengan cara mengatur delay sesuai keinginan seperti contoh VERSION 3.
  4. Pada eksperimen Version 3, apabila menekan push button (saklar) saat baru LED Hijau (ledPin1) yang melakukan blink (LED Merah (ledPin2) belum melakukan blink), program akan tetap menyelesaikan percabangan bagian else sehingga tetap menunggu LED Merah melakukan blink, setelah itu baru percabangan bagian if (kedua LED akan menyala) dilakukan. [Dapat dilihat pada video]
  5. Dalam challenge kali ini, banyak cara pemasangan yang dapat dilakukan.
  • Pertama: Hanya menggunakan satu buah breadboard 830 titik dan memasukkan ESP32 Development Board ke dalam breadboard, tetapi space yang tersisa untuk tempat pemasangan kabel hanya satu baris saja. Selain itu, disarankan kabel yang digunakan berukuran 20 cm supaya penempatan komponen dapat lebih leluasa.
  • Kedua: Hanya menggunakan satu buah breadboard tetapi ESP32 Development Board tidak dimasukkan ke dalam breadboard. Cara menghubungkan ke komponen lainnya menggunakan kabel male to female, dengan cara bagian female dihubungkan ke kaki-kaki ESP32 Development Board dan bagian male dihubungkan ke breadboard. Namun, sebaiknya cara ini dihindari supaya tidak merusak ESP32 jika terkena air dan sebagainya.
  • Ketiga: Menggunakan lebih dari satu breaboard seperti cara yang aku gunakan pada post kali ini, memang butuh menyediakan breadboard lebih tetapi dapat lebih mudah dalam menghubungkan ESP32 Development Board ke komponen lainnya.
  • Keempat: Mungkin kalian yang akan menemukan cara-cara baru lainnya, tapi jangan lupa tetap berhati-hati ya!

HASIL EKSPERIMEN

Program dapat berjalan sesuai dengan kode program.

Pada Version 1, LED akan menyala jika push button (saklar) ditekan dan LED akan mati jika push button (saklar) tidak dilepas.

Pada Version 2, LED hijau akan menyala dan LED merah mati jika push button (saklar) ditekan, dan LED hijau akan mati dan LED merah menyala jika push button (saklar) tidak ditekan.

Pada Version 3, kedua LED akan menyala jika push button (saklar) ditekan dan kedua LED akan melakukan blink (dimulai dari LED Hijau terlebih dahulu) jika push button (saklar) tidak ditekan.

Selain itu, apabila saat melakukan proses compile menemukan banyak simbol …_…_…_ ketika connecting dan jika biarkan dapat menyebabkan munculnya error message “A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header”. Untuk menyelesaikan masalah tersebut, diperlukan menekan tombol Boot yang tersedia pada ESP32 Development Board.

ESP32 Analog Output Using PWM Generator

ESP32 memiliki LED PWM Controller dengan 16 channel yang dapat dikonfigurasi untuk menghasilkan PWM signals dengan properties berbeda. Pada bagian ini, kita akan mengetahui bagaimana men-generate PWM signals dengan ESP32. Kita akan membuat rangkaian sederhana yang akan meredupkan LED menggunakan LED PWM Controller ESP32. Selain itu, kita akan membuktikan bahwa dengan GPIO yang berbeda dapat menghasilkan PWM signal yang sama.

Komponen dan perangkat yang diperlukan sebagai berikut:

  1. ESP32 Development Board (1 buah)
  2. Breadboard (1 buah breadboard 830 titik dan 2 buah breadboard 400 titik)
  3. LED (3 buah)
  4. Resistor 330 Ohm (3 buah)
  5. Kabel male to male (4 buah)
  6. Micro USB Cable
  7. Laptop/komputer yang terdapat Aplikasi Arduino IDE (sudah terinstall package board ESP32).

VERSION 1

Rangkai komponen-komponen tersebut seperti skema berikut:

Gambar 15. Diagram Skema Rangkaian ESP32 PWM

ESP32 Development Board akan mengeluarkan output melalui GPIO 16 di mana dihubungkan dengan kutub positif (Anoda) LED sehingga LED akan menyala (dengan tegangan 3.3 V).

Kode program yang digunakan sebagai berikut:

// the number of the LED pin
const int ledPin = 16; // 16 corresponds to GPIO16

// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;

void setup(){
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);

// attach the channel to the GPIO to be controlled
ledcAttachPin(ledPin, ledChannel);
}

void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}

// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}

Keterangan program:

const int ledPin = 16;  // 16 corresponds to GPIO16

Pada awal program, kita lakukan inisialisasi variabel ledPin di mana kali ini digunakan GPIO 16.

const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;

Selanjutnya, kita perlu mengatur PWM properties, antara lain frekuensi sinyal PWM, channel/saluran dan resolusi. Frekuensi yang digunakan untuk sebuah LED dapat sebesar 5000 Hz. Kita akan menggunakan channel 0 (FYI, terdapat 16 channel PWM dari 0 hingga 15) yang digunakan untuk men-generate sinyal, dan resolusi sebesar 8 bit, yang berarti kita dapat mengontrol tingkat kecerahan LED dengan menggunakan nilai dari 0 hingga 255.

ledcSetup(ledChannel, freq, resolution);

Pada fungsi setup, kita perlu mengkonfigurasi LED PWM dengan properti yang telah kita inisialisasi dengan menggunakan ledcSetup.

ledcAttachPin(ledPin, ledChannel);

Pada fungsi ledcAttachPin terdapat dua argumen. Argumen pertama adalah GPIO mana yang akan mengeluarkan sinyal, dan argumen kedua adalah channel yang akan menghasilkan sinyal. Pada program kali ini, GPIO 16 akan mengeluarkan sinyal dan channel 0 akan menghasilkan sinyal.

void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}

// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}

Pada loop, kita dapat mengatur tingkat kecerahan LED menggunakan PWM dengan fungsi ledcWrite. Pada fungsi ini terdapat 2 argumen, yaitu argumen pertama berupa channel yang menghasilkan sinyal PWM dan argumen kedua adalah siklus kerja.

Oke, langsung kita coba eksperimennya!

Gambar 16. Rangkaian ESP32 PWM

VERSION 2

Setelah menggunakan satu LED saja, sekarang kita coba 3 LED langsung, yuk!

Silahkan rangkai komponen kalian seperti skema berikut:

Gambar 17. Diagram Skema Rangkaian ESP32 PWM dengan 3 LED

Pada skema ini tidak jauh berbeda dengan skema sebelumnya, GPIO 5, GPIO 16, dan GPIO 17 berfungsi sebagai output yang terhubung dengan masing-masing kutub positif 3 LED.

Kode program yang digunakan sebagai berikut:

// the number of the LED pin
const int ledPin = 16; // 16 corresponds to GPIO16
const int ledPin2 = 17; // 17 corresponds to GPIO17
const int ledPin3 = 5; // 5 corresponds to GPIO5
// setting PWM properties
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;

void setup(){
// configure LED PWM functionalitites
ledcSetup(ledChannel, freq, resolution);

// attach the channel to the GPIO to be controlled
ledcAttachPin(ledPin, ledChannel);
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
}

void loop(){
// increase the LED brightness
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
// decrease the LED brightness
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle — ){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}

Keterangan program:

Kode program yang digunakan kali ini tidak jauh berbeda dengan program sebelumnya. Hanya mengalami penambahan inisialisasi variabel dan ledcAttachPin karena jumlah LED yang digunakan saat ini 3. Namun, fungsi pada program ini tetap sama dengan program sebelumnya, kok!

Langsung aja kita eksperimen bareng-bareng ya!

Gambar 18. Rangkaian ESP32 PWM dengan 3 LED

ANALISIS DAN HASIL EKSPERIMEN

Akhirnya, program dan rangkaian yang dibuat dapat berjalan dengan baik. Gimana, guys? Udah mulai merasa jadi ahli ESP32, gak? Dengan mengikuti percobaan pengayaan ini, kita akhirnya mengetahui bagaimana mengatur tingkat kecerahan LED dengan menggunakan LED PWM Controller ESP32. Pada percobaan version 2, GPIO yang digunakan berbeda-beda tetapi tetap dapat mendapat sinyal PWM yang sama dalam waktu yang sama. Selain itu, GPIO yang digunakan tidak harus sesuai dengan yang ditampilkan ya, guys! Kalian bisa mencoba menggunakan GPIO lain asalkan memang GPIO tersebut dapat berfungsi sebagai output. Kalau lupa gimana cara mengetahui GPIO mana yang berfungsi sebagai input dan/atau output, kalian bisa cek di link ini yang pernah aku berikan sebelumnya: https://randomnerdtutorials.com/esp32-pinout-reference-gpios/

Nah, challengenya sudah cukup menantang, kan? Ini masih pemanasan, lho! Sejauh ini kita sudah belajar bagaimana membuat ESP32 on-board LED bisa ngeblink, mengatur nyala/matinya LED menggunakan push button (saklar), bagaimana cara LED ketika menyala, apakah menyala seperti biasa atau ngeblink, dan mengatur kecerahan LED menggunakan LED PWM Controller ESP32. Hmmm, kira-kira challenge selanjutnya apalagi, ya?

--

--

No responses yet