Pada tutorial ini, kita akan membahas cara menggunakan sensor pH dengan komunikasi Modbus dan RS485 untuk mengukur ph tanah yang tidak subur agar tidak menghambat pertumbuhan tanaman . Kita akan menggunakan berbagai platform mikrokontroler seperti Arduino Uno, Arduino Mega, dan ESP32 untuk menghubungkan sensor pH dan membaca data yang dihasilkannya.
Tanah dianggap sebagai media alami untuk pertumbuhan & perkembangan tanaman. Banyak penelitian yang dilakukan untuk menentukan faktor internal kegagalan produksi tanaman petani. Salah satu faktornya adalah keseimbangan alam dalam tanah yang tidak stabil atau tidak subur yang menghambat pertumbuhan tanaman dan perkembangan akar tanaman. Ph adalah keasaman atau kebasaan bahan yang diukur pada skala antara 0 hingga 14. Nilai Ph kurang dari 7 dianggap asam dan lebih dari 7 dianggap basa. Jika skala pH adalah 7 maka bahan tersebut netral. Kondisi tanah yang paling ideal untuk pertumbuhan & perkembangan tanaman adalah tanah netral. Namun, beberapa jenis tanaman masih toleran terhadap tanah dengan Ph sedikit asam dengan pH maksimum 5.
Kegunaan Sensor pH dengan Modbus dan RS485
Menggunakan Modbus dan RS485 untuk komunikasi sensor pH memberikan beberapa keuntungan, seperti:
- Komunikasi Jarak Jauh: RS485 memungkinkan komunikasi data pada jarak lebih jauh dibandingkan dengan komunikasi UART atau I2C.
- Kemampuan Multi-Perangkat: Beberapa sensor pH dapat terhubung dalam satu jaringan RS485.
- Keandalan dalam Lingkungan Industri: Modbus RS485 sangat handal dan tahan terhadap gangguan elektromagnetik yang sering ditemukan dalam lingkungan industri.
Dengan menggunakan Modbus, data sensor pH dapat dengan mudah dikirim ke perangkat lain seperti PLC (Programmable Logic Controller), HMI (Human Machine Interface), atau mikrokontroler untuk pemrosesan lebih lanjut.
penjelasan tentang kabel sensor soil ph

Cara Penggunaan dengan Arduino Uno
Arduino Uno adalah salah satu board mikrokontroler yang paling banyak digunakan. Untuk menghubungkan sensor pH dengan Arduino Uno menggunakan komunikasi Modbus dan RS485, Anda memerlukan beberapa komponen tambahan seperti modul RS485 dan pustaka Modbus. Pada contoh kali ini kami menggunakan Power untuk sensornya dengan aki agar mendapat 12V.
Wiring dengan Arduino UNO

- Modul RS485 dihubungkan ke pin serial Arduino, yaitu pin RX (9) dan TX (10).
- Sensor pH dihubungkan ke modul RS485, yang kemudian akan mengirimkan data pH dalam format Modbus.
Langkah-Langkah Penggunaan:
Instal library ModbusMaster untuk Arduino sebelum menggunakan code berikut.
#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 ph;
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:
ph = baca_sensor(0) / 10.0;
Serial.println("pH : " + String(ph));
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;
}
Upload program di atas, dan buka serial monitor. Seharusnya nilai pH akan muncul di serial monitor.
Menambahkan LCD untuk Menampilkan Nilai

- Modul RS485 dihubungkan ke pin serial Arduino, yaitu pin RX (9) dan TX (10).
- Sensor pH dihubungkan ke modul RS485, yang kemudian akan mengirimkan data pH dalam format Modbus.
Langkah-Langkah Penggunaan:
Jika sudah berhasil menggunakan koding sebelumnya tanpa LCD, sekarang tinggal tambahkan library LCD_I2C jika belum ada. Dan gunakan koding berikut:
#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 ph;
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);
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(4, 1);
lcd.print("ph: ");
lcd.print(ph);
lcd.setCursor(4, 0);
lcd.print("PH VALUE");
delay(100);
ph = baca_sensor(0) / 10.0;
Serial.println("pH : " + String(ph));
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;
}
Cara Menggunakan 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 dengan Arduino Mega

- Hubungkan Modul RS485 ke port serial1 di Arduino Mega, pin TX1 (18), RX1 (19), atau port lainnya.
- Sensor pH tetap terhubung ke modul RS485.
Langkah-Langkah Penggunaan:
- Sama seperti pada Arduino Uno, instal library Modbus RTU.
- Pilih port serial yang tepat sesuai dengan pin yang digunakan di Arduino Mega.
#define EN_RS485 10
#include <ModbusMaster.h>
ModbusMaster node;
#define SLAVE_ADDR ((uint16_t)0x01)
uint16_t nilai;
float ph;
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(1000);
}
void loop() {
// put your main code here, to run repeatedly:
ph = baca_sensor(0) / 10.0;
Serial.println("pH : " + String(ph));
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;
}
Menambahkan LCD pada Arduino Mega

Pastikan wiring sudah benar, dan pastikan kamu sudah menginstall library LCD I2C.
#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 ph;
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);
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.begin();
lcd.backlight();
lcd.setCursor(4, 1);
lcd.print("ph: ");
lcd.print(ph);
lcd.setCursor(4, 0);
lcd.print("PH VALUE");
delay(100);
ph = baca_sensor(0) / 10.0;
Serial.println("pH : " + String(ph));
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 dengan ESP32

- Modul RS485 dihubungkan ke ESP32 menggunakan pin UART yang tersedia (misalnya, GPIO 16 untuk RX dan GPIO 17 untuk TX).
- Hubungkan sensor pH ke modul RS485.
Langkah-Langkah Penggunaan:
- Instal library software serial khusus esp 32 agar serial nya terbaca.
- Tentukan baud rate di 9600 pada pengaturan serial monitor.
- Gunakan ESP32 untuk membaca data pH sesuai kebutuhan.
#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 ph;
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:
ph = baca_sensor(0) / 10.0;
Serial.println("pH : " + String(ph));
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

- Modul RS485 dihubungkan ke ESP32 menggunakan pin UART yang tersedia (misalnya, GPIO 16 untuk RX dan GPIO 17 untuk TX).
- Hubungkan sensor pH ke modul RS485.
Langkah-Langkah Penggunaan:
- Instal library software serial khusus esp 32 agar serial nya terbaca.
- Tentukan baud rate di 9600 pada pengaturan serial monitor.
- Gunakan ESP32 untuk membaca data pH sesuai kebutuhan.
#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 ph;
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);
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(4, 1);
lcd.print("ph: ");
lcd.print(ph);
lcd.setCursor(4, 0);
lcd.print("PH VALUE");
delay(10000);
ph = baca_sensor(0) / 10.0;
Serial.println("pH : " + String(ph));
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;
}
Kesimpulan
Dengan mengikuti tutorial ini, Anda dapat menggunakan sensor pH dengan komunikasi Modbus dan RS485 pada berbagai platform mikrokontroler seperti Arduino Uno, Arduino Mega, dan ESP32. Protokol Modbus memungkinkan komunikasi yang handal dan efisien dalam aplikasi yang memerlukan pemantauan pH secara terus-menerus dan pengolahan data secara otomatis.
Jika Anda sudah memiliki wiring diagram dan kode yang disediakan, pastikan untuk mengikuti petunjuk tersebut dengan cermat dan menyesuaikan pengaturan sesuai dengan kebutuhan sistem Anda.