Cara Memprogram Sensor Waterflow Pada ESP32

Cara Memprogram Sensor Waterflow Pada ESP32

Sensor Waterflow atau Sensor Aliran Air adalah perangkat yang dirancang khusus untuk mengukur laju aliran cairan (umumnya air) yang melewati suatu pipa atau saluran.Berikut ini adalah code untuk memprogramnya :

#include <Arduino.h>


const int port_waterflow = 2;
volatile int pulse_waterflow = 0;
unsigned long oldTime_waterflow = 0;


void pulse_waterflower() {
pulse_waterflow++;
}
 
float baca_waterflow() {
unsigned long currentTime = millis();
if (currentTime - oldTime_waterflow > 1000) {
float flowRate = ((1000.0 / (currentTime - oldTime_waterflow)) * pulse_waterflow) / 5.5; // 5.5 is the number of pulses per liter
oldTime_waterflow = currentTime;
float waterflow = flowRate / 60.0;
pulse_waterflow = 0;
return waterflow;
}
return 0.0;
}


void setup()
{
Serial.begin(9600);
pinMode(port_waterflow, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(port_waterflow), pulse_waterflower, FALLING);

}
void loop(){
float waterflow = baca_waterflow();
Serial.println("Flow : " + (String)waterflow + " L/min"); 


}

Berikut ini adalah penjelasan dari kode di atas :

1. Inklusi Library dan Deklarasi Variabel Global

C++

#<strong>include</strong> <Arduino.h>

const int port_waterflow = 2;       // Pin digital tempat output sinyal sensor waterflow terhubung
volatile int pulse_waterflow = 0;   // Variabel untuk menghitung pulsa, 'volatile' karena diubah oleh ISR
unsigned long oldTime_waterflow = 0; // Variabel untuk menyimpan waktu terakhir perhitungan
  • #include <Arduino.h>: Ini adalah library standar yang penting untuk semua program Arduino, menyediakan fungsi-fungsi dasar yang akan kita gunakan.
  • const int port_waterflow = 2;: Mendeklarasikan sebuah konstanta integer bernama port_waterflow dan menetapkannya ke pin digital 2. Pin ini adalah pin interupsi eksternal pada banyak papan Arduino (seperti Arduino Uno), yang sangat ideal untuk membaca pulsa berkecepatan tinggi dari sensor seperti sensor waterflow.
  • volatile int pulse_waterflow = 0;: Mendeklarasikan variabel integer pulse_waterflow dan menginisialisasikannya dengan 0. Variabel ini akan digunakan untuk menghitung jumlah pulsa yang dihasilkan oleh sensor waterflow. Kata kunci volatile sangat penting di sini. Ini memberi tahu kompiler bahwa nilai variabel ini dapat berubah kapan saja oleh sesuatu di luar aliran program utama (dalam hal ini, oleh fungsi interupsi), sehingga kompiler tidak akan melakukan optimasi yang salah pada variabel ini.
  • unsigned long oldTime_waterflow = 0;: Mendeklarasikan variabel unsigned long untuk menyimpan timestamp dari waktu terakhir perhitungan laju aliran. Tipe unsigned long digunakan karena fungsi millis() mengembalikan nilai ini, yang dapat bertambah hingga waktu yang lama.

2. Fungsi pulse_waterflower() (Interrupt Service Routine – ISR)

C++

void pulse_waterflower() {
  pulse_waterflow++; // Setiap kali fungsi ini dipanggil, tambahkan 1 ke jumlah pulsa
}
  • Ini adalah fungsi Interrupt Service Routine (ISR). Ini berarti fungsi ini akan dieksekusi secara otomatis dan segera setiap kali ada perubahan spesifik pada pin port_waterflow yang telah kita tentukan (dalam hal ini, transisi dari HIGH ke LOW atau falling edge).
  • Ketika sensor waterflow menghasilkan pulsa, pin yang terhubung akan berubah status, memicu fungsi ini. Di dalam fungsi ini, kita hanya menaikkan (increment) variabel pulse_waterflow sebanyak 1.

3. Fungsi baca_waterflow()

C++

float baca_waterflow() {
  unsigned long currentTime = millis(); // Ambil waktu saat ini
  if (currentTime - oldTime_waterflow > 1000) { // Cek apakah sudah lewat 1 detik (1000 ms)
    // Hitung laju aliran
    // (1000.0 / (currentTime - oldTime_waterflow)) : Menormalisasi pulsa per detik
    // * pulse_waterflow : Jumlah pulsa yang terkumpul dalam interval waktu
    // / 5.5 : Faktor kalibrasi (5.5 pulsa per liter)
    float flowRate = ((1000.0 / (currentTime - oldTime_waterflow)) * pulse_waterflow) / 5.5;

    oldTime_waterflow = currentTime; // Perbarui waktu terakhir perhitungan
    float waterflow = flowRate / 60.0; // Konversi dari L/detik menjadi L/menit
    pulse_waterflow = 0; // Reset hitungan pulsa untuk interval berikutnya
    return waterflow;    // Kembalikan laju aliran dalam L/menit
  }
  return 0.0; // Jika belum 1 detik, kembalikan 0.0
}
  • Fungsi ini bertanggung jawab untuk menghitung laju aliran air berdasarkan pulsa yang telah dihitung oleh ISR.
  • unsigned long currentTime = millis();: Mengambil nilai waktu saat ini dalam milidetik sejak Arduino mulai berjalan.
  • if (currentTime - oldTime_waterflow > 1000): Ini adalah kondisi untuk memastikan perhitungan dilakukan setiap minimal 1 detik. Ini membantu mendapatkan pembacaan yang stabil dan relevan.
  • float flowRate = ((1000.0 / (currentTime - oldTime_waterflow)) * pulse_waterflow) / 5.5;: Ini adalah rumus perhitungan laju aliran.
    • (1000.0 / (currentTime - oldTime_waterflow)): Bagian ini menghitung faktor untuk menormalisasi jumlah pulsa menjadi pulsa per detik. Jika interval tepat 1000 ms, nilainya 1. Jika lebih pendek/panjang sedikit, ini akan mengkompensasi.
    • * pulse_waterflow: Mengalikan faktor normalisasi dengan total pulsa yang terdeteksi dalam interval waktu tersebut. Hasilnya adalah pulsa per detik.
    • / 5.5: Ini adalah faktor kalibrasi (K-factor) untuk sensor waterflow spesifik Anda. Artinya, sensor ini menghasilkan 5.5 pulsa untuk setiap liter air yang mengalir. Nilai ini harus didapatkan dari datasheet sensor Anda atau melalui kalibrasi manual. Jika K-factor Anda berbeda, Anda harus mengubah angka ini. Hasilnya adalah laju aliran dalam liter per detik (L/s).
  • oldTime_waterflow = currentTime;: Setelah perhitungan, oldTime_waterflow diperbarui ke currentTime untuk menandai awal interval perhitungan berikutnya.
  • float waterflow = flowRate / 60.0;: Mengkonversi laju aliran dari Liter per detik (L/s) menjadi Liter per menit (L/min) dengan membaginya dengan 60.
  • pulse_waterflow = 0;: Meriset jumlah pulsa menjadi nol. Ini penting agar pulsa hanya dihitung untuk interval 1 detik berikutnya.
  • return waterflow;: Fungsi mengembalikan nilai laju aliran dalam L/min.
  • return 0.0;: Jika kondisi if (sudah lewat 1 detik) belum terpenuhi, fungsi akan mengembalikan 0.0, artinya belum ada pembaruan laju aliran yang siap.

4. Fungsi setup()

C++

void setup()
{
  Serial.begin(9600);                      // Menginisialisasi komunikasi serial
  pinMode(port_waterflow, INPUT_PULLUP); // Mengatur pin sebagai input dengan pull-up internal
  // Menghubungkan ISR (pulse_waterflower) ke pin interupsi eksternal
  attachInterrupt(digitalPinToInterrupt(port_waterflow), pulse_waterflower, FALLING);
}
  • Serial.begin(9600);: Menginisialisasi komunikasi serial untuk debugging pada baud rate 9600.
  • pinMode(port_waterflow, INPUT_PULLUP);: Mengatur pin port_waterflow (pin 2) sebagai INPUT_PULLUP.
    • INPUT: Berarti Arduino akan membaca sinyal dari pin ini.
    • PULLUP: Mengaktifkan resistor pull-up internal di dalam mikrokontroler. Ini memastikan bahwa pin selalu berada pada kondisi HIGH ketika tidak ada pulsa dari sensor. Ketika sensor menghasilkan pulsa (biasanya menarik pin ke LOW), ini akan menciptakan falling edge. Ini adalah konfigurasi yang umum untuk sensor Hall Effect.
  • attachInterrupt(digitalPinToInterrupt(port_waterflow), pulse_waterflower, FALLING);: Ini adalah baris kunci untuk menggunakan interupsi.
    • digitalPinToInterrupt(port_waterflow): Mengkonversi nomor pin digital (port_waterflow yaitu 2) ke nomor interupsi yang sesuai pada mikrokontroler.
    • pulse_waterflower: Ini adalah nama fungsi ISR yang akan dipanggil ketika interupsi terpicu.
    • FALLING: Ini adalah mode interupsi. Artinya, ISR (pulse_waterflower) akan dipanggil setiap kali sinyal pada pin port_waterflow berubah dari HIGH ke LOW (falling edge). Sensor waterflow berbasis Hall Effect umumnya menghasilkan pulsa LOW ketika magnet lewat.

5. Fungsi loop()

C++

void loop(){
  float waterflow = baca_waterflow(); // Panggil fungsi untuk membaca laju aliran
  // Hanya cetak jika nilai aliran bukan nol (berarti ada update baru)
  if (waterflow != 0.0) {
    Serial.println("Flow : " + (String)waterflow + " L/min");
  }
}
  • float waterflow = baca_waterflow();: Memanggil fungsi baca_waterflow() untuk mendapatkan nilai laju aliran air yang dihitung.
  • if (waterflow != 0.0): Baris ini berfungsi agar pesan ke Serial Monitor hanya dicetak ketika baca_waterflow() benar-benar mengembalikan nilai laju aliran yang baru (setelah interval 1 detik), bukan setiap loop jika tidak ada pembaruan.
  • Serial.println("Flow : " + (String)waterflow + " L/min");: Mencetak laju aliran air yang didapat ke Serial Monitor, dilengkapi dengan teks “Flow : ” dan satuan ” L/min”.

Cara Kerja Keseluruhan

Secara keseluruhan, kode ini akan melakukan hal berikut:

  1. Inisialisasi (setup): Mengatur komunikasi serial, mengkonfigurasi pin 2 sebagai input dengan pull-up, dan menyiapkan interupsi eksternal pada pin 2. Setiap kali sensor waterflow menghasilkan falling edge (air mengalir dan magnet melewati sensor), fungsi pulse_waterflower() akan dipanggil secara otomatis dan cepat, meningkatkan hitungan pulse_waterflow.
  2. Pengulangan (loop): Secara terus-menerus memanggil fungsi baca_waterflow().
    • Setiap 1 detik, baca_waterflow() akan mengambil jumlah pulsa yang terkumpul, menghitung laju aliran dalam L/min menggunakan K-factor 5.5, mereset jumlah pulsa, dan mengembalikan nilai laju aliran tersebut.
    • Nilai laju aliran ini kemudian dicetak ke Serial Monitor.

Penting:

  • K-Factor: Pastikan nilai 5.5 dalam rumus perhitungan flowRate (/ 5.5) sesuai dengan K-factor sebenarnya dari sensor waterflow yang Anda gunakan. K-factor yang salah akan menghasilkan pembacaan laju aliran yang tidak akurat. Anda mungkin perlu mengkalibrasi sendiri.
  • Pin Interupsi: Untuk Arduino Uno/Nano, pin interupsi adalah pin digital 2 dan 3. Pastikan Anda menghubungkan pin output sensor waterflow ke salah satu pin ini.
  • Koneksi Sensor: Sensor waterflow biasanya memiliki 3 kabel: VCC (merah), GND (hitam), dan Output (kuning). Hubungkan VCC ke 5V, GND ke GND, dan Output (kuning) ke pin 2 Arduino.

untuk diskusi bisa kontak dibawah ini :

Sosial media :

Apa itu ESP32?