Tutorial Belanja komponen

Tutorial › Memulai dengan Arduino

Bab 6: Arduino merasakan

BAB 6
06

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

PROYEK 6.115 MENIT · MUDAH

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.

ATMEGA328P L TX RX ON UNO SCL SDA AREF GND 13 12 ~11 ~10 ~9 8 7 ~6 ~5 4 ~3 2 TX1 RX0 POWER ANALOG IN DIGITAL (PWM~) 5V GND A0+−+−115510101515202025253030jihgfedcba
Kaki kiri ke rel merah (5V), kaki tengah ke A0, kaki kanan ke rel biru (GND). Rel bawah breadboard diisi dari pin 5V dan GND di kiri bawah Arduino.
BACA_POT.INO
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. 1analogRead() mengubah tegangan 0 sampai 5 volt menjadi angka 0 sampai 1023. Pin analog tidak perlu pinMode().
  2. 2Mengubah angka tadi kembali ke volt. Pakai 5.0, bukan 5, 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.

KENAPA 1023?

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.

COBA UBAH

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

PROYEK 6.220 MENIT · MUDAH

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.

ATMEGA328P L TX RX ON UNO SCL SDA AREF GND 13 12 ~11 ~10 ~9 8 7 ~6 ~5 4 ~3 2 TX1 RX0 POWER ANALOG IN DIGITAL (PWM~) 5V GND A0+−+−115510101515202025253030jihgfedcba
LDR dari rel 5V ke kolom 10. Resistor 10 kΩ (cokelat-hitam-oranye) dari kolom 10 ke kolom 14, lalu ke GND. Kolom 10 juga 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:

LAMPU_OTOMATIS.INO
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);
}
  1. 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.
KALAU GAGAL
  • 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

PROYEK 6.325 MENIT · SEDANG

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

ATMEGA328P L TX RX ON UNO SCL SDA AREF GND 13 12 ~11 ~10 ~9 8 7 ~6 ~5 4 ~3 2 TX1 RX0 POWER ANALOG IN DIGITAL (PWM~) 2 5V GND+−+−115510101515202025253030jihgfedcbaDHT11VCCDATANCGND
Kaki DHT11 dari kiri (sisi berkisi menghadapmu): VCC, DATA, NC (tidak dipakai), GND. Resistor 10 kΩ dari DATA ke rel 5V.
  1. Tancapkan DHT11 di baris f, kolom 10 sampai 13, sisi berkisi menghadap ke arahmu.
  2. Kolom 10 (VCC) ke rel merah atas. Kolom 13 (GND) ke rel biru atas.
  3. Resistor 10 kΩ dari kolom 11 (DATA) ke rel merah atas. Kabel dari kolom 11 ke pin 2.
  4. Rel biru atas ke GND di sebelah pin 13. Rel merah atas ke pin 5V di kiri bawah Arduino.
PUNYA DHT11 VERSI MODUL?

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

SUHU_DHT11.INO
#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(" %");
}
  1. 1Membuat objek sensor bernama dht: data di pin 2, jenisnya DHT11.
  2. 2DHT11 lambat: paling cepat dibaca sekali per detik. Jeda 2 detik memberi waktu yang cukup.
  3. 3Hasilnya dalam derajat Celsius.
  4. 4isnan() mengecek apakah hasilnya "bukan angka", tanda pembacaan gagal. return menghentikan putaran loop() ini lebih awal, dan Arduino mencoba lagi di putaran berikutnya.
KOK BEDA DENGAN TERMOMETER DI RUMAH?

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

PROYEK 6.420 MENIT · SEDANG

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.

ATMEGA328P L TX RX ON UNO SCL SDA AREF GND 13 12 ~11 ~10 ~9 8 7 ~6 ~5 4 ~3 2 TX1 RX0 POWER ANALOG IN DIGITAL (PWM~) 9 10 5V GNDHC-SR04VCCTRIGECHOGND
Pakai kabel male-female langsung dari kaki sensor ke Arduino: VCC ke 5V, TRIG ke pin 9, ECHO ke pin 10, GND ke GND.
JARAK_ULTRASONIK.INO
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);
}
  1. 1Pin TRIG dinyalakan selama 10 mikrodetik (sepersejuta detik) sebagai aba-aba: "pancarkan bunyi sekarang".
  2. 2pulseIn() 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.
  3. 3Bunyi menempuh sekitar 0,0343 cm per mikrodetik. Hasilnya dibagi 2 karena bunyinya pergi lalu pulang.
UDARA PANAS, BUNYI LEBIH CEPAT

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

RATA_RATA.INO
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.

LAMPU_HISTERESIS.INO
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);
}
CATATAN

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.

COBA UBAH

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().