Cara Memprogram Sensor Curah Hujan Pada ESP32

Cara Memprogram Sensor Curah Hujan Pada ESP32

Sensor curah hujan adalah alat yang digunakan untuk mengukur jumlah presipitasi (curah hujan) yang terjadi dalam suatu periode waktu tertentu.Berikut ini adalah programnya :

#include <Arduino.h>


const int pin_curah_hujan = 4; 
long int jumlah_tip_curah_hujan = 0;
long int temp_jumlah_tip_curah_hujan = 0;
float s_curah_hujan = 0.00;
float milimeter_per_tip_curah_hujan = 0.47;
volatile boolean flag_curah_hujan = false;
void ICACHE_RAM_ATTR hitung_curah_hujan()
{
  flag_curah_hujan = true;
}


float baca_curah_hujan()
{
 if (flag_curah_hujan == true) 
  {
    s_curah_hujan += milimeter_per_tip_curah_hujan;
    jumlah_tip_curah_hujan++;
    delay(500);
    flag_curah_hujan = false; 
  }
  s_curah_hujan = jumlah_tip_curah_hujan * milimeter_per_tip_curah_hujan;
  if ((jumlah_tip_curah_hujan != temp_jumlah_tip_curah_hujan)) 
  {
  }
  temp_jumlah_tip_curah_hujan = jumlah_tip_curah_hujan;
  return s_curah_hujan;
}


void setup()
{
Serial.begin(9600);
 pinMode(pin_curah_hujan, INPUT);
attachInterrupt(digitalPinToInterrupt(pin_curah_hujan), hitung_curah_hujan, FALLING); 

}
void loop(){
float sensor_curah_hujan = baca_curah_hujan();
Serial.println("Curah Hujan : " + (String)sensor_curah_hujan);


}

Berikut ini adalah penjelasan dari kode di atas :

1. Deklarasi dan Inisialisasi Variabel

const int pin_curah_hujan = 4; 
long int jumlah_tip_curah_hujan = 0;
long int temp_jumlah_tip_curah_hujan = 0;
float s_curah_hujan = 0.00;
float milimeter_per_tip_curah_hujan = 0.47;
volatile boolean flag_curah_hujan = false;
  • pin_curah_hujan: Mendefinisikan pin input yang digunakan untuk menerima pulsa dari sensor curah hujan (di sini menggunakan pin 4).
  • jumlah_tip_curah_hujan: Variabel untuk menyimpan jumlah pulsa (tip) yang diterima dari sensor.
  • temp_jumlah_tip_curah_hujan: Variabel sementara untuk menyimpan jumlah pulsa yang diterima pada loop sebelumnya (untuk membandingkan perubahan data).
  • s_curah_hujan: Variabel untuk menyimpan total curah hujan dalam milimeter.
  • milimeter_per_tip_curah_hujan: Nilai konversi dari setiap pulsa (tip) ke dalam satuan milimeter curah hujan, di sini 0.47 mm per tip.
  • flag_curah_hujan: Variabel boolean yang digunakan untuk menandakan bahwa sensor telah mendeteksi hujan (akan digunakan dalam interrupt).

2. Interrupt Service Routine (ISR)

void ICACHE_RAM_ATTR hitung_curah_hujan()
{
  flag_curah_hujan = true;
}
  • ICACHE_RAM_ATTR: Menandakan bahwa fungsi hitung_curah_hujan() adalah fungsi interrupt yang dijalankan saat terjadi perubahan status pada pin pin_curah_hujan.
  • hitung_curah_hujan(): Fungsi ini akan dipanggil setiap kali terjadi falling edge (perubahan status dari HIGH ke LOW) pada pin pin_curah_hujan. Ini menandakan bahwa satu pulsa atau satu tip dari sensor curah hujan telah diterima.
    • Saat fungsi ini dipanggil, variabel flag_curah_hujan di-set menjadi true untuk menandakan bahwa sensor telah mendeteksi hujan.

3. Fungsi untuk Membaca Curah Hujan

float baca_curah_hujan()
{
 if (flag_curah_hujan == true) 
  {
    s_curah_hujan += milimeter_per_tip_curah_hujan;
    jumlah_tip_curah_hujan++;
    delay(500);
    flag_curah_hujan = false; 
  }
  s_curah_hujan = jumlah_tip_curah_hujan * milimeter_per_tip_curah_hujan;
  if ((jumlah_tip_curah_hujan != temp_jumlah_tip_curah_hujan)) 
  {
  }
  temp_jumlah_tip_curah_hujan = jumlah_tip_curah_hujan;
  return s_curah_hujan;
}
  • baca_curah_hujan(): Fungsi ini digunakan untuk menghitung total curah hujan berdasarkan jumlah pulsa yang diterima.
    • if (flag_curah_hujan == true): Jika sensor telah mendeteksi pulsa (hujan) dan flag_curah_hujan bernilai true, maka:
      • s_curah_hujan += milimeter_per_tip_curah_hujan;: Menambahkan nilai curah hujan berdasarkan konversi 1 tip = 0.47 mm ke total curah hujan.
      • jumlah_tip_curah_hujan++;: Menambah jumlah total pulsa yang diterima.
      • delay(500);: Memberikan waktu delay (500 ms) untuk memastikan pembacaan tidak terlalu cepat.
      • flag_curah_hujan = false;: Mengatur kembali flag_curah_hujan ke false agar fungsi interrupt tidak terus-menerus dijalankan.
    • s_curah_hujan = jumlah_tip_curah_hujan * milimeter_per_tip_curah_hujan;: Menghitung kembali total curah hujan berdasarkan jumlah tip yang diterima.
    • if ((jumlah_tip_curah_hujan != temp_jumlah_tip_curah_hujan)): Cek apakah ada perubahan dalam jumlah pulsa yang diterima. Biasanya untuk menangani pembaruan atau perubahan dalam jumlah tip.
    • temp_jumlah_tip_curah_hujan = jumlah_tip_curah_hujan;: Menyimpan jumlah tip saat ini ke variabel sementara untuk perbandingan berikutnya.

4. Setup Function

void setup()
{
Serial.begin(9600);
 pinMode(pin_curah_hujan, INPUT);
attachInterrupt(digitalPinToInterrupt(pin_curah_hujan), hitung_curah_hujan, FALLING); 
}
  • Serial.begin(9600);: Menginisialisasi komunikasi serial dengan baud rate 9600 untuk mengirim data ke Serial Monitor.
  • pinMode(pin_curah_hujan, INPUT);: Menetapkan pin pin_curah_hujan sebagai input, di mana sensor curah hujan akan terhubung.
  • attachInterrupt(digitalPinToInterrupt(pin_curah_hujan), hitung_curah_hujan, FALLING);: Menghubungkan pin pin_curah_hujan ke interrupt. Fungsi hitung_curah_hujan() akan dipanggil setiap kali terjadi perubahan falling edge (dari HIGH ke LOW) pada pin ini.

5. Loop Function

void loop(){
  float sensor_curah_hujan = baca_curah_hujan();
  Serial.println("Curah Hujan : " + (String)sensor_curah_hujan);
}
  • baca_curah_hujan(): Fungsi ini dipanggil setiap kali dalam loop untuk membaca dan menghitung total curah hujan yang telah terakumulasi.
  • Serial.println("Curah Hujan : " + (String)sensor_curah_hujan);: Menampilkan hasil pembacaan curah hujan dalam Serial Monitor.

6. Fungsi Interrupt

Fungsi interrupt hitung_curah_hujan() diaktifkan setiap kali ada pulsa (falling edge) yang diterima oleh pin input. Fungsi ini hanya berfungsi untuk mengubah status flag_curah_hujan menjadi true agar dapat memulai perhitungan curah hujan.

untuk diskusi bisa kontak dibawah ini :

Sosial media :

Apa itu ESP32?