#YukBelajarESP32 Project 3 : Internal Sensor
Halo semuanya! Selamat datang kembali pada perjalanan #YukBelajarESP32. Wah, tidak terasa sudah saatnya kita akan belajar pengetahuan baru lagi mengenai ESP32, padahal baru saja minggu lalu kita belajar bagaimana caranya menyalakan LED sesuai dengan penekanan tombol push. Pada proyek #YukBelajarESP32 kali ini, kita akan bersama-sama belajar mengenai sensor internal pada ESP32.
Apa itu sensor?
Sensor adalah sebuah perangkat keras yang berfungsi untuk mendeteksi berbagai reaksi dari lingkungan (input) yang selanjutnya akan dikonversikan oleh sistem menjadi respons (output).
Sensor merupakan komponen penting dalam suatu sistem sebab berbagai keputusan atau respons dihasilkan berdasarkan input yang diterima. Sistem akan memberikan respons yang sesuai dengan masing-masing input sehingga sistem dapat berfungsi secara maksimal dalam menjalankan perannya. Contoh yang mungkin kita sering temui adalah sensor cahaya pada lampu. Apabila sensor tersebut mendeteksi bahwa ruangan sudah gelap, sensor tersebut akan membuat sistem menyalakan lampu sehingga ruangan kembali terang.
Secara umum terdapat 2 (dua) jenis sensor, yaitu sensor internal dan sensor eksternal. Sensor internal adalah sensor yang terletak pada bagian dalam suatu sistem, sebaliknya sensor eksternal adalah sensor yang terletak pada bagian luar suatu sistem.
Sensor Internal pada ESP32
ESP32 adalah microcontroller yang sudah dilengkapi sensor untuk mendeteksi berbagai reaksi dari lingkungan. Ada 3 jenis built-in sensor yang dimiliki oleh ESP32, yaitu:
- Touch Sensor (Sensor Sentuh)
- Hall Effect Sensor (Sensor Efek Magnet)
- Temperature Sensor (Sensor Temperatur)*
*tidak semua jenis ESP32 memiliki sensor temperatur
Walau sudah memiliki sensor internal, ESP32 tetap dapat dilengkapi dengan sensor internal untuk melengkapi fungsi yang belum dimiliki oleh ESP32.
Letak Sensor ESP32
Sensor Sentuh
Sensor sentuh yang dimiliki oleh ESP32 tidak terletak pada semua GPIO yang ada, melainkan hanya terdapat pada beberapa pin yang dapat dilihat pada gambar di atas. Sensor sentuh dapat dilihat dengan melihat tulisan “TOUCHx” (x : nomor sensor) yang berwarna merah muda.
ESP32 dengan 30 GPIO memiliki 9 sensor sentuh, sedangkan ESP32 dengan 36 GPIO memiliki 10 sensor sentuh. Jika ingin menggunakan sensor sentuh milik ESP32, kita harus meletakkan perantara sensor di GPIO yang tepat.
Sensor Efek Magnet
Berbeda dengan sensor sentuh, sensor efek magnet tidak terdapat pada GPIO. Sensor efek magnet terletak pada bagian jantung ESP32, yaitu pada processor.
Jika ingin menggunakan sensor efek magnet, kita hanya perlu mendekatkan benda bermagnet ke sensor tersebut. Semakin dekat benda tersebut dengan sensor, semakin besar pula nilai yang akan dibaca. Hasil pembacaan sensor ini dapat menghasilkan nilai yang positif dan negatif, tergantung kutub magnet yang didekatkan dengan sensor.
Sensor Temperatur
Jenis sensor ini merupakan sensor yang cukup berbeda dengan 2 sensor sebelumnya, sebab sensor ini tidak dapat digunakan untuk membaca kondisi lingkungan. Sensor yang sudah tertanam pada ESP32 ini hanya dapat digunakan untuk mendeteksi temperatur chip yang tertanam.
Pada proyek #YukBelajarESP32 kali ini, kita akan membahas sensor internal terlebih dahulu, yaitu sensor yang memang sudah tertanam pada ESP32. Kita akan melakukan suatu eksperimen kecil menggunakan sensor sentuh dan juga sensor efek magnet.
Persiapan
Berikut adalah beberapa komponen dan perangkat yang kamu perlu siapkan untuk melakukan proyek ke-3 ini:
- Sebuah PC / Laptop,
- Sebuah Development Board berupa ESP32 DOIT DevKit V1 dengan 30 atau 36 GPIO pin,
- 1 pc Breadboard (opsional) sebagai tempat untuk meletakkan ESP32,
- Aplikasi Arduino IDE yang berfungsi sebagai programming environment,
- Sebuah Kabel USP type A to microUSB yang berfungsi sebagai jalur komunikasi antara komputer dan ESP32 sebagai sumber catu daya ESP32.
- 2 pc LED,
- 2 pc resistor 330 ohm,
- Kabel jumper (male-to-male/male-to-female/female-to-female) sesuai kebutuhan,
- 2 magnet.
Setelah kamu menyiapkan semua peralatan yang telah disebutkan di atas, persiapan selanjutnya adalah mempersiapkan laptop atau komputer untuk membuat program yang akan di-upload ke ESP32.
- Menyalakan laptop/komputer dan membuka aplikasi Arduino IDE.
- Menghubungkan ESP32 dan komputer dengan kabel USB type A to microUSB
- Setelah aplikasi terbuka, memilih DOIT ESP32 DevKit V1 sebagai board yang akan digunakan dan memilih USB to UART sebagai protokol pada communication port
Catatan : Jika kamu sudah pernah mengatur pilihan board dan port, kamu dapat melewati langkah kedua ini. Apabila kamu belum pernah melakukan instalasi aplikasi Arduino IDE dan/atau belum mengatur communication port, kamu dapat mengikuti panduan yang ada di tulisan awal dari #YukBelajarESP32 dengan membaca bagian “Persiapan”.
Apabila persiapan ini sudah selesai dilakukan, mari kita mulai proyek ke 3 dari #YukBelajarESP32!
Hands On #1 — Touch Sensor
Dalam percobaan yang pertama ini, kita akan mencoba menggunakan sensor sentuh dari ESP32 untuk menerima input berupa sentuhan tangan. Selanjutnya, input tersebut akan dikonversikan menjadi output berupa sinyal digital untuk menyalakan lampu LED. Sensor sentuh akan menghasilkan suatu nilai berupa besaran sentuhan dan program akan mengirimkan sinyal digital sesuai nilai tersebut. Apabila kita ingin menyalakan lampu, kita hanya perlu untuk memegang perantara sensor tersebut sehingga ada perubahan nilai dalam pembacaan sensor. Pada minggu lalu kita sudah belajar untuk menyalakan lampu menggunakan tombol, dan sekarang saatnya kita mencoba menyalakan lampu dengan sentuhan!
Komponen
Dari komponen yang telah disebutkan sebelumnya, percobaan dengan sensor sentuh akan membutuhkan beberapa komponen, yaitu:
- 2 pc LED,
- 2 pc resistor 330 ohm,
- Kabel jumper (male-to-male/male-to-female/female-to-female) sesuai kebutuhan.
Eksperimen
Disclaimer: eskperimen dilakukan dengan laptop yang mempunyai sistem operasi macOS
LANGKAH PERTAMA
Meletakkan ESP32 pada breadboard dan menyusun LED dan resistor seperti gambar di bawah ini
- Kabel jumper pada GPIO 15 digunakan sebagai perantara sensor sentuh (TOUCH3) untuk menyalakan lampu LED berwarna kuning
- Kabel jumper pada GPIO 4 digunakan sebagai perantara sensor sentuh (TOUCH0) untuk menyalakan lampu LED berwarna merah
LANGKAH KEDUA
Menyalin kode di bawah ini ke Arduino IDE
const int touchPinY = 15;
const int touchPinR = 4;
const int ledPinY = 22;
const int ledPinR = 23; const int threshold = 20;int touchValueY;
int touchValueR;
bool ledY_ON = false;
bool ledR_ON = false;
bool ledY_last;
bool ledR_last;void setup(){
Serial.begin(115200);
delay(1000); pinMode (ledPinY, OUTPUT);
pinMode (ledPinR, OUTPUT);
}void loop(){
/* LED Kuning */
touchValueY = touchRead(touchPinY);
if(touchValueY < threshold){
ledY_ON = true;
digitalWrite(ledPinY, HIGH);
if (ledY_ON != ledY_last){
Serial.print("Yellow LED Touch: ");
Serial.println(touchValueY);
Serial.println("Yellow LED on");
Serial.println("");
}
}
else{
ledY_ON = false;
digitalWrite(ledPinY, LOW);
if (ledY_ON != ledY_last){
Serial.print("Yellow LED Touch: ");
Serial.println(touchValueY);
Serial.println("Yellow LED off");
Serial.println("");
}
}
ledY_last = ledY_ON; /* LED Merah */
touchValueR = touchRead(touchPinR);
if(touchValueR < threshold){
// Menyalakan LED Merah
ledR_ON = true;
digitalWrite(ledPinR, HIGH);
if (ledR_ON != ledR_last){
Serial.print("Red LED Touch: ");
Serial.println(touchValueR);
Serial.println("Red LED on");
Serial.println("");
}
}
else{
ledR_ON = false;
digitalWrite(ledPinR, LOW);
if (ledR_ON != ledR_last){
Serial.print("Red LED Touch: ");
Serial.println(touchValueR);
Serial.println("Red LED off");
Serial.println("");
}
}
ledR_last = ledR_ON;
delay(500);
}
Catatan : nilai threshold disesuaikan dengan ESP32 masing-masing. Nilai ini dapat diketahui dengan mencoba program HallSensor yang dapat dikases pada Files ➝ Examples ➝ ESP32 ➝ Touch ➝ TouchRead.
LANGKAH KETIGA
Melakukan verifikasi code dengan menekan tombol bersimbol ✓ untuk memastikan bahwa code sudah benar dan dapat berjalan
LANGKAH KEEMPAT
Melakukan upload program ke board ESP32 dengan menekan tombol bersimbol ➡️
LANGKAH KELIMA
Membuka Serial Monitor yang dapat diakses pada Tools ➝ Serial Monitor dan menyentuh kabel yang terhubung dengan GPIO sensor sentuh untuk menyalakan lampu sesuai dengan keinginan.
Selamat, kamu telah berhasil menyalakan lampu LED dengan sentuhan tangan!
Hands On #2 — Hall Effect Sensor
Pada eksperimen yang pertama, kita sudah mempelajari bagaimana caranya menyalakan lampu LED dengan sentuhan tangan. Selanjutnya, kita akan belajar bagaimana caranya menyalakan lampu LED menggunakan magnet. Percobaan ini akan menggunakan sensor efek magnet yang akan membaca nilai magnet dan mengirimkan sinyal digital “HIGH” ke LED jika sensor didekatkan dengan magnet. Sebaliknya, LED akan menerima sinyal digital “LOW” apabila magnet dijauhkan dari sensor. Yuk kita simak eksperimen kedua dari proyek ketiga dalam perjalanan #YukBelajarESP32!
Komponen
Dari komponen yang telah disebutkan sebelumnya, percobaan dengan sensor efek magnet akan membutuhkan beberapa komponen, yaitu:
- 2 pc LED,
- 2 pc resistor 330 ohm,
- Kabel jumper (male-to-male/male-to-female/female-to-female) sesuai kebutuhan.
Eksperimen
Disclaimer: eskperimen dilakukan dengan laptop yang mempunyai sistem operasi macOS
LANGKAH PERTAMA
Meletakkan ESP32 pada breadboard dan menyusun LED dan resistor seperti gambar di bawah ini
LANGKAH KEDUA
Menyalin kode di bawah ini ke Arduino IDE
const int ledPinY = 15;
const int ledPinR = 2; int val = 0;
bool ledY_ON = false;
bool ledR_ON = false;
bool ledY_last;
bool ledR_last;void setup() {
Serial.begin(115200);
pinMode (ledPinY, OUTPUT);
pinMode (ledPinR, OUTPUT);
}void loop(){
val = hallRead();
/* LED Kuning */
if(val > 50){
ledY_ON = true;
digitalWrite(ledPinY, HIGH);
if (ledY_ON != ledY_last){
Serial.print("Hall Effect Value: ");
Serial.println(val);
Serial.println("Yellow LED on");
Serial.println("");
}
}
else{
ledY_ON = false;
digitalWrite(ledPinY, LOW);
if (ledY_ON != ledY_last){
Serial.print("Hall Effect Value: ");
Serial.println(val);
Serial.println("Yellow LED off");
Serial.println("");
}
}
ledY_last = ledY_ON; /* LED Merah */
if(val < 10){
ledR_ON = true;
digitalWrite(ledPinR, HIGH);
if (ledR_ON != ledR_last){
Serial.print("Hall Effect Value: ");
Serial.println(val);
Serial.println("Red LED on");
Serial.println("");
}
}
else{
ledR_ON = false;
digitalWrite(ledPinR, LOW);
if (ledR_ON != ledR_last){
Serial.print("Hall Effect Value: ");
Serial.println(val);
Serial.println("Red LED off");
Serial.println("");
}
}
ledR_last = ledR_ON;
delay(500);
}
Code di atas mengatur agar ketika pembacaan nilai magnet menghasilkan nilai positif lampu LED yang berwarna merah akan menyala, sedangkan nilai negatif akan membuat lampu LED yang berwarna kuning menyala
Catatan : nilai kondisi val disesuaikan dengan ESP32 masing-masing. Nilai ini dapat diketahui dengan mencoba program HallSensor yang dapat dikases pada Files ➝ Examples ➝ ESP32 ➝ HallSensor.
LANGKAH KETIGA
Melakukan verifikasi code dengan menekan tombol bersimbol ✓ untuk memastikan bahwa code sudah benar dan dapat berjalan
LANGKAH KEEMPAT
Melakukan upload program ke board ESP32 dengan menekan tombol bersimbol ➡️
LANGKAH KELIMA
Membuka Serial Monitor yang dapat diakses pada Tools ➝ Serial Monitor dan mendekatkan magnet dengan sensor efek magnet pada ESP32 untuk menyalakan lampu sesuai dengan keinginan.
Selamat, kamu telah berhasil menyalakan lampu LED dengan magnet!
Analisis dan Hasil
Setelah melakukan langkah-langkah percobaan yang sudah dijabarkan pada bagian eksperimen, kita berhasil untuk menyalakan lampu LED dengan sentuhan dan magnet. Adapun kode yang digunakan pada eksperimen sinyal digital memiliki penjelasan sebagai berikut:
// Alokasi variabel untuk menyimpan nomor pin Touch dan LED
const int touchPinY = 15; // nomor pin Touch untuk LED Kuning
const int touchPinR = 4; // nomor pin Touch untuk LED Merah
const int ledPinY = 22; // nomor pin LED Kuning
const int ledPinR = 23; // nomor pin LED Merah// Pengaturan nilai ambang untuk menyalakan LED
const int threshold = 20;// Variabel untuk menyimpan nilai bacaan Touch
int touchValueY;
int touchValueR;
bool ledY_ON = false;
bool ledR_ON = false;
bool ledY_last;
bool ledR_last;void setup(){
// Pengaturan kecepatan pengiriman dan penerimaan data (9600 - 115.200 bps)
Serial.begin(115200);
delay(1000); // jeda waktu untuk membuka Serial Monitor// Mengalokasikan ledPin sebagai output
pinMode(ledPinY, OUTPUT);
pinMode(ledPinR, OUTPUT);
}void loop(){
/* LED Kuning */
// Membaca nilai Touch untuk LED Kuning
touchValueY = touchRead(touchPinY);
// Pengecekan apakah touchValueY di bawah nilai ambang
if(touchValueY < threshold){
// Menyalakan LED Kuning
ledY_ON = true;
digitalWrite(ledPinY, HIGH);
if (ledY_ON != ledY_last){
// Mencetak nilai Touch
Serial.print("Yellow LED Touch: ");
Serial.println(touchValueY);
Serial.println("Yellow LED on");
Serial.println("");
}
}
else{
// Mematikan LED Kuning
ledY_ON = false;
digitalWrite(ledPinY, LOW);
if (ledY_ON != ledY_last){
// Mencetak nilai Touch
Serial.print("Yellow LED Touch: ");
Serial.println(touchValueY);
Serial.println("Yellow LED off");
Serial.println("");
}
}
ledY_last = ledY_ON; /* LED Merah */
// Membaca nilai Touch untuk LED Merah
touchValueR = touchRead(touchPinR);
// Pengecekan apakah touchValueR di bawah nilai ambang
if(touchValueR < threshold){
// Menyalakan LED Merah
ledR_ON = true;
digitalWrite(ledPinR, HIGH);
if (ledR_ON != ledR_last){
// Mencetak nilai Touch
Serial.print("Red LED Touch: ");
Serial.println(touchValueR);
Serial.println("Red LED on");
Serial.println("");
}
}
else{
// Mematikan LED Merah
ledR_ON = false;
digitalWrite(ledPinR, LOW);
if (ledR_ON != ledR_last){
// Mencetak nilai Touch
Serial.print("Red LED Touch: ");
Serial.println(touchValueR);
Serial.println("Red LED off");
Serial.println("");
}
}
ledR_last = ledR_ON;
delay(500);
}
Daftar command dan fungsinya pada code eksperimen sensor sentuh:
const int
menandakan bahwa pin adalah sebuah angka yang bersifat tetap dan tidak berubah (konstan)boolean
menandakan bahwa variabel memiliki nilai “benar” atau “salah”void()
menandakan bahwa fungsi tidak akan mengembalikan nilai apapunsetup()
adalah bagian untuk melakukan konfigurasi awal seperti pengalokasian pin ESP32 untuk setiap komponenloop()
adalah bagian yang berfungsi untuk menjalankan perintah-perintah di dalamnya secara terus menerus tanpa hentiserial.begin(speed)
berfungsi untuk mengatur kecepatan penerimaan dan pengiriman data, dimulai dari 9600–115.200 bits per second (bps)delay(time)
berfungsi untuk memberi jeda waktu sebelum perintah selanjutnya. Waktu yang dimasukkan dalam satuan ms (1s = 1000ms)pinMode(pinNumber, state)
berfungsi untuk mengalokasikan pin yang terhubung dengan komponen sebagai input atau outputtouchRead(touchPin)
berfungsi untuk membaca nilai sentuhan pada pin GPIO yang dimaksuddigitalWrite(pinNumber, state)
berfungsi untuk mengirimkan sinyal digital “0” yang berarti LOW (ESP32 mengalirkan 0 Volt) atau “1” yang berarti HIGH (ESP32 mengalirkan 3,3 Volt)serial.print
berfungsi untuk mencetak tulisan ke layarserial.println
berfungsi untuk mencetak tulisan ke layar dengan pengaturan tulisan selanjutnya berada pada baris baru
Apabila sensor sentuh tidak mendeteksi adanya sentuhan, nilai bacaan akan berada pada kisaran 70–80. Ketika saya memegang kabel yang telah terhubung dengan sensor sentuh, nilai akan menurun menjadi 5–15. Oleh karena itu, saya mengatur nilai treshold sebesar 20 agar lampu dapat menyala setiap kali hasil pembacaan bernilai di bawah 20.
Penjelasan code yang digunakan dalam eksperimen sensor efek magnet:
// Alokasi variabel untuk menyimpan nomor pin LED
const int ledPinY = 15; // nomor pin LED Kuning
const int ledPinR = 2; // nomor pin LED Merah// Alokasi variabel untuk menyimpan nilai bacaan sensor Hall Effect
int val = 0;
bool ledY_ON = false;
bool ledR_ON = false;
bool ledY_last;
bool ledR_last;void setup() {
// Pengaturan kecepatan pengiriman dan penerimaan data (9600 - 115.200 bps)
Serial.begin(115200);
// Mengalokasikan ledPin sebagai output
pinMode(ledPinY, OUTPUT);
pinMode(ledPinR, OUTPUT);
}void loop(){
// Membaca nilai sensor Hall Effect
val = hallRead();
/* LED Kuning */
// Pengecekan apakah pembacaan sensor menghasilkan nilai positif
if(val > 50){
// Menyalakan LED Kuning
ledY_ON = true;
digitalWrite(ledPinY, HIGH);
if (ledY_ON != ledY_last){
// Mencetak nilai bacaan sensor efek magnet
Serial.print("Hall Effect Value: ");
Serial.println(val);
Serial.println("Yellow LED on");
Serial.println("");
}
}
else{
// Mematikan LED Kuning
ledY_ON = false;
digitalWrite(ledPinY, LOW);
if (ledY_ON != ledY_last){
// Mencetak nilai bacaan sensor efek magnet
Serial.print("Hall Effect Value: ");
Serial.println(val);
Serial.println("Yellow LED off");
Serial.println("");
}
}
ledY_last = ledY_ON; /* LED Merah */
// Pengecekan apakah pembacaan sensor menghasilkan nilai negatif
if(val < 10){
// Menyalakan LED Merah
ledR_ON = true;
digitalWrite(ledPinR, HIGH);
if (ledR_ON != ledR_last){
// Mencetak nilai bacaan sensor efek magnet
Serial.print("Hall Effect Value: ");
Serial.println(val);
Serial.println("Red LED on");
Serial.println("");
}
}
else{
// Mematikan LED Merah
ledR_ON = false;
digitalWrite(ledPinR, LOW);
if (ledR_ON != ledR_last){
// Mencetak nilai bacaan sensor efek magnet
Serial.print("Hall Effect Value: ");
Serial.println(val);
Serial.println("Red LED off");
Serial.println("");
}
}
ledR_last = ledR_ON;
delay(500);
}
Daftar command dan fungsinya pada code di atas:
const int
menandakan bahwa pin adalah sebuah angka yang bersifat tetap dan tidak berubah (konstan)boolean
menandakan bahwa variabel memiliki nilai “benar” atau “salah”void()
menandakan bahwa fungsi tidak akan mengembalikan nilai apapunsetup()
adalah bagian untuk melakukan konfigurasi awal seperti pengalokasian pin ESP32 untuk setiap komponenloop()
adalah bagian yang berfungsi untuk menjalankan perintah-perintah di dalamnya secara terus menerus tanpa hentiserial.begin(speed)
berfungsi untuk mengatur kecepatan penerimaan dan pengiriman data, dimulai dari 9600–115.200 bits per second (bps)pinMode(pinNumber, state)
berfungsi untuk mengalokasikan pin yang terhubung dengan komponen sebagai input atau outputhallRead()
berfungsi untuk membaca nilai magnet dari magnet yang didekatkan dengan sensor efek magnetdigitalWrite(pinNumber, state)
berfungsi untuk mengirimkan sinyal digital “0” yang berarti LOW (ESP32 mengalirkan 0 Volt) atau “1” yang berarti HIGH (ESP32 mengalirkan 3,3 Volt)serial.print
berfungsi untuk mencetak tulisan ke layarserial.println
berfungsi untuk mencetak tulisan ke layar dengan pengaturan tulisan selanjutnya berada pada baris barudelay(time)
berfungsi untuk memberi jeda waktu sebelum perintah selanjutnya. Waktu yang dimasukkan dalam satuan ms (1s = 1000ms)
Sensor Hall Effect dapat menghasilkan pembacaan nilai negatif maupun nilai positif, tergantung kutub yang didekatkan dengan sensor. Magnet pertama yang saya gunakan akan menghasilkan nilai pembacaan sekitar 80, sedangkan magnet kedua menghasilkan nilai pembacaan sekitar 5 hingga -50. Oleh karena itu saya membuat 2 kondisi, satu untuk menyalakan lampu LED kuning dengan magnet pertama, dan satu lagi untuk menyalakan lampu LED merah dengan magnet kedua.
Dalam proyek ke-3 dari #YukBelajarESP32, tidak ada masalah besar yang saya hadapi selama melakukan eksperimen. Permasalahan yang muncul merupakan masalah kecil saja, seperti ESP32 yang tidak dapat menyalakan LED meski sudah terpasang pada breadboard dan rangkaian sudah disusun secara benar. Hal tersebut dapat terjadi sesuai dengan penjelasan saya sebelumnya bahwa kualitas breadboard yang saya miliki kurang baik sehingga terdapat kemungkinan listrik tidak dapat mengalir. Oleh karena itu, apabila masalah tersebut terjadi, saya biasanya mencoba melepas ESP32 dari breadboard dan memasangnya kembali secara lebih kencang untuk memastikan ESP32 terpasang dengan baik.
Akhir Kata
Sekian saja perjalanan ketiga #YukESP32 kali ini. Kita telah berhasil belajar bagaimana caranya menyalakan lampu LED dengan sentuhan tangan dan magnet. Eksperimen yang cukup sederhana tetapi semoga tetap dapat bermanfaat dalam mengembangkan kemampuan kita dalam menggunakan ESP32. Jangan bosan dan jangan lupa untuk terus mengikuti proyek-proyek berikutnya, sampai jumpa pada episode lain dari #YukESP32!
Sumber :