Depot pengisian air minum menggunakan galon sebagai tempat air. Tahap-tahap pengisian yang lazim di lakukan adalah: pembersihan, pengisian, pemasangan tutup dan perbersihan.
Dalam artikel ini hanya melakukan otomatisasi pada tahap pengisian, cara kerjanya sebagai berikut :
- Saat mulai, sensor ir/obstacle mendeteksi keberadaan galon diatas tempat pengisian galon. Jika ada galon maka sistem menginformasikan agar galon diambil terlebih dahulu.
- Sistem menunggu hingga galon kosong ditempatkan pada posisi pengisian galon.
- Sistem akan menghidupkan pompa air, kemudian menghidupkan solenoid.
- Sensor flow meter akan menghitung volume ait yang dialirkan kedalam galon.
- Jika volume telah mencukupi maka solenoid dan pompa dimatikan.
- Jika selama pengisian galon, posisi galon bergeser atau diambil, maka solenoid dan pompa akan dimatikan.
- Sistem akan menunggu galon diambil.
- Selesai.
Skema pengisian galon otomatis berbasis arduino:

Komponen yang digunakan dalam perancangan sistem pengisian galon arduino:
- Arduino uno
- LCD 16×2 lcd backpack
- sensor obstacle
- flow sensor
- solenoid
- pompa air
- relay 2 channel
Program pengisi galon menggunakan arduino:
#define kapasitasGalon 19//liter
#define pulsaPerLiter 450//sesuai spesifikasi sensor water flow
#define pinWaterFlow 2
#define pinSensorIR A0
#define pinPompa 7
#define pinSelenoid 6
#define IRAktif LOW
#define relayAktif LOW
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <util/atomic.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);
volatile uint16_t pulseCount;
void setup() {
digitalWrite(pinPompa, !relayAktif);
digitalWrite(pinSelenoid, !relayAktif);
pinMode(pinWaterFlow, INPUT);
pinMode(pinSensorIR, INPUT);
pinMode(pinPompa, OUTPUT);
pinMode(pinSelenoid, OUTPUT);
Serial.begin(9600);
Serial.println(F("Pengisi galon otomatis"));
Serial.println(F("https://www.project.semesin.com"));
Wire.begin();
Wire.beginTransmission(0x3F);
if (Wire.endTransmission())
{
lcd = LiquidCrystal_I2C(0x27, 16, 2);
}
lcd.begin();
lcd.backlight();
lcd.print("Pengisi galon");
lcd.setCursor(0, 1);
lcd.print("Semesin.com");
delay(3000);
lcd.setCursor(0, 0);
lcd.print("ambil Galon ");
while (digitalRead(pinSensorIR) == IRAktif); //deteksi awal : jika ada galon kosongkan dahulu
attachInterrupt(digitalPinToInterrupt(pinWaterFlow), pulseCounter, FALLING);
}
void loop() {
lcd.setCursor(0, 0);
lcd.print("Letakkan Galon ");
while (digitalRead(pinSensorIR) == !IRAktif);
delay(1000);//memastikan galon diletakkan
if (digitalRead(pinSensorIR) == IRAktif)
{
lcd.setCursor(0, 0);
lcd.print("Mengisi Galon...");
pulseCount = 0;
digitalWrite(pinPompa, relayAktif);
delay(1000);
digitalWrite(pinSelenoid, relayAktif);
lcd.setCursor(0, 1);
lcd.print(" ");
uint16_t jumlahPulsa;
while ((jumlahPulsa < kapasitasGalon * pulsaPerLiter) && (digitalRead(pinSensorIR) == IRAktif))
{
ATOMIC_BLOCK(ATOMIC_FORCEON)
{
jumlahPulsa = pulseCount;
}
lcd.setCursor(0, 1);
lcd.print((1.0 * jumlahPulsa / pulsaPerLiter));
lcd.print(" liter");
}
digitalWrite(pinSelenoid, !relayAktif);
delay(100);
digitalWrite(pinPompa, !relayAktif);
lcd.setCursor(0, 0);
if (jumlahPulsa >= kapasitasGalon * pulsaPerLiter)
{
lcd.print("Galon penuh ");
}
else if (digitalRead(pinSensorIR) != IRAktif)
{
lcd.print("Galon tidak ada ");
}
delay(1000);
lcd.setCursor(0, 0);
lcd.print("silahkan ambil ");
while (digitalRead(pinSensorIR) == IRAktif);
delay(1000);//memastikan galon sudah diambil
while (digitalRead(pinSensorIR) == IRAktif);
}
}
void pulseCounter()
{
pulseCount++;
}
Library: