Rancang Bangun Dispenser Air Otomatis Berbasis Arduino Uno
Ringkasan
Project ini bertujuan untuk membuat dispenser air otomatis tanpa sentuh menggunakan Arduino Uno. Jadi cukup dekatkan gelas, nanti airnya akan langsung keluar sendiri. Cara kerjanya sensor ultrasonik akan mendeteksi gelas. Pada saat gelas didekatkan, pompa airnya akan menyala dan airnya keluar secara otomatis. Selain itu alat ini juga dilengkapi dengan sensor water level untuk mengetahui apakah air masih ada atau sudah habis, serta sensor suhu yang berfungsi untuk memantau kondisi suhu air.
Latar Belakang
Dalam kehidupann sehari-hari, air minum adalah kebutuhan utama. Biasanya, kita mengambil air dari dispenser dengan cara menekan tombol atau membuka keran secara manual. Cara ini sebenarnya kurang praktis dan juga kurang higienis, karena banyak orang menyentuh bagian yang sama, sehingga bisa menjadi tempat penyebaran kuman.
Di sisi lain, perkembangan teknologi sekrang sudah semakin maju, terutama dalam penggunaan mikrokontroller seperti Arduino. dengan teknologi ini, kita bisa membuat alat yang bekerja secara otomatis dan lebih praktis digunakan. Berdasarkan hal tersebut, dibuatlah project Smart Dispenser Air Otomatis. Alat ini dirancang agar bisa mengeluarkan air tanpa perlu disentuh. Cukup dengan mendekatkan gelas atau tangan, air akan keluar secara otomatis menggunakan bantuan sensor. Selain itu alat ini juga dilengkapi dengan sensor untuk mengetahui apakah air masih tersedia atau sudah habis, serta sensor suhu untuk mengetahui kondisi air. Jadi, pengguna bisa lebih mudah dan nyaman saat menggunakan dispenser.
Dengan adanya alat ini, diharapkan penggunaan dispenser air menjadi lebih praktis, higienis, dan sesuai dengan perkembangan teknologi saat ini.
Tujuan
- Membuat alat dispenser air yang dapat bekerja secara otomatis tanpa sentuhan.
- Memanfaatkan Arduino sebagai sistem kontrol utama dalam pembuatan alat.
- Menggunakan sensor untuk mendeteksi keberadaan gelas atau tangan.
- Mengetahui kondisi air (ada atau habis) menggunakan water level sensor.
- Mengetahui suhu air menggunakan sensor suhu (DS18B20).
Manfaat
- Memudahkan pengguna dalam mengambil air tanpa perlu menekan tombol.
- Lebih higienis karena tidak perlu menyentuh dispenser.
- Memberikan informasi kondisi air melalui indikator LED dan Buzzer.
- Membantu memahami penerapan teknologi Arduino dalam kehidupan sehari-hari.
Alat dan Bahan
Alat dan Bahan
- Arduino Uno
- Ultrasonic HC-SR04
- Water Level Sensor
- Mini Water Pump (12 Volt)
- Relay Modul 1 Channel
- LED
- Buzzer
- Adaptor 12V
- Selang Air
- Kabel Jumper
- Breadboard
- Wadah air
- Temperature Sensor (DS18B20)
Metodologi
- Perancangan Sistem : Pada tahap ini dilakukan perencanaan alat, mulai dari menentukan konsep kerja, memilih komponen serta membuat alur kerja sistem.
- Persiapan Alat dan Bahan : Menyiapkan semua komponen yang dibutuhkan dalam pembuatan alat, baik yang sudah tersedia maupun yang perlu dibeli.
- Perakitan Rangkaian : Menghubungkan semua komponen sesuai dengan rangkaian yang telah dirancang, seperti sensor ke arduino, relay ke pompa, serta memastikan semua kabel terpasang dengan benar.
- Pembuatan Program : Membuat program menggunakan Arduino IDE agar alat dapat bekerja secara otomatis sesuai dengan fungsi yang diinginkan.
- Pengujian Alat : Melakukan uji coba untuk memastikan sistem berjalan dengan baik, seperti mendeteksi objek, mengaktifkan pompa, serta memberikan notifikasi saat air habis.
- Evaluasi dan Perbaikan : Melakukan pengecekan ulang jika terdapat kesalahan, kemudian memperbaiki rangkaian atau program hingga alat dapat bekerja dengan optimal.
Desain Sistem

Skenario Pengujian
Hasil Pengujian
Kesimpulan
Source Code / Pseudocode
#include <OneWire.h>
#include <DallasTemperature.h>
#define trigPin 9
#define echoPin 10
#define relay 7
#define led 6
#define buzzer 5
#define waterSensor A0
#define potPin A1
#define tempPin 2
OneWire oneWire(tempPin);
DallasTemperature sensors(&oneWire);
long duration;
int distance;
int waterLevel;
float suhu;
int thresholdJarak;
unsigned long relayOnTime = 0;
const unsigned long MAX_RELAY_ON = 5000;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(relay, OUTPUT);
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
digitalWrite(relay, LOW);
digitalWrite(led, LOW);
digitalWrite(buzzer, LOW);
sensors.begin();
Serial.begin(9600);
Serial.println("=== Dispenser Air Otomatis ===");
}
int bacaJarak() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long dur = pulseIn(echoPin, HIGH, 30000);
if (dur == 0) return 999;
return dur * 0.034 / 2;
}
void beepBuzzer(int kali, int durasi) {
for (int i = 0; i < kali; i++) {
digitalWrite(buzzer, HIGH);
delay(durasi);
digitalWrite(buzzer, LOW);
delay(durasi);
}
}
void loop() {
thresholdJarak = map(analogRead(potPin), 0, 1023, 5, 20);
waterLevel = analogRead(waterSensor);
distance = bacaJarak();
sensors.requestTemperatures();
suhu = sensors.getTempCByIndex(0);
// Validasi sensor error
if (suhu == -127.0 || suhu == 85.0) {
Serial.println("❌ Sensor suhu error / tidak terbaca!");
suhu = 0; // anggap normal, lanjut
}
Serial.print("Jarak: "); Serial.print(distance);
Serial.print(" cm | Air: "); Serial.print(waterLevel);
Serial.print(" | Suhu: "); Serial.print(suhu, 1);
Serial.print(" C | Thr: "); Serial.println(thresholdJarak);
// Suhu terlalu panas
if (suhu > 45.0) {
digitalWrite(relay, LOW);
digitalWrite(led, LOW);
beepBuzzer(2, 300);
Serial.println("🌡 PERINGATAN: Air terlalu panas!");
delay(200);
return;
}
// Air habis
if (waterLevel < 300) {
digitalWrite(relay, LOW);
digitalWrite(led, LOW);
beepBuzzer(3, 200);
Serial.println("⚠ PERINGATAN: Air habis!");
}
// Normal
else {
digitalWrite(buzzer, LOW);
if (distance > 0 && distance < thresholdJarak) {
if (relayOnTime == 0) relayOnTime = millis();
if (millis() - relayOnTime < MAX_RELAY_ON) {
digitalWrite(relay, HIGH);
digitalWrite(led, HIGH);
Serial.println("✓ Air mengalir...");
} else {
digitalWrite(relay, LOW);
digitalWrite(led, LOW);
beepBuzzer(1, 100);
Serial.println("⏱ Batas waktu tercapai, angkat gelas.");
}
} else {
digitalWrite(relay, LOW);
digitalWrite(led, LOW);
relayOnTime = 0;
}
}
delay(200);
}