Arduino merasakan
Tombol cuma punya dua keadaan: ditekan atau tidak. Dunia nyata lebih kaya: cahaya bisa redup atau terang, suhu bisa 24 atau 31 derajat, benda bisa sejauh 10 atau 80 sentimeter. Di bab ini Arduino belajar membaca nilai-nilai itu lewat sensor.
DI BAB INI KAMU BAKAL BISA
- membaca pin analog dan mengubah skalanya dengan map()
- membuat lampu yang menyala sendiri saat gelap
- membaca suhu dan kelembapan dengan DHT11
- mengukur jarak dengan sensor ultrasonik
- membuat bacaan sensor stabil
YANG DIBUTUHKAN
- potensiometer 10 kΩ
- LDR + resistor 10 kΩ
- DHT11 + resistor 10 kΩ
- sensor ultrasonik HC-SR04
- 4 kabel male-female
- LED + resistor 220 Ω
- library DHT sensor library (Adafruit)
6.1Pin analog & potensiometer
Potensiometer adalah tombol putar, seperti tombol volume radio lama. Kakinya tiga. Dua kaki di pinggir disambung ke 5V dan GND, dan kaki tengah mengeluarkan tegangan yang berubah sesuai putarannya: dari 0 volt di satu ujung sampai 5 volt di ujung lain.
void setup() { Serial.begin(9600); } void loop() { int nilai = analogRead(A0);1 float volt = nilai * 5.0 / 1023;2 Serial.print("Nilai: "); Serial.print(nilai); Serial.print(" Tegangan: "); Serial.println(volt); delay(200); }
- 1
analogRead()mengubah tegangan 0 sampai 5 volt menjadi angka 0 sampai 1023. Pin analog tidak perlupinMode(). - 2Mengubah angka tadi kembali ke volt. Pakai
5.0, bukan5, supaya hasilnya berkoma (ingat 4.3).
Buka Serial Monitor lalu putar potensiometernya pelan-pelan. Angkanya bergerak dari 0 sampai 1023. Coba juga buka Serial Plotter: putaran tanganmu jadi garis yang naik turun.
Pin analog Uno membagi 5 volt menjadi 1024 langkah (0 sampai 1023). Satu langkah sekitar 0,005 volt. Jumlah langkah ini disebut resolusi, dan Uno memakai resolusi 10 bit, karena 2 pangkat 10 sama dengan 1024.
map(): mengubah rentang
Sering kali angka 0 sampai 1023 perlu diubah ke rentang lain: 0 sampai 100 persen, 0 sampai 180 derajat, atau 0 sampai 255. map()
melakukannya dalam satu baris.
int persen = map(analogRead(A0), 0, 1023, 0, 100);
map() hanya menghasilkan bilangan bulat. Hasilnya pas untuk persen atau derajat, tapi untuk nilai yang butuh koma, hitung sendiri seperti
baris volt di atas.
Pasang LCD dari Bab 5 bersama potensiometer (keduanya bisa dicolok bersamaan), lalu tampilkan Putaran: 73% di layar.
Ingat trik spasi di 5.4 supaya angka 100 yang berubah jadi 99 tidak meninggalkan sisa angka.
6.2Sensor cahaya: lampu otomatis
LDR (light dependent resistor) adalah resistor yang hambatannya berubah karena cahaya. Di tempat terang hambatannya kecil, beberapa kilo-ohm. Di tempat gelap bisa naik sampai ratusan kilo-ohm. Arduino tidak bisa membaca hambatan langsung, jadi LDR dipasangkan dengan resistor 10 kΩ membentuk pembagi tegangan. Titik di antara keduanya disambung ke A0.
Dengan susunan ini, makin terang cahayanya, makin tinggi angka di A0. Tambahkan LED dan resistor 220 Ω di pin 13 seperti proyek 3.2, lalu upload:
const int LDR = A0; const int LAMPU = 13; const int BATAS_GELAP = 300;1 void setup() { Serial.begin(9600); pinMode(LAMPU, OUTPUT); } void loop() { int cahaya = analogRead(LDR); Serial.println(cahaya); if (cahaya < BATAS_GELAP) { digitalWrite(LAMPU, HIGH); // gelap: lampu nyala } else { digitalWrite(LAMPU, LOW); } delay(100); }
- 1Angka batas ini harus kamu tentukan sendiri, karena tergantung LDR dan cahaya ruanganmu. Buka Serial Monitor, catat angka saat terang dan saat LDR ditutup telapak tangan, lalu pilih angka di tengah-tengahnya.
- Angkanya hampir tidak berubah: LDR dan resistor tidak satu kolom dengan kabel A0, atau resistor yang terpasang bukan 10 kΩ.
- Terbalik, makin gelap angkanya makin besar: posisi LDR dan resistor tertukar. Itu juga boleh, tinggal balik tanda
<menjadi>.
6.3Suhu & kelembapan dengan DHT11
DHT11 adalah sensor biru berkisi yang mengukur suhu udara dan kelembapan sekaligus. Dia tidak mengeluarkan tegangan yang naik turun, tapi mengirim angka jadi lewat satu kabel data ke pin digital. Cara bacanya cukup rumit, jadi kita pakai library.
1PASANG LIBRARY
Di Library Manager, cari DHT sensor library buatan Adafruit, klik INSTALL, lalu pilih Install all supaya library pendukungnya (Adafruit Unified Sensor) ikut terpasang.
2RANGKAI
- Tancapkan DHT11 di baris f, kolom 10 sampai 13, sisi berkisi menghadap ke arahmu.
- Kolom 10 (VCC) ke rel merah atas. Kolom 13 (GND) ke rel biru atas.
- Resistor 10 kΩ dari kolom 11 (DATA) ke rel merah atas. Kabel dari kolom 11 ke pin 2.
- Rel biru atas ke GND di sebelah pin 13. Rel merah atas ke pin 5V di kiri bawah Arduino.
Banyak kit berisi DHT11 yang sudah dipasang di papan kecil dengan 3 kaki. Resistor 10 kΩ-nya sudah ada di papan itu, jadi tidak perlu dipasang lagi. Urutan kakinya beda-beda antar pabrik: baca tulisan di papannya (biasanya +, OUT atau S, dan −), lalu sambungkan + ke 5V, OUT ke pin 2, − ke GND.
3UPLOAD
#include <DHT.h> DHT dht(2, DHT11);1 void setup() { Serial.begin(9600); dht.begin(); } void loop() { delay(2000);2 float lembap = dht.readHumidity(); float suhu = dht.readTemperature();3 if (isnan(lembap) || isnan(suhu)) {4 Serial.println("Gagal membaca DHT11, cek kabelnya."); return; } Serial.print("Suhu: "); Serial.print(suhu); Serial.print(" C Kelembapan: "); Serial.print(lembap); Serial.println(" %"); }
- 1Membuat objek sensor bernama
dht: data di pin 2, jenisnya DHT11. - 2DHT11 lambat: paling cepat dibaca sekali per detik. Jeda 2 detik memberi waktu yang cukup.
- 3Hasilnya dalam derajat Celsius.
- 4
isnan()mengecek apakah hasilnya "bukan angka", tanda pembacaan gagal.returnmenghentikan putaranloop()ini lebih awal, dan Arduino mencoba lagi di putaran berikutnya.
Menurut lembar datanya, DHT11 punya toleransi sekitar ±2 °C untuk suhu dan ±5% untuk kelembapan, dengan rentang 0 sampai 50 °C. Jadi kalau DHT11 bilang 29 °C dan termometer rumahmu 28 °C, keduanya bisa sama-sama benar. Untuk memantau kamar atau kandang itu cukup. Untuk kebutuhan yang lebih teliti, ada sensor lain seperti DHT22 atau SHT31.
Satu hal lagi: badan Arduino dan tanganmu ikut menghangatkan udara di sekitarnya. Letakkan sensor agak jauh dan tunggu beberapa menit sebelum membandingkan angkanya.
6.4Mengukur jarak dengan ultrasonik
Sensor HC-SR04 bekerja seperti kelelawar. Mata kirinya memancarkan bunyi berfrekuensi sangat tinggi (40 kHz, terlalu tinggi untuk telinga manusia). Bunyi itu memantul dari benda di depannya, lalu ditangkap mata kanan. Arduino mengukur berapa lama bunyi itu pergi dan pulang, lalu menghitung jaraknya.
const int TRIG = 9; const int ECHO = 10; void setup() { Serial.begin(9600); pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT); } void loop() { digitalWrite(TRIG, LOW); delayMicroseconds(2); digitalWrite(TRIG, HIGH);1 delayMicroseconds(10); digitalWrite(TRIG, LOW); long durasi = pulseIn(ECHO, HIGH, 30000);2 float jarak = durasi * 0.0343 / 2;3 if (durasi == 0) { Serial.println("Di luar jangkauan"); } else { Serial.print("Jarak: "); Serial.print(jarak); Serial.println(" cm"); } delay(100); }
- 1Pin TRIG dinyalakan selama 10 mikrodetik (sepersejuta detik) sebagai aba-aba: "pancarkan bunyi sekarang".
- 2
pulseIn()mengukur berapa mikrodetik pin ECHO menyala, yaitu lama perjalanan bunyi. Angka 30000 adalah batas tunggu: kalau lebih dari 30 milidetik tidak ada pantulan, hasilnya 0. - 3Bunyi menempuh sekitar 0,0343 cm per mikrodetik. Hasilnya dibagi 2 karena bunyinya pergi lalu pulang.
Angka 0,0343 adalah kecepatan bunyi di udara sekitar 20 °C. Di ruangan Indonesia yang 30 °C, bunyi sedikit lebih cepat, sekitar 0,0349. Bedanya kurang dari 2%: untuk sensor parkir tidak terasa, tapi kalau kamu butuh ukuran yang teliti, angka ini bisa dikoreksi dengan suhu dari DHT11.
HC-SR04 paling akurat untuk jarak sekitar 2 sampai 400 cm, dan untuk benda yang permukaannya keras dan menghadap lurus ke sensor. Kain, busa, atau benda yang miring menyerap atau membelokkan bunyi, sehingga angkanya bisa meloncat.
6.5Biar bacaan nggak loncat-loncat
Coba lihat angka LDR atau jarak di Serial Plotter. Walaupun tidak ada yang bergerak, garisnya bergetar sedikit. Itu normal: setiap sensor membaca sedikit gangguan. Masalah muncul kalau angkanya dipakai untuk mengambil keputusan, misalnya lampu otomatis 6.2 yang berkedip-kedip saat cahaya pas di sekitar batas.
Cara 1: ambil rata-rata
int bacaRataRata(int pin) { long total = 0; for (int i = 0; i < 10; i++) { total += analogRead(pin); delay(2); } return total / 10; }
Sepuluh bacaan dijumlah lalu dibagi sepuluh. Getaran kecil saling menutupi, dan hasilnya jauh lebih tenang. Variabel total memakai
long karena 10 × 1023 sudah melewati batas aman int kalau jumlah bacaannya ditambah.
Cara 2: dua batas (histeresis)
Untuk keputusan nyala-mati, pakai dua batas yang berjauhan: lampu baru menyala kalau cahaya turun di bawah 280, dan baru mati lagi kalau naik di atas 340. Di antara keduanya, lampu tetap pada keadaan terakhirnya.
bool lampuNyala = false; void loop() { int cahaya = bacaRataRata(A0); if (!lampuNyala && cahaya < 280) { lampuNyala = true; } else if (lampuNyala && cahaya > 340) { lampuNyala = false; } digitalWrite(13, lampuNyala); delay(100); }
Termostat AC dan dispenser air memakai trik yang sama. Kalau AC menyala tepat di 24 °C dan mati tepat di 24 °C, kompresornya akan hidup-mati berkali-kali setiap menit. Dengan dua batas, misalnya nyala di 25 °C dan mati di 23 °C, mesinnya bekerja tenang.
Gabungkan potensiometer (6.1) dengan lampu otomatis: pakai potensiometer untuk mengatur BATAS_GELAP tanpa perlu upload ulang.
Petunjuk: pasang potensiometer di A1, dan baca nilainya di setiap putaran loop().