Translate

Membuat Alat Pengisian Air Otomatis (Pertamini) Berbasis Arduino

Membuat Alat Pengisian Air Otomatis (Pertamini) Berbasis Arduino


       Pada kesempatan kali ini saya akan mejelaskan mengenai bagaimana cara membuat sebuah alat yang dapat digunakan untuk mengisi air secara otomatis seperti pertamini, jadi sistem kerjanya yaitu user menekan keypad berapa ml yang dia butuhkan lalu tekan start untuk memulai pengisian air, alat ini juga dilengkapi sensor IR proximity sehingga jika belum ada gelas untuk menampung airnya maka ketika ditekan start airnya tidak akan mengalir. jadi yang dibutuhkan adalah adanya benda / gelas untuk menampung air dan tombol start ditekan. jika air sudah sesuai dengan yang diinginkan maka relay akan off kan solenoid agar air tidak mengalir. untuk lebih jelasnya berikut adalah skema dan kodingnya.



a. Skema Alat




b. Program Arduino IDE
     
#include <Wire.h>
#include <SPI.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>  //i2C LCD Library
LiquidCrystal_I2C lcd(0x3F, 16, 2); //library i2c lcd 16x2

int relay = 4;
int btstart = A1;
int btstartx;
int btstop = A2;
int btstopx;

int dataadc;

char customKey;
const byte ROWS = 4;
const byte COLS = 4;
long passwd = 0;
long isiku;
long beli;

char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {8,7,6,5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {12,11,10,9}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS); 

byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;

float calibrationFactor = 4.5;

volatile byte pulseCount;  

unsigned int frac;
float flowRate;
unsigned int flowMilliLitres;
int totalMilliLitres;

unsigned long oldTime;
long dataku = 0;

void setup() 
{
  
  pinMode(btstart, INPUT_PULLUP);
  pinMode(btstop, INPUT_PULLUP);
  
  pinMode(relay, OUTPUT);
  digitalWrite(relay, HIGH);
  
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;

  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  
  lcd.begin(); //set lcd i2c
  lcd.noCursor(); //biar gak ada cursor di lcd
  lcd.clear(); //clear lcd
  Serial.begin(9600);   // Initiate a serial communication

  lcd.setCursor(0,0); 
  lcd.print("SELAMAT DATANG");
  delay(3000);
  lcd.clear();
}

void loop() 
{
  
  int dataadc = analogRead(A0);
  
/*
  lcd.setCursor(0,0); 
  lcd.print("1.250mL");
  lcd.setCursor(8,0); 
  lcd.print("3.500mL");
  lcd.setCursor(0,1); 
  lcd.print("2.750mL");
  lcd.setCursor(8,1); 
  lcd.print("4.1000mL");
*/
 
  customKey = customKeypad.getKey();

  if(customKey >= '0' && customKey <= '9')
    {
     beli = beli * 10 + (customKey - '0');
    }
        
     lcd.setCursor(0,0);
     lcd.print("ISI BERAPA?");
     lcd.setCursor(0,1);
     lcd.print(beli);
     lcd.print("  ");
    
    if(customKey == '#'){
     delay(200);
     lcd.clear();
     beli = 0; 
    }
    
    if(customKey == 'A'){
     beli = 250;
    }

    if(customKey == 'B'){ 
     beli = 500;
    }
    
    if(customKey == 'C'){
     beli = 750;
    }  

    if(customKey == 'D'){     
     beli = 1000;
    } 
    
    btstartx = digitalRead(btstart);
    
    if((btstartx == 0)&&(dataadc < 700)){
     lcd.clear();
     delay(200);
     digitalWrite(relay, LOW); //buka 
     mulaiisi();
    }   
}

void mulaiisi(){

lcd.setCursor(0,0); 
lcd.print("Beli ");
lcd.print(beli);
lcd.print(" mL   ");

delay(100);
  
if((millis() - oldTime) > 1000)    // Only process counters once per second
  { 

    detachInterrupt(sensorInterrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    oldTime = millis();
    flowMilliLitres = (flowRate / 60) * 1000;
    totalMilliLitres += flowMilliLitres;
       
    frac = (flowRate - int(flowRate)) * 10;
     
    lcd.setCursor(0,1);
    lcd.print("Spd: ");             // Output separator
    lcd.print(flowMilliLitres);
    lcd.print(" mL/s   ");

    // Print the cumulative total of litres flowed since starting
    lcd.setCursor(0,2); 
    lcd.print("ISI: ");             // Output separator
    lcd.print(totalMilliLitres);
    lcd.print(" mL   "); 

    pulseCount = 0;
    
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);

  if(totalMilliLitres >= beli){
    lcd.clear();
    delay(1000);
    digitalWrite(relay, HIGH);
    lcd.setCursor(0,0); 
    lcd.print("SELESAI ");
    delay(3000);
    lcd.clear();
    return;
    }
  
  }

btstopx = digitalRead(btstop);
if(btstopx == 0){
    lcd.clear();
    delay(1000);
    digitalWrite(relay, HIGH);
    lcd.setCursor(0,0); 
    lcd.print("SELESAI ");
    delay(3000);
    lcd.clear();
    return;
}
    
mulaiisi(); 
}
  
void pulseCounter()
{
  pulseCount++;
}




c. Cara Penggunaan Alat

         Jadi alat ini yang pertama mengisi nilai kuantitas air yang diinginkan menggunakan keypad lalu tombol A untuk memilih 250 ml. tombol B untuk memilih 500 ml. C untuk memilih 750 ml dan tombol D untuk 1000 ml. jika ingin custom bisa menggunakan keypad pakai angka 0 sampai 9. jika ingin clear tekan # lalu jika ingin memulai pertamakali harus dekatkan gelas sampai sensor mendeteksi kemudian tekan tombol start untuk memulai pengisian, jika pengisian sudah sesuai takaran maka pengisian akan berhenti secara otomatis. 










1 comment:

  1. Bang, kegunaan variabel int dataku sama int isiku apa ya bang? Boleh gk kedua variabel itu didelete?

    ReplyDelete