Pada proyek kali ini saya akan mendemokan alat pengukur debit air menggunakan sensor aliran air/ Flow sensor tipe YF-s201, dengan komunikasi serial USB dan Bluetooth HC05, yang akan dikoneksikan dengan perangkat android.
Disini saya menggunakan port 3 sebagai default port yang terdeteksi oleh PC sebagai port serial arduino, dengan setting baut rate 9600 dan pengaturan no line ending.
Perangkat yang dibutuhkan, Arduino Uno, Sensor Shield, Flowsensor, Bluetooth HC-05, Laptop, Arduino IDE, dan Secangkir Kopi
Pada percobaan awal akan saya demokan bagimana arduino mengirimkan data pengukuran flow sensor melalui komunikasi USB serial ke PC yang akan ditampilkan melalui serial monitor arduino.
Tampilan data serial pengukuran aliran air pada serial monitor arduino, menggunakan serial USB
Tampilan data serial monitor
tampak disini bahwa serial mengirimkan data pembacaan sensor ke serial monitor. Oke, lanjut ke percobaan ke-2 dimana saya akan mengkomunikasikan bluetooh HC05 dg menggunakan port 4 sebagai standar komunikasi yang terdeteksi sebagai port serial HC05 dengan setting baut rate 38400 dan pilih Both NL dan CR.
Tampilan awal serial monitor menggunakan bluetooth HC-05 yang dihubungkan dengan bluetooth PC
Tampilan ketika perintah 'cek' dikirimkan melalui serial monitor
Tampilan ketika perintah 'reset' dikirimkan melalui serial monitor, saat perinta reset dikirimkan, arduino akan memulai perhitungan dari nol kembali
Hasil tampilan pada android
Sketch arduino HC-05 dan Flow Sensor
// Insialisasi perangkat Bluetooth
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(5, 6); // RX, TX
int Data; // the data received
// Inisialisai perangkat Flow Sensor
byte indikator = 13;
byte sensorInt = 0;
byte flowsensor = 2;
float konstanta = 4.5; //konstanta flow meter
volatile byte pulseCount;
float debit;
unsigned int flowmlt;
unsigned long totalmlt;
unsigned long oldTime;
float hargaAir;
float totalHarga;
void setup()
{
// Setup port serial USB
Serial.begin(9600);
// Setup port serial Bluetooth
Bluetooth.begin(38400);
// Cetak tampilan serial USB
Serial.println("-------------------------------------");
Serial.println("pilih menu :");
Serial.println("1. 'cek'");
Serial.println(" Tagihan penggunaan air");
Serial.println("2. 'reset'");
Serial.println(" Reset pengukuran air");
Serial.println("-------------------------------------");
// Cetak tampilan serial Bluetooth
Bluetooth.println("-------------------------------------");
Bluetooth.println("pilih menu :");
Bluetooth.println("1. 'cek'");
Bluetooth.println(" Tagihan penggunaan air");
Bluetooth.println("2. 'reset'");
Bluetooth.println(" Reset pengukuran air");
Bluetooth.println("-------------------------------------");
// Variable awal dan nilai awal Flow sensor
pinMode(indikator, OUTPUT);
digitalWrite(indikator, HIGH);
pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH);
pulseCount = 0;
debit = 0.0;
flowmlt = 0;
totalmlt = 0;
oldTime = 0;
////////////////
hargaAir = 1600;
totalHarga = 0;
attachInterrupt(sensorInt, pulseCounter, FALLING);
}
void loop()
{
boolean pOK = true;
String p = "";
while (Bluetooth.available() != 0)
{
p = p + char(Bluetooth.read());
delay(1000); // Tunda sebentar untuk menyiapkan pembacaan data berikutnya
}
//Serial.println("D");
recordSensing();
delay(100);
// Kalau tak ada data, tak perlu melanjutkan ke pemrosesan perintah berikutnya
if (p.length() == 0) return;
p.trim(); // Hilangkan tanda akhir baris
////////// kirim bluetooth //////////
////////// prosedur pengiriman serial ketika bluetooth melakukan cek
if (p == "cek")
{
Bluetooth.println("-------------TAGIHAN AIR-------------");
Bluetooth.print("Total Penggunaan Air : ");
Bluetooth.print(totalmlt/1000);
Bluetooth.println(" Liter");
Bluetooth.print("Harga Air/M3 : Rp. ");
Bluetooth.print(hargaAir);
Bluetooth.println(",-");
Bluetooth.print("Total Tagihan : Rp. ");
Bluetooth.print(totalHarga);
Bluetooth.println(",-");
Bluetooth.println("-------------TERIMAkASIH-------------");
}
////////// prosedur reset volume dan debit air
else if (p == "reset")
{
pulseCount = 0;
debit = 0.0;
flowmlt = 0;
totalmlt = 0;
oldTime = 0;
Bluetooth.println("|-----------------------------------|");
delay(500);
Bluetooth.println("|-------------RESETING--------------|");
delay(500);
Bluetooth.println("|----------BERHASIL RESET-----------|");
}
}
////////// membaca data sensor //////////
void recordSensing()
{
if((millis() - oldTime) > 1000)
{
detachInterrupt(sensorInt);
////////// menghitung debit air
debit = ((1000.0 / (millis() - oldTime)) * pulseCount) / konstanta;
////////// waktu berjalan
oldTime = millis();
////////// pengukuran volume air terpakai dalam mL
flowmlt = (debit / 60)*1000;
////////// total penggunaan air dalam mL
totalmlt += flowmlt;
////////// total harga air per m3 ( 1m3 = 1000000mL )
totalHarga = (totalmlt*hargaAir)/1000000;
unsigned int frac;
Serial.print("Debit air: ");
Serial.print(int(debit));
Serial.print("L/min");
Serial.println("\t");
Serial.print("Volume: ");
Serial.print(totalmlt);
Serial.println("mL");
Serial.print("Harga: ");
Serial.print("Rp. ");
Serial.println(totalHarga);
pulseCount = 0;
attachInterrupt(sensorInt, pulseCounter, FALLING);
}
}
void pulseCounter()
{
// Increment the pulse counter
pulseCount++;
}
video demo
#include <SoftwareSerial.h>
SoftwareSerial Bluetooth(5, 6); // RX, TX
int Data; // the data received
// Inisialisai perangkat Flow Sensor
byte indikator = 13;
byte sensorInt = 0;
byte flowsensor = 2;
float konstanta = 4.5; //konstanta flow meter
volatile byte pulseCount;
float debit;
unsigned int flowmlt;
unsigned long totalmlt;
unsigned long oldTime;
float hargaAir;
float totalHarga;
void setup()
{
// Setup port serial USB
Serial.begin(9600);
// Setup port serial Bluetooth
Bluetooth.begin(38400);
// Cetak tampilan serial USB
Serial.println("-------------------------------------");
Serial.println("pilih menu :");
Serial.println("1. 'cek'");
Serial.println(" Tagihan penggunaan air");
Serial.println("2. 'reset'");
Serial.println(" Reset pengukuran air");
Serial.println("-------------------------------------");
// Cetak tampilan serial Bluetooth
Bluetooth.println("-------------------------------------");
Bluetooth.println("pilih menu :");
Bluetooth.println("1. 'cek'");
Bluetooth.println(" Tagihan penggunaan air");
Bluetooth.println("2. 'reset'");
Bluetooth.println(" Reset pengukuran air");
Bluetooth.println("-------------------------------------");
// Variable awal dan nilai awal Flow sensor
pinMode(indikator, OUTPUT);
digitalWrite(indikator, HIGH);
pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH);
pulseCount = 0;
debit = 0.0;
flowmlt = 0;
totalmlt = 0;
oldTime = 0;
////////////////
hargaAir = 1600;
totalHarga = 0;
attachInterrupt(sensorInt, pulseCounter, FALLING);
}
void loop()
{
boolean pOK = true;
String p = "";
while (Bluetooth.available() != 0)
{
p = p + char(Bluetooth.read());
delay(1000); // Tunda sebentar untuk menyiapkan pembacaan data berikutnya
}
//Serial.println("D");
recordSensing();
delay(100);
// Kalau tak ada data, tak perlu melanjutkan ke pemrosesan perintah berikutnya
if (p.length() == 0) return;
p.trim(); // Hilangkan tanda akhir baris
////////// kirim bluetooth //////////
////////// prosedur pengiriman serial ketika bluetooth melakukan cek
if (p == "cek")
{
Bluetooth.println("-------------TAGIHAN AIR-------------");
Bluetooth.print("Total Penggunaan Air : ");
Bluetooth.print(totalmlt/1000);
Bluetooth.println(" Liter");
Bluetooth.print("Harga Air/M3 : Rp. ");
Bluetooth.print(hargaAir);
Bluetooth.println(",-");
Bluetooth.print("Total Tagihan : Rp. ");
Bluetooth.print(totalHarga);
Bluetooth.println(",-");
Bluetooth.println("-------------TERIMAkASIH-------------");
}
////////// prosedur reset volume dan debit air
else if (p == "reset")
{
pulseCount = 0;
debit = 0.0;
flowmlt = 0;
totalmlt = 0;
oldTime = 0;
Bluetooth.println("|-----------------------------------|");
delay(500);
Bluetooth.println("|-------------RESETING--------------|");
delay(500);
Bluetooth.println("|----------BERHASIL RESET-----------|");
}
}
////////// membaca data sensor //////////
void recordSensing()
{
if((millis() - oldTime) > 1000)
{
detachInterrupt(sensorInt);
////////// menghitung debit air
debit = ((1000.0 / (millis() - oldTime)) * pulseCount) / konstanta;
////////// waktu berjalan
oldTime = millis();
////////// pengukuran volume air terpakai dalam mL
flowmlt = (debit / 60)*1000;
////////// total penggunaan air dalam mL
totalmlt += flowmlt;
////////// total harga air per m3 ( 1m3 = 1000000mL )
totalHarga = (totalmlt*hargaAir)/1000000;
unsigned int frac;
Serial.print("Debit air: ");
Serial.print(int(debit));
Serial.print("L/min");
Serial.println("\t");
Serial.print("Volume: ");
Serial.print(totalmlt);
Serial.println("mL");
Serial.print("Harga: ");
Serial.print("Rp. ");
Serial.println(totalHarga);
pulseCount = 0;
attachInterrupt(sensorInt, pulseCounter, FALLING);
}
}
void pulseCounter()
{
// Increment the pulse counter
pulseCount++;
}
video demo