//====================================================================//
// Program Master - Slave Pengiriman Data Sensor //
// Dengan menggunakan Modul RS485 //
// (Untuk Arduino Master Sub-Net) //
//====================================================================//
//---------------------------------------------------------------------
#define Enable 7 //deklarasi pin 7 menentukan status receive/transmit
#define PB1 6 //deklarasi pin 6 terhubung ke tombol PB1
#define PB2 5 //deklarasi pin 5 terhubung ke tombol PB2
#define PB3 4 //deklarasi pin 4 terhubung ke tombol PB3
#define STX '2' //deklarasi variabel STX=2
#define ETX 3 //deklarasi variabel ETX=3
#define SOH '1' //deklarasi variabel SOH=1
#define EOT 't' //deklarasi variabel EOT=T
int Addr; //deklarasi variabel Addr (alamat)
#define Cmd 'r' //deklarasi variabel Cmd=r (perintah read sensor)
#include <LiquidCrystal_I2C.h> //gunakan library utk LCD-I2C
LiquidCrystal_I2C lcd(0x27,16,2);//deklarasi objek lcd dg addr 27H,16x2
int slave; //deklarasi variabel slave
//---------------------------------------------------------------------
void setup() {
Serial.begin(9600); //set UART dg kecepatan 9600 bps
pinMode(Enable, OUTPUT); //set pin 7 sebagai output
digitalWrite(Enable, LOW); //default receiver
pinMode(PB1,INPUT); //set pin 6 sebagai pin input
pinMode(PB1,INPUT_PULLUP); //set pin 6 dengan R pull-up internal
pinMode(PB2,INPUT); //set pin 5 sebagai pin input
pinMode(PB2,INPUT_PULLUP); //set pin 5 dengan R pull-up internal
pinMode(PB3,INPUT); //set pin 4 sebagai pin input
pinMode(PB3,INPUT_PULLUP); //set pin 4 dengan R pull-up internal
lcd.init(); //aktifkan LCD tipe I2C
lcd.backlight(); //nyalakan lampu backlight pada LCD
lcd.setCursor(0,0); //pindahkan kursor ke posisi 0,0
lcd.println(F(" Master RS-485 "));//tulis ke LCD pada posisi o,0
lcd.setCursor(0,1); //pindahkan kursor ke posisi 0,1
lcd.print(F("Dua Slave RS485 ")); //tulis ke LCD pada poisi 0,1
delay(2000); //delay jeda dua tampilan pada LCD
lcd.setCursor(0,0); //pindahkan posisi ke poisi 0,0
lcd.print(F("Sensor-1 : "));//tulis ke LCD pada posisi 0,0
lcd.setCursor(0,1); //pindahkan posisi ke poisi 0,0
lcd.print(F("Sensor-2 : "));//tulis ke LCD pada posisi 0,1
}
//====================================================================//
void loop() {
if(digitalRead(PB1)==LOW) { //cek tombol PB1 ditekan
Addr=1; //set variabel Addr=1
digitalWrite(Enable, HIGH); //set transmit data
Send_packet();
Next_1();//jalankan fungsi Next_1 yg ada di dalam file Sensor-1.h
delay(30); //delay agar looping tidak terlalu cepat
}
//-----------------------------------------------
if(digitalRead(PB2)==LOW) { // cek tombol PB2 ditekan
Addr=2; //set variabel Addr=2
digitalWrite(Enable, HIGH); //set transmit data
Send_packet();
Next_2();//jalankan fungsi Next_2 yg ada di dalam file Sensor-2.h
delay(30); //delay agar looping tidak terlalu cepat
}
//-----------------------------------------------
if(digitalRead(PB3)==LOW) { // cek tombol PB2 ditekan
Addr=3; //set variabel Addr=2
digitalWrite(Enable, HIGH); //set transmit data
Send_packet();
Next_3();//jalankan fungsi Next_2 yg ada di dalam file Sensor-2.h
delay(30); //delay agar looping tidak terlalu cepat
}
}
//====================================================================//
void Send_packet() {
Serial.print(STX); //kirim STX ke Slave
Serial.print(Addr); //kirim Address ke Slave
Serial.print(Cmd); //kirim 'r' ke Slave
Serial.println(ETX);//kirim ETX ke Slave
Serial.flush(); //tunggu hingga pengiriman paket data selesai
}
//---------------------------------------------------------------------
void Next_1() {
int value; //deklarasi variabel value
digitalWrite(Enable, LOW); //set sebagai receive
while(Serial.available()) { //menunggu data serial dari bus RS454
if(Serial.read()==SOH) { //cek data serial apakah SOH ?
if(Serial.find("1")) { //cek data serial apakah alamat "1"
value = Serial.parseInt();//baca value (data sensor) dari Slave
if(Serial.read() == EOT) {//cek data serial apakah EOT ?
lcd.setCursor(0,0); //set posisi kursor pada 0,0
lcd.print("Sensor-1 : ");//tampilkan di LCD
lcd.setCursor(11,0); //set posisi kursor kolom 11 baris 0
lcd.print(value); //tampilkan data sensor-1
}
}
}
}
}
//---------------------------------------------------------------------
void Next_2() {
int value; //deklarasi variabel value
digitalWrite(Enable, LOW); //set sebagai receive
while(Serial.available()) { //menunggu data serial dari bus RS454
if(Serial.read()==SOH) { //cek data serial apakah SOH ?
if(Serial.find("2")) { //cek data serial apakah alamat "2"
value = Serial.parseInt();//baca value (data sensor) dari Slave
if(Serial.read() == EOT) {//cek data serial apakah EOT ?
lcd.setCursor(0,1); //set posisi kursor pada 0,0
lcd.print("Sensor-2 : ");//tampilkan di LCD
lcd.setCursor(11,1); //set posisi kursor pd kolom 11 baris 1
lcd.print(value); //tampilkan data sensor-2
}
}
}
}
}
//---------------------------------------------------------------------
void Next_3() {
int value; //deklarasi variabel value
digitalWrite(Enable, LOW); //set sebagai receive
while(Serial.available()) { //menunggu data serial dari bus-main
if(Serial.read()==SOH) { //cek data serial apakah SOH ?
if(Serial.find("3")) { //cek data serial apakah alamat "3"
value = Serial.parseInt();//baca value (data sensor) dari Slave
if(Serial.read() == EOT) {//cek data serial apakah EOT ?
lcd.setCursor(0,1); //set posisi kursor pada 0,0
lcd.print("Sub-Net : ");//tampilkan di LCD
lcd.setCursor(11,1); //set posisi kursor pd kolom 11 baris 1
lcd.print(value); //tampilkan data sensor-2
}
}
}
}
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5