//====================================================================//
//               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