Deskripsi Singkat:
Proyek ini menggunakan Arduino Uno untuk mengukur
volume air di tandon atau tangki dengan sensor ultrasonik. Informasi tentang
volume air ditampilkan di layar LCD 20x4. Proyek ini juga
mengotomatiskan kendali pompa air menggunakan servo motor, yang aktif
atau mati berdasarkan tingkat ketinggian air yang terdeteksi.
Tujuan:
- Mengukur
ketinggian air di tandon/tangki menggunakan sensor ultrasonik.
- Menampilkan
volume air di LCD dalam bentuk angka dan grafik bar.
- Mengontrol
pompa air secara otomatis menggunakan servo motor berdasarkan ketinggian
air di tandon.
Komponen yang Digunakan:
- Arduino
Uno - Sebagai pusat pemrosesan data.
- Sensor
Ultrasonik HC-SR04 - Mengukur ketinggian air dengan menghitung waktu
pantulan gelombang suara.
- Pin
Echo: Digunakan untuk menerima pantulan.
- Pin
Trig: Digunakan untuk mengirim sinyal ultrasonik.
- LCD
20x4 dengan I2C Module - Menampilkan informasi volume air dan status
pompa.
- I2C_ADDR:
Alamat I2C dari LCD (0x27).
- Servo
Motor - Mengontrol katup pompa air secara otomatis.
- Pompa
Air - Diatur oleh servo motor untuk mengisi atau menghentikan aliran
air berdasarkan ketinggian air yang terukur.
Penjelasan Program:
- Library
yang Digunakan:
- LiquidCrystal_I2C:
Untuk mengontrol LCD melalui protokol I2C.
- Servo:
Untuk mengontrol pergerakan servo motor.
- Inisialisasi
Pin dan Variabel:
- I2C_ADDR:
Alamat komunikasi I2C untuk LCD adalah 0x27.
- TRIG_PIN
dan ECHO_PIN: Pin untuk mengirim dan menerima sinyal ultrasonik.
- pinser:
Pin 9 untuk mengontrol servo motor.
- rotasi:
Variabel untuk menyimpan posisi servo motor.
- Karakter
Custom: Karakter custom digunakan untuk membuat bar volume di LCD.
Karakter ini terdiri dari 5x8 pixel yang ditampilkan sebagai indikator
tingkat volume air (bar penuh dan kosong).
- Fungsi
setup():
- Inisialisasi
LCD dan sensor: Mengaktifkan LCD dan menampilkan data ke layar.
- Servo
Motor: Dikalibrasi pada posisi 0 derajat untuk memulai dalam keadaan
mati.
- Pembuatan
karakter custom: Karakter khusus untuk grafik bar ditampilkan di LCD.
- Fungsi
bacasensor(): Fungsi ini bertugas membaca data dari sensor ultrasonik,
menghitung waktu pantulan, dan mengonversinya ke jarak dalam cm. Jarak ini
digunakan untuk menghitung volume air.
- Fungsi
loop():
- Baca
Sensor dan Hitung Volume Air: Jarak yang terbaca dari sensor
ultrasonik diubah menjadi volume air dengan menggunakan fungsi map().
- Tampilkan
Volume di LCD: Volume air ditampilkan di LCD dalam liter dan juga
dalam bentuk bar.
- Mengontrol
Servo Motor:
- Jika
volume air kurang dari 10% (volume ≤ 10), servo bergerak ke posisi 180
derajat, yang menunjukkan bahwa pompa air menyala.
- Jika
volume air lebih dari 10%, pompa tetap hidup.
- Jika
volume air mencapai 100%, pompa mati, dan servo kembali ke posisi 0
derajat.
- Logika
Pengendalian Pompa:
- Ketika
air di bawah level 10%, pompa air menyala dan mulai mengisi air (servo
bergerak ke 180°).
- Ketika
air mencapai 100%, pompa air mati (servo kembali ke 0°).
- Sistem
ini membantu mengotomatisasi proses pengisian air, sehingga air tidak
meluap atau habis.
Kesimpulan:
Proyek ini memanfaatkan sensor ultrasonik untuk mengukur
ketinggian air di tandon dan mengontrol pompa air secara otomatis. Dengan
menggunakan servo motor untuk mengatur pompa dan menampilkan volume air di LCD,
sistem ini dapat menjaga tandon tetap penuh secara efisien dan menghemat energi
dengan mematikan pompa secara otomatis saat tandon penuh.
Keunggulan Proyek:
- Pengukuran
Otomatis: Tidak perlu pengukuran manual karena sensor ultrasonik akan
memantau ketinggian air secara otomatis.
- Kontrol
Otomatis Pompa: Pompa dikontrol secara otomatis oleh Arduino
berdasarkan tingkat ketinggian air.
- Tampilan
Informasi: Informasi volume air ditampilkan secara real-time di layar
LCD, sehingga mudah untuk dipantau.
Hasil Rakit alat dan program :
1. Air Tandon penuh
2. Air tandon kurang dari 10
3. Pompa menyala otomatis
Program :
#include <LiquidCrystal_I2C.h> //library LCD #define I2C_ADDR 0x27 // untuk alamat I2C #define LCD_COLUMNS 20 // untuk jumlah kolom #define LCD_LINES 4 // untuk jumblah baris // Inisialisasi LCD dengan alamat I2C 0x27, ukuran 20x4 LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES); #define ECHO_PIN 2 // definisi pin echo sensor ultrasonic #define TRIG_PIN 3 //definisi pin triger sensor ultrasonic #define pinser 9 //pin servo #include <Servo.h> // Menambahkan library Servo Servo myservo; // Membuat objek Servo int rotasi=0; //membuat nilai rotasi // Definisikan karakter custom (8x5 pixel grid) byte habis1[8] = { B11111, B10000, B10000, B10000, B10000, B10000, B10000, B11111 }; byte habis2[8] = { B11111, B00000, B00000, B00000, B00000, B00000, B00000, B11111 }; byte habis3[8] = { B11111, B00001, B00001, B00001, B00001, B00001, B00001, B11111 }; byte penuh1[8] = { B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111, }; void setup() { Serial.begin(9600); // Init lcd.init(); // untuk inisiasi LCD (menyalakan) lcd.backlight(); // untuk menyalakan lampu backlight LCD lcd.clear(); // untuk clear LCD jika ada karakter // Membuat custom karakter di lokasi memori LCD (0-7) lcd.createChar(0, habis1); // Menyimpan habis1 di lokasi memori 0 lcd.createChar(1, habis2); // Menyimpan habis2 di lokasi memori 1 lcd.createChar(2, habis3); // Menyimpan habis3 di lokasi memori 2 lcd.createChar(3, penuh1); // Menyimpan penuh1 di lokasi memori 3 pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); myservo.attach(pinser); // Menghubungkan servo ke pin digital 9 Arduino myservo.write(0); // agar servo ke 0 derajat (kalibrasi) } // untuk membaca sensor ultrasonik float bacasensor() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); unsigned int duration = pulseIn(ECHO_PIN, HIGH); return duration * 0.034 / 2; } void loop() { float hasil = bacasensor(); if (hasil>=110) {hasil=110;} //agar hasil tidak lebih dari 110 yg bisa menyebabkan - pada volume float volume = map(hasil,110,0,0,110); // merubah nilai 0 menjadi 100 dan sebaliknya menggunakan maping Serial.print("volume Air: "); Serial.println(volume); //menampilkan tulisan volume air dan L lcd.setCursor(0, 0); lcd.print("Volume Air :"); lcd.setCursor(19, 0); lcd.print("L"); lcd.setCursor(14, 3); lcd.print("%"); // membuat bar volume air dengan costume karakter int maxbar = map(volume,0,100,0,10); // merubah nilai volume ke maxbar menggunakan maping if (maxbar >= 10){maxbar=10;} for (int i = 0; i < maxbar; i++){ lcd.setCursor(i, 3); lcd.write(byte(3)); //bar penuh } for (int j = 9; j >= maxbar; j--){ lcd.setCursor(j, 3); if (j==0){lcd.write(byte(0)); } if (j==9){lcd.write(byte(2)); } else {lcd.write(byte(1));} // bar kosong } // membuat persentase bar tampil di lcd int perbar = volume; if (perbar >=100){perbar=100;} if (perbar < 10){ lcd.setCursor(11, 3); lcd.print(" "); lcd.setCursor(13, 3); lcd.print(perbar); lcd.setCursor(16, 3); lcd.print(" "); } if (volume >= 10 && volume <100){ lcd.setCursor(11, 3); lcd.print(" "); lcd.setCursor(12, 3); lcd.print(perbar); lcd.setCursor(16, 3); lcd.print(" "); } if (volume >= 100){ lcd.setCursor(11, 3); lcd.print(perbar); lcd.setCursor(16, 3); lcd.print("FULL"); } // membuat volume tampil di lcd if (volume < 10){ lcd.setCursor(12, 0); lcd.print(" "); lcd.setCursor(14, 0); lcd.print(volume); } if (volume >= 10 && volume <100){ lcd.setCursor(12, 0); lcd.print(" "); lcd.setCursor(13, 0); lcd.print(volume); } if (volume >= 100){ lcd.setCursor(12, 0); lcd.print(volume); } //menggerakkan motor servo if (volume <= 10.00 && rotasi == 0){ myservo.write(180); //servo bergerak ke 180 lcd.setCursor(0, 1); lcd.print("Pompa Air Hidup"); delay(50); } if (volume > 10.00 && rotasi == 180){ myservo.write(180); //servo bergerak ke 180 lcd.setCursor(0, 1); lcd.print("Pompa Air Hidup"); delay(50); } // jika volume kurang dari, maka servo nyala if (volume >= 100){ myservo.write(0); //servo bergerak ke 0 lcd.setCursor(0, 1); lcd.print("Pompa Air Mati "); delay(50); } }




