Tutorial Instalasi Sensor Curah Hujan dengan Modul RS485 Menggunakan ESP32, Arduino Uno, dan Arduino Mega

Dalam tutorial ini, kita akan membahas cara menginstal dan menghubungkan sensor curah hujan yang menggunakan komunikasi RS485 dengan mikrokontroler seperti ESP32, Arduino Uno, dan Arduino Mega. Sensor curah hujan RS485 biasanya digunakan untuk mengukur intensitas hujan dan mengirim data secara digital ke mikrokontroler.

Pengertian sensor curah hujan

Sensor curah hujan RS485 adalah sebuah perangkat yang digunakan untuk mengukur intensitas curah hujan (biasanya dalam satuan mm/jam atau mm/hari) dan mengirimkan data hasil pengukuran tersebut secara digital menggunakan protokol komunikasi RS485. Sensor ini biasanya digunakan dalam sistem monitoring cuaca, pertanian, hidrologi, atau aplikasi lain yang membutuhkan pengukuran curah hujan secara akurat dan real-time.

Karakteristik Sensor Curah Hujan RS485:

  1. Prinsip Kerja:
    • Sensor curah hujan RS485 bekerja dengan mendeteksi jumlah air hujan yang jatuh pada permukaan sensor. Biasanya, sensor ini menggunakan mekanisme seperti tipping bucket (ember jungkit) atau optical sensor untuk menghitung volume air hujan.
    • Setiap kali volume tertentu terpenuhi (misalnya 0,2 mm), sensor akan menghasilkan pulsa atau sinyal yang dihitung sebagai satuan curah hujan.
  2. Output Data:
    • Sensor ini mengirimkan data hasil pengukuran dalam format digital melalui komunikasi RS485. Data yang dikirim biasanya berupa nilai curah hujan (misalnya dalam mm/jam) atau informasi lain seperti status sensor.
  3. Protokol Komunikasi:
    • RS485 adalah protokol komunikasi serial yang memungkinkan pengiriman data jarak jauh (hingga 1200 meter) dengan keandalan tinggi. Protokol ini menggunakan dua kabel (A dan B) untuk transmisi data secara diferensial, sehingga tahan terhadap noise.
    • Sensor curah hujan RS485 sering menggunakan protokol seperti Modbus RTU untuk mengirim data ke perangkat lain (seperti mikrokontroler, PLC, atau komputer).
  4. Keunggulan:
    • Jarak komunikasi panjang: RS485 memungkinkan komunikasi hingga jarak 1200 meter.
    • Tahan noise: Karena menggunakan sinyal diferensial, RS485 cocok untuk lingkungan industri atau outdoor.
    • Multi-device: RS485 mendukung komunikasi multi-drop, artinya beberapa sensor dapat dihubungkan ke satu jalur komunikasi.

Kegunaan sensor curah hujan

Sensor curah hujan adalah alat yang digunakan untuk mengukur jumlah air hujan yang jatuh di suatu area dalam periode waktu tertentu. Sensor ini memiliki berbagai kegunaan penting dalam berbagai bidang, mulai dari pertanian hingga manajemen bencana. Berikut adalah beberapa kegunaan utama sensor curah hujan:


1. Monitoring Cuaca dan Iklim

  • Stasiun Cuaca: Sensor curah hujan adalah komponen penting dalam stasiun cuaca untuk mengumpulkan data curah hujan secara real-time.
  • Studi Iklim: Data curah hujan digunakan untuk mempelajari pola iklim, perubahan cuaca, dan tren jangka panjang.

2. Pertanian dan Irigasi

  • Manajemen Irigasi: Petani menggunakan data curah hujan untuk menentukan kebutuhan air tanaman dan mengoptimalkan sistem irigasi.
  • Perencanaan Tanam: Data curah hujan membantu petani memilih waktu tanam yang tepat berdasarkan musim hujan.
  • Pencegahan Banjir di Lahan Pertanian: Memantau curah hujan untuk menghindari genangan air yang merusak tanaman.

3. Manajemen Sumber Daya Air

  • Pengelolaan Waduk dan Bendungan: Data curah hujan digunakan untuk mengatur aliran air, memprediksi kapasitas waduk, dan mencegah overflow.
  • Pengelolaan Sungai: Memantau curah hujan untuk mengelola aliran sungai dan mencegah banjir.

4. Peringatan Dini Bencana Alam

  • Peringatan Banjir: Sensor curah hujan digunakan dalam sistem peringatan dini banjir untuk memprediksi kapan dan di mana banjir mungkin terjadi.
  • Peringatan Tanah Longsor: Curah hujan yang tinggi dapat memicu tanah longsor, sehingga sensor ini membantu memantau kondisi risiko.
  • Peringatan Badai: Data curah hujan digunakan untuk memprediksi intensitas badai dan dampaknya.

5. Hidrologi dan Studi Lingkungan

  • Studi DAS (Daerah Aliran Sungai): Sensor curah hujan membantu mempelajari aliran air di daerah aliran sungai.
  • Pemantauan Erosi: Curah hujan yang tinggi dapat menyebabkan erosi tanah, sehingga sensor ini digunakan untuk memantau dan mencegah kerusakan lingkungan.

Alat dan Bahan yang Dibutuhkan:

  1. Sensor Curah Hujan dengan output RS485.
  2. Modul RS485 to TTL (misalnya MAX485).
  3. Mikrokontroler (ESP32, Arduino Uno, dan Arduino Mega).
  4. Kabel jumper.
  5. Power supply (12v).
  6. Breadboard (opsional).

Langkah-langkah Instalasi:

– Memahami Komunikasi RS485

RS485 adalah protokol komunikasi serial yang memungkinkan pengiriman data jarak jauh dengan keandalan tinggi. Sensor curah hujan RS485 mengirim data dalam format digital melalui dua kabel (A dan B). Modul RS485 to TTL (seperti MAX485) digunakan untuk mengubah sinyal RS485 menjadi sinyal TTL yang dapat dibaca oleh mikrokontroler.


– Menghubungkan Sensor Curah Hujan ke Modul RS485

  • Sensor curah hujan RS485 memiliki 4 pin utama:
    • A: Data positif (RS485).
    • B: Data negatif (RS485).
    • VCC: Power supply (12V).
    • GND: Ground.
  • Hubungkan sensor ke modul RS485 to TTL:
    • Pin A sensor ke pin A modul RS485.
    • Pin B sensor ke pin B modul RS485.
    • Pin VCC sensor ke sumber daya (5V atau 12V).
    • Pin GND sensor ke GND modul RS485 dan GND mikrokontroler.

Menghubungkan Modul RS485 ke Mikrokontroler

Modul RS485 to TTL memiliki pin berikut:

  • RO (Receiver Output): Data yang diterima dari RS485.
  • DI (Driver Input): Data yang dikirim ke RS485.
  • DE (Driver Enable): Mengaktifkan pengiriman data.
  • RE (Receiver Enable): Mengaktifkan penerimaan data.
  • VCC dan GND: Power supply modul.

Cara penggunaan menggunakan arduino uno

Arduino Uno adalah salah satu board mikrokontroler yang paling banyak digunakan. Untuk menghubungkan sensor pH dengan Arduino Uno

wiring arduino uno menggunakan lcd

Untuk Arduino Uno:

  • Hubungkan RO ke pin RX (pin 9).
  • Hubungkan DI ke pin TX (pin 10).
  • Hubungkan DE dan RE ke pin digital pin 8
  • Hubungkan VCC ke 5V dan GND ke GND.
#define EN_RS485 8
#include <ModbusMaster.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>

const int col = 16;
const int row = 2;
LiquidCrystal_I2C lcd(0x27, col, row);

ModbusMaster node;
SoftwareSerial mySerial(9, 10); // RX, TX

#define SLAVE_ADDR ((uint16_t)0x01)
uint16_t nilai;
float c;

void preTransmission() {
  digitalWrite(EN_RS485, 1);
}

void postTransmission() {
  digitalWrite(EN_RS485, 0);
}

void setup() {
  // put your setup code here, to run once:
  pinMode(EN_RS485, OUTPUT);
  lcd.init();
  //lcd.begin();
  lcd.backlight();
  lcd.setCursor(5, 0);
  lcd.print("TEMINS");
  lcd.setCursor(5, 1);
  lcd.print("STORE");
  delay(5000);
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("RAIN GAUGE");
  lcd.setCursor(3, 1);
  lcd.print("LOADING...");
  delay(6000);
  Serial.begin(9600);
  mySerial.begin(4800);

  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  node.begin(SLAVE_ADDR, mySerial);
  delay(100);
}

void loop() {
  // put your main code here, to run repeatedly:
  lcd.init();
  //lcd.begin();
  lcd.backlight();
  lcd.setCursor(5, 1);
  lcd.print(c);
  lcd.print("MM");
  lcd.setCursor(3, 0);
  lcd.print("CURAH HUJAN");
  //delay(10000);
  c = baca_sensor(0) / 10.0;
  Serial.println("CURAH HUJAN: " + String(c));
  delay(5);
 // Serial.println("============================================");
  delay(100);
}

int baca_sensor(uint16_t alamat) {
  int result;
  result = node.readHoldingRegisters(alamat, 1);
  if (result == node.ku8MBSuccess) {
    nilai = node.getResponseBuffer(0);
  } else {
    Serial.println("modbus fail");
  }
  return nilai;
}

Wiring arduino uno menggunakan serial monitor

Arduino Uno:

  • VCC pada modul MAX485 -> 5V pada Arduino.
  • GND pada modul MAX485 -> GND pada Arduino.
  • A pada modul MAX485 -> A pada sensor curah hujan.
  • B pada modul MAX485 -> B pada sensor curah hujan.
  • RO (Receiver Output) pada modul MAX485 -> disambungkan ke pin 9
  • DI (Driver Input) pada modul MAX485 -> disambungkan ke pin 10
  • DE dan RE disambungkan dan dihubungkan ke pin 8
#define EN_RS485 8
#include <ModbusMaster.h>
#include <SoftwareSerial.h>

ModbusMaster node;
SoftwareSerial mySerial(9, 10); // RX, TX

#define SLAVE_ADDR ((uint16_t)0x01)

uint16_t nilai;
float c;

void preTransmission() {
  digitalWrite(EN_RS485, 1);
}

void postTransmission() {
  digitalWrite(EN_RS485, 0);
}

void setup() {
  // put your setup code here, to run once:
  pinMode(EN_RS485, OUTPUT);

  Serial.begin(9600);
  mySerial.begin(4800);

  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  node.begin(SLAVE_ADDR, mySerial);
  delay(1000);
}

void loop() {
  // put your main code here, to run repeatedly:
  c = baca_sensor(0) / 10.0;
  Serial.println("CURAH HUJAN : " + String(c));
  delay(5);
  Serial.println("============================================");
  delay(1000);
}

int baca_sensor(uint16_t alamat) {
  int result;
  result = node.readHoldingRegisters(alamat, 1);
  if (result == node.ku8MBSuccess) {
    nilai = node.getResponseBuffer(0);
  } else {
    Serial.println("modbus fail");
  }
  return nilai;
}

Cara Penggunaan dengan ESP32

ESP32 adalah mikrokontroler yang lebih canggih dengan konektivitas Wi-Fi dan Bluetooth. Dengan ESP32, Anda dapat mengirimkan data pH ke server atau aplikasi web melalui jaringan

Wiring esp32 menggunakan lcd

ESP32:

  • VCC pada modul MAX485 -> VIN pada ESP32.
  • GND pada modul MAX485 -> GND pada ESP32.
  • A pada modul MAX485 -> A pada sensor curah hujan.
  • B pada modul MAX485 -> B pada sensor curah hujan.
  • RO (Receiver Output) pada modul MAX485 -> RX (pin 16) pada ESP32.
  • DI (Driver Input) pada modul MAX485 -> TX (pin 17) pada ESP32.
  • DE dan RE  pada modul MAX485 -> D18 pada ESP32
  • download library softwareserial khusus esp 32
#define EN_RS485 18
#include <ModbusMaster.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>

const int col = 16;
const int row = 2;
LiquidCrystal_I2C lcd(0x27, col, row);

ModbusMaster node;
SoftwareSerial mySerial(16, 17); // RX, TX

#define SLAVE_ADDR ((uint16_t)0x01)
uint16_t nilai;
float c;

void preTransmission() {
  digitalWrite(EN_RS485, 1);
}

void postTransmission() {
  digitalWrite(EN_RS485, 0);
}

void setup() {
  // put your setup code here, to run once:
  pinMode(EN_RS485, OUTPUT);
  //lcd.init();
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(5, 0);
  lcd.print("TEMINS");
  lcd.setCursor(5, 1);
  lcd.print("STORE");
  delay(5000);
   lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("RAIN GAUGE");
  lcd.setCursor(3, 1);
  lcd.print("LOADING...");
  delay(6000);
  Serial.begin(9600);
  mySerial.begin(4800);

  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  node.begin(SLAVE_ADDR, mySerial);
  delay(100);
}

void loop() {
  // put your main code here, to run repeatedly:
  //lcd.init();
  lcd.begin();
  lcd.backlight();
  lcd.setCursor(5, 1);
  lcd.print(c);
  lcd.print("MM");
  lcd.setCursor(3, 0);
  lcd.print("CURAH HUJAN");
  //delay(10000);
  c = baca_sensor(0) / 10.0;
  Serial.println("CURAH HUJAN: " + String(c));
  delay(5);
 // Serial.println("============================================");
  delay(100);
}

int baca_sensor(uint16_t alamat) {
  int result;
  result = node.readHoldingRegisters(alamat, 1);
  if (result == node.ku8MBSuccess) {
    nilai = node.getResponseBuffer(0);
  } else {
    Serial.println("modbus fail");
  }
  return nilai;
}

wiring esp32 menggunakan serial monitor

esp32:

  • VCC pada modul MAX485 -> VIN pada ESP32.
  • GND pada modul MAX485 -> GND pada ESP32.
  • A pada modul MAX485 -> A pada sensor arah angin.
  • B pada modul MAX485 -> B pada sensor arah angin.
  • RO (Receiver Output) pada modul MAX485 -> RX (pin 16) pada ESP32.
  • DI (Driver Input) pada modul MAX485 -> TX (pin 17) pada ESP32.
  • DE dan RE  pada modul MAX485 -> D18 pada ESP32
  • download library softwareserial khusus esp 32
#define EN_RS485 18
#include <ModbusMaster.h>
#include <SoftwareSerial.h>

ModbusMaster node;
SoftwareSerial mySerial(16, 17); // RX, TX

#define SLAVE_ADDR ((uint16_t)0x01)

uint16_t nilai;
float c;

void preTransmission() {
  digitalWrite(EN_RS485, 1);
}

void postTransmission() {
  digitalWrite(EN_RS485, 0);
}

void setup() {
  // put your setup code here, to run once:
  pinMode(EN_RS485, OUTPUT);

  Serial.begin(9600);
  mySerial.begin(4800);

  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  node.begin(SLAVE_ADDR, mySerial);
  delay(1000);
}

void loop() {
  // put your main code here, to run repeatedly:
  c = baca_sensor(0) / 10.0;
  Serial.println("CURAH HUJAN : " + String(c));
  delay(5);
  Serial.println("============================================");
  delay(1000);
}

int baca_sensor(uint16_t alamat) {
  int result;
  result = node.readHoldingRegisters(alamat, 1);
  if (result == node.ku8MBSuccess) {
    nilai = node.getResponseBuffer(0);
  } else {
    Serial.println("modbus fail");
  }
  return nilai;
}

Cara Penggunaan dengan Arduino Mega

Arduino Mega memiliki lebih banyak pin dan lebih banyak port serial dibandingkan dengan Arduino Uno, yang membuatnya lebih fleksibel untuk aplikasi dengan banyak perangkat RS485

Wiring arduino mega menggunakan lcd

Arduino mega:

  • VCC pada modul MAX485 -> 5V pada Arduino.
  • GND pada modul MAX485 -> GND pada Arduino.
  • A pada modul MAX485 -> A pada sensor arah angin.
  • B pada modul MAX485 -> B pada sensor arah angin.
  • RO (Receiver Output) pada modul MAX485 -> RX 1 (pin 19) pada Arduino.
  • DI (Driver Input) pada modul MAX485 -> TX 1 (pin 18) pada Arduino.
  • DE dan RE pada modul MAX485 -> D10 pada Arduino (atau pin digital lainnya).
#define EN_RS485 10
#include <ModbusMaster.h>
#include <LiquidCrystal_I2C.h>

const int col = 16;
const int row = 2;
LiquidCrystal_I2C lcd(0x27, col, row);

ModbusMaster node;
//SoftwareSerial mySerial(19, 18); // RX, TX

#define SLAVE_ADDR ((uint16_t)0x01)
uint16_t nilai;
float c;

void preTransmission() {
  digitalWrite(EN_RS485, 1);
}

void postTransmission() {
  digitalWrite(EN_RS485, 0);
}

void setup() {
  // put your setup code here, to run once:
  pinMode(EN_RS485, OUTPUT);
  lcd.init();
  //lcd.begin();
  lcd.backlight();
  lcd.setCursor(5, 0);
  lcd.print("TEMINS");
  lcd.setCursor(5, 1);
  lcd.print("STORE");
  delay(5000);
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("RAIN GAUGE");
  lcd.setCursor(3, 1);
  lcd.print("LOADING...");
  delay(6000);

  Serial.begin(9600);
  Serial1.begin(4800);

  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  node.begin(SLAVE_ADDR, Serial1);
  delay(100);
}

void loop() {
  // put your main code here, to run repeatedly:
  lcd.init();
  lcd.backlight();
  lcd.setCursor(5, 1);
  lcd.print(c);
  lcd.print("MM");
  lcd.setCursor(3, 0);
  lcd.print("CURAH HUJAN");
  c = baca_sensor(0) / 10.0;
  Serial.println("CURAH HUJAN : " + String(c));
  delay(5);
 Serial.println("============================================");
  delay(100);
}

int baca_sensor(uint16_t alamat) {
  int result;
  result = node.readHoldingRegisters(alamat, 1);
  if (result == node.ku8MBSuccess) {
    nilai = node.getResponseBuffer(0);
  } else {
    Serial.println("modbus fail");
  }
  return nilai;
}

wiring arduino mega menggunakan serial monitor

Arduino mega

  • VCC pada modul MAX485 -> 5V pada Arduino.
  • GND pada modul MAX485 -> GND pada Arduino.
  • A pada modul MAX485 -> A pada sensor arah angin.
  • B pada modul MAX485 -> B pada sensor arah angin.
  • RO (Receiver Output) pada modul MAX485 -> RX 1 (pin 19) pada Arduino.
  • DI (Driver Input) pada modul MAX485 -> TX 1 (pin 18) pada Arduino.
  • DE dan RE pada modul MAX485 -> D10 pada Arduino (atau pin digital lainnya)
#define EN_RS485 10
#include <ModbusMaster.h>
#include <LiquidCrystal_I2C.h>

const int col = 16;
const int row = 2;
LiquidCrystal_I2C lcd(0x27, col, row);

ModbusMaster node;
//SoftwareSerial mySerial(19, 18); // RX, TX

#define SLAVE_ADDR ((uint16_t)0x01)
uint16_t nilai;
float c;

void preTransmission() {
  digitalWrite(EN_RS485, 1);
}

void postTransmission() {
  digitalWrite(EN_RS485, 0);
}

void setup() {
  // put your setup code here, to run once:
  pinMode(EN_RS485, OUTPUT);
  Serial.begin(9600);
  Serial1.begin(4800);

  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  node.begin(SLAVE_ADDR, Serial1);
  delay(2000);
}

void loop() {
  // put your main code here, to run repeatedly:
  c = baca_sensor(0) / 10.0;
  Serial.println("CURAH HUJAN : " + String(c));
  delay(5);
 Serial.println("============================================");
  delay(100);
}

int baca_sensor(uint16_t alamat) {
  int result;
  result = node.readHoldingRegisters(alamat, 1);
  if (result == node.ku8MBSuccess) {
    nilai = node.getResponseBuffer(0);
  } else {
    Serial.println("modbus fail");
  }
  return nilai;
}

Testing dan Kalibrasi

  • Pastikan semua koneksi sudah benar.
  • Gunakan serial monitor untuk melihat data yang dikirim oleh sensor.
  • Jika data tidak terbaca, periksa koneksi RS485 dan pastikan modul RS485 to TTL berfungsi dengan baik.

Catatan:

  • Pastikan Anda memahami protokol komunikasi yang digunakan oleh sensor (misalnya Modbus RTU).
  • Jika sensor menggunakan Modbus, Anda perlu menggunakan library Modbus untuk memparsing data.

Dengan mengikuti langkah-langkah di atas, Anda dapat menghubungkan sensor curah hujan RS485 ke ESP32, Arduino Uno, atau Arduino Mega. Jika ada pertanyaan lebih lanjut, silakan konsultasikan datasheet sensor dan modul RS485 yang Anda gunakan.

Leave a Reply

Your email address will not be published. Required fields are marked *