Pembacaan Sensor dan Aktuator dengan ADC/DAC pada ESP32

Pada ESP32, kita dapat memanfaatkan Analog-to-Digital Converter (ADC) untuk membaca nilai analog dari sensor dan Digital-to-Analog Converter (DAC) untuk mengontrol aktuator, seperti LED atau kipas. Untuk memahami cara kerja ADC dan DAC, kita akan membahas konsep dasar dan melakukan perhitungan dengan contoh kasus yang melibatkan pembacaan sensor dan pengontrolan aktuator.
ESP32 dilengkapi dengan ADC (Analog-to-Digital Converter) untuk membaca sinyal analog dan DAC (Digital-to-Analog Converter) untuk menghasilkan sinyal analog. ADC mengubah tegangan analog (misalnya, tegangan dari sensor) menjadi nilai digital yang bisa diproses oleh mikrokontroler, sementara DAC menghasilkan tegangan analog berdasarkan nilai digital yang diberikan.
Pada artikel ini, kita akan membahas bagaimana menggunakan ADC dan DAC pada ESP32 untuk membaca nilai dari sensor analog dan mengontrol aktuator dengan memberikan rumus dan perhitungan yang terkait dalam konversi antara analog, ADC, dan DAC, beserta contoh kasus nyata.
Pin ADC dan DAC pada ESP32
- ADC: ESP32 memiliki dua ADC (ADC1 dan ADC2), dengan beberapa pin yang dapat digunakan untuk membaca nilai analog:
- ADC1: GPIO 36, 37, 38, 39, 32, 33, 34, 35
- ADC2: GPIO 4, 0, 2, 15, 13, 12, 14, 27, 25, 26
- DAC: ESP32 memiliki dua saluran DAC (Digital-to-Analog Converter) yang dapat digunakan untuk menghasilkan sinyal analog:
- DAC1: GPIO 25
- DAC2: GPIO 26
Fungsi-Fungsi Berguna Lainnya
Terdapat beberapa fungsi lanjutan lainnya yang dapat digunakan dengan pin ADC pada ESP32 yang berguna untuk berbagai proyek.
- analogReadResolution(resolution): Mengatur jumlah bit sampel dan resolusi. Nilai yang dapat dipilih berkisar antara 9 bit (0 – 511) hingga 12 bit (0 – 4095). Nilai default adalah resolusi 12 bit.
- analogSetWidth(width): Mengatur jumlah bit sampel dan resolusi. Nilai yang dapat dipilih berkisar antara 9 bit (0 – 511) hingga 12 bit (0 – 4095). Nilai default adalah resolusi 12 bit.
- analogSetCycles(cycles): Mengatur jumlah siklus per sampel. Nilai default adalah 8. Rentang nilai: 1 hingga 255.
- analogSetSamples(samples): Mengatur jumlah sampel dalam rentang waktu. Nilai default adalah 1 sampel. Fungsi ini dapat meningkatkan sensitivitas pembacaan.
- analogSetClockDiv(attenuation): Mengatur pembagi untuk clock ADC. Nilai default adalah 1. Rentang nilai: 1 hingga 255.
- analogSetAttenuation(attenuation): Mengatur atenuasi input untuk semua pin ADC. Nilai default adalah ADC_11db. Nilai yang diterima adalah:
- ADC_0db: Tidak ada atenuasi. ADC dapat mengukur hingga sekitar 800 mV (input 1V = pembacaan ADC 1088).
- ADC_2_5db: Tegangan input ADC akan mengalami atenuasi, memperluas rentang pengukuran hingga sekitar 1100 mV (input 1V = pembacaan ADC 3722).
- ADC_6db: Tegangan input ADC akan mengalami atenuasi, memperluas rentang pengukuran hingga sekitar 1350 mV (input 1V = pembacaan ADC 3033).
- ADC_11db: Tegangan input ADC akan mengalami atenuasi, memperluas rentang pengukuran hingga sekitar 2600 mV (input 1V = pembacaan ADC 1575).
- analogSetPinAttenuation(pin, attenuation): Mengatur atenuasi input untuk pin yang ditentukan. Nilai default adalah ADC_11db. Nilai atenuasi yang diterima adalah sama seperti fungsi sebelumnya.
- adcAttachPin(pin): Menghubungkan pin ke ADC (juga membersihkan mode analog lainnya yang mungkin sedang aktif). Fungsi ini mengembalikan nilai TRUE atau FALSE untuk menunjukkan apakah penghubungan pin berhasil.
- adcStart(pin), adcBusy(pin), dan adcEnd(pin): Memulai konversi ADC pada bus pin yang terhubung. Memeriksa apakah konversi pada bus ADC pin sedang berlangsung (mengembalikan TRUE atau FALSE). Mendapatkan hasil konversi: mengembalikan nilai integer 16-bit.
Fungsi-fungsi di atas memberikan fleksibilitas lebih dalam mengatur pembacaan sinyal analog pada ESP32, memungkinkan pengguna untuk menyesuaikan konfigurasi ADC sesuai kebutuhan proyek mereka.
1. Konsep ADC (Analog to Digital Converter)
ADC pada ESP32 memungkinkan kita untuk membaca sinyal analog dan mengonversinya menjadi nilai digital yang dapat diproses oleh mikrokontroler. ESP32 memiliki ADC dengan resolusi hingga 12 bit, yang berarti rentang nilai ADC adalah 0 hingga 4095, dengan tegangan referensi sebesar 3.3V.
Rumus Konversi dari Nilai ADC ke Tegangan:
Rumus untuk mengonversi nilai ADC yang terbaca menjadi tegangan analog adalah sebagai berikut:
Contoh Perhitungan:
Misalkan kita menggunakan sensor suhu LM35, yang memberikan output tegangan 10 mV per derajat Celsius. Jika nilai ADC yang terbaca adalah 2048, kita dapat menghitung tegangan input dan suhu yang terukur sebagai berikut:
amun, jika nilai suhu yang dihitung tidak wajar (misalnya 165°C), itu menandakan ada masalah dalam pengukuran atau pengkabelan sensor. Dalam praktiknya, suhu ruang akan terukur sekitar 25°C.
Contoh Kasus: Membaca Sensor Suhu LM35
Misalnya, kita ingin membaca nilai suhu menggunakan sensor LM35, yang memberikan output analog sebanding dengan suhu (misalnya, 10mV per derajat Celsius). Kita akan menggunakan pin ADC untuk membaca nilai tegangan yang dihasilkan oleh sensor.
Skematik:
- Pin VCC LM35 ke 5V.
- Pin GND LM35 ke ground.
- Pin OUT LM35 ke pin GPIO 34 (ADC pin) pada ESP32.
Kode untuk Membaca Sensor Suhu LM35:
int analogPin = 34; // Pin ADC yang digunakan int sensorValue = 0; // Variabel untuk menyimpan nilai ADC float voltage = 0; // Variabel untuk menyimpan nilai tegangan float temperature = 0; // Variabel untuk menyimpan nilai suhu void setup() { Serial.begin(115200); // Memulai komunikasi serial } void loop() { sensorValue = analogRead(analogPin); // Membaca nilai ADC voltage = sensorValue * (3.3 / 4095.0); // Menghitung tegangan dari nilai ADC temperature = voltage * 100; // Menghitung suhu dalam derajat Celsius (LM35: 10mV/°C) Serial.print("Suhu: "); Serial.print(temperature); // Menampilkan suhu Serial.println(" C"); delay(1000); // Menunggu 1 detik sebelum pembacaan berikutnya }
Penjelasan:
- analogRead(analogPin): Membaca nilai dari pin ADC (GPIO 34).
- voltage: Menghitung tegangan berdasarkan nilai ADC.
- temperature: Mengonversi tegangan ke suhu dalam derajat Celsius. LM35 memberikan 10mV per derajat Celsius, sehingga kita mengalikan tegangan dengan 100.
2. Konsep DAC (Digital to Analog Converter)
DAC digunakan untuk mengubah nilai digital menjadi tegangan analog. Pada ESP32, terdapat dua channel DAC yang tersedia pada GPIO 25 dan GPIO 26. Nilai DAC berkisar dari 0 hingga 255, dan tegangan output berkisar antara 0V hingga 3.3V.
Rumus Konversi dari Nilai DAC ke Tegangan:
Rumus untuk mengonversi nilai DAC menjadi tegangan output adalah sebagai berikut:
Contoh Perhitungan:
Jika kita memberikan nilai 128 ke DAC pada GPIO 25, kita dapat menghitung tegangan output sebagai berikut:
Dengan tegangan output 1.65V, LED akan menyala dengan kecerahan sekitar setengah dari kecerahan maksimum.
Contoh Kasus: Mengontrol Kecerahan LED dengan DAC
Kita dapat menggunakan DAC1 (GPIO 25) atau DAC2 (GPIO 26) untuk mengeluarkan sinyal analog yang mengontrol kecerahan LED.
Skematik:
- LED dengan resistor ke GPIO 25 (DAC1).
- Pin GND LED ke ground.
Kode untuk Mengontrol Kecerahan LED:
int ledPin = 25; // Pin DAC yang digunakan int brightness = 0; // Variabel untuk kecerahan LED void setup() { Serial.begin(115200); // Memulai komunikasi serial } void loop() { for (brightness = 0; brightness < 255; brightness++) { dacWrite(ledPin, brightness); // Menulis nilai kecerahan ke pin DAC delay(10); // Delay untuk efek transisi } for (brightness = 255; brightness > 0; brightness--) { dacWrite(ledPin, brightness); // Menulis nilai kecerahan ke pin DAC delay(10); // Delay untuk efek transisi } }
Penjelasan:
- dacWrite(ledPin, brightness): Fungsi ini digunakan untuk mengatur nilai output pada pin DAC. Nilai
brightness
berkisar antara 0 hingga 255, yang mengatur tegangan analog yang diberikan ke LED. - Loop: LED akan perlahan-lahan menyala dan meredupkan kecerahannya dengan mengubah nilai DAC.
3. Contoh Kasus: Membaca Suhu dan Mengontrol Kipas Berdasarkan Suhu
Misalkan kita memiliki sensor suhu LM35 yang terhubung ke GPIO 34 (ADC1) dan sebuah kipas yang dikendalikan dengan menggunakan DAC1 (GPIO 25). Kita ingin membaca suhu dan mengatur kecepatan kipas berdasarkan suhu tersebut.
- Tegangan referensi: 3.3V
- Rentang ADC: 0–4095
- Sensor LM35: 10 mV per derajat Celsius
Langkah 1: Membaca Sensor dan Menghitung Suhu
- Baca Nilai ADC: Misalkan nilai ADC yang terbaca adalah 2048.
- Hitung Tegangan Input:
- Hitung Suhu (°C):
Namun, jika suhu yang terbaca sangat tinggi, kemungkinan ada masalah dengan sensor atau pembacaan ADC. Untuk suhu sekitar 25°C, nilai ADC yang terbaca harus lebih kecil, sekitar 512.
Langkah 2: Mengontrol Kipas Berdasarkan Suhu
Jika suhu lebih tinggi dari 30°C, kita akan mengatur kecepatan kipas dengan menggunakan DAC. Kecepatan kipas akan ditingkatkan seiring dengan meningkatnya suhu.
- Tentukan Kecepatan Kipas berdasarkan Suhu:
- Misalkan rentang suhu yang diinginkan adalah dari 30°C hingga 50°C.
- Rentang kecepatan kipas adalah 128 hingga 255 (nilai DAC).
Dengan menggunakan fungsi map()
pada Arduino, kita dapat memetakan suhu ke kecepatan kipas:
fanSpeed=map(temperature,30,50,128,255)
Jika suhu terdeteksi 35°C, kita dapat menghitung kecepatan kipas:
fanSpeed=map(35,30,50,128,255)=179
- Konversi ke Tegangan Output dengan DAC: Dengan menggunakan DAC1 pada GPIO 25, kita mengatur nilai 179 untuk mengontrol kecepatan kipas:
Kipas akan berputar dengan kecepatan yang lebih tinggi, seiring dengan meningkatnya suhu.
4. Contoh Kode untuk Membaca Suhu dan Mengontrol Kipas Berdasarkan Suhu
Berikut adalah contoh kode yang menggabungkan pembacaan sensor suhu menggunakan ADC dan pengontrolan kecepatan kipas menggunakan DAC:
#define SENSOR_PIN 34 // GPIO 34 sebagai pin sensor suhu (ADC1) #define FAN_PIN 25 // GPIO 25 sebagai pin DAC untuk mengontrol kecepatan kipas void setup() { Serial.begin(115200); // Memulai komunikasi serial pinMode(SENSOR_PIN, INPUT); // Menetapkan SENSOR_PIN sebagai input pinMode(FAN_PIN, OUTPUT); // Menetapkan FAN_PIN sebagai output } void loop() { int adcValue = analogRead(SENSOR_PIN); // Membaca nilai ADC dari sensor suhu float voltage = adcValue * (3.3 / 4095.0); // Menghitung tegangan dari nilai ADC float temperature = voltage * 100.0; // Menghitung suhu (dalam °C) berdasarkan LM35 Serial.print("Suhu: "); Serial.print(temperature); // Menampilkan suhu Serial.println(" °C"); // Mengontrol kecepatan kipas berdasarkan suhu int fanSpeed = map(temperature, 30, 50, 128, 255); // Memetakan suhu ke kecepatan kipas analogWrite(FAN_PIN, fanSpeed); // Mengatur kecepatan kipas dengan DAC delay(1000); // Menunggu selama 1 detik sebelum pembacaan berikutnya }