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 fungsihitung_curah_hujan()adalah fungsi interrupt yang dijalankan saat terjadi perubahan status pada pinpin_curah_hujan.hitung_curah_hujan(): Fungsi ini akan dipanggil setiap kali terjadi falling edge (perubahan status dari HIGH ke LOW) pada pinpin_curah_hujan. Ini menandakan bahwa satu pulsa atau satu tip dari sensor curah hujan telah diterima.- Saat fungsi ini dipanggil, variabel
flag_curah_hujandi-set menjaditrueuntuk menandakan bahwa sensor telah mendeteksi hujan.
- Saat fungsi ini dipanggil, variabel
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) danflag_curah_hujanbernilaitrue, 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 kembaliflag_curah_hujankefalseagar 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 pinpin_curah_hujansebagai input, di mana sensor curah hujan akan terhubung.attachInterrupt(digitalPinToInterrupt(pin_curah_hujan), hitung_curah_hujan, FALLING);: Menghubungkan pinpin_curah_hujanke interrupt. Fungsihitung_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 :





