//====================================================================//
//               Program Master - Slave Pengiriman Data Sensor        //
//                      Dengan menggunakan Modul RS485                //
//                          (Untuk Arduino Slave-2)                   //
//====================================================================//
// RE=0       RE=0        RE=1      RE=1
// DE=0       DE=1        DE=0      DE=1
// Receive      x         Open      Transmit
//---------------------------------------------------------------------
#define RE_main 7   //pin 7 sebagai RE utk bus RS485 Utama
#define DE_main 8   //pin 8 sebagai DE utk bus RS485 Utama
#define RE_sub  9   //pin 9 sebagai RE 
#define DE_sub 10   //pin 10 sebagai DE
#define STX '2'     //singkatan dari Start of Text
#define ETX  3      //singkatan dari End of Text
#define SOH '1'     //singkatan dari Start of Heading
#define EOT 't'     //singkatan dari End of Transmit
#define Addr 2      //set alamat Slave 
#define Cmd 'r'     //perintah read sensor
//---------------------------------------------------------------------
void rx_main() {digitalWrite(RE_main,LOW); digitalWrite(DE_main,LOW);}
void open_main(){digitalWrite(RE_main,HIGH);digitalWrite(DE_main,LOW);}
void tx_main(){digitalWrite(RE_main,HIGH);digitalWrite(DE_main,HIGH);}

void rx_sub() {digitalWrite(RE_sub,LOW); digitalWrite(DE_sub,LOW);}
void open_sub(){digitalWrite(RE_sub,HIGH);digitalWrite(DE_sub,LOW);}
void tx_sub(){digitalWrite(RE_main,HIGH);digitalWrite(DE_sub,HIGH);}
//---------------------------------------------------------------------
void setup() { 
  Serial.begin(9600);      //set UART dg kecepatan 9600 bps
  pinMode(RE_main, OUTPUT);//set pin 7 sebagai output
  pinMode(DE_main, OUTPUT);//set pin 8 sebagai output
  pinMode(RE_sub, OUTPUT); //set pin 7 sebagai output
  pinMode(DE_sub, OUTPUT); //set pin 8 sebagai output
  pinMode(A0, INPUT);      //set pin A0 sebagai input
} 
//---------------------------------------------------------------------
void loop() { 
  rx_main(); open_sub();     //receive pd bus utama, open pd Sub-bus
// A -------  membaca data dari Master yang ditujukan ke alamat “3”
  if(Serial.available()) {   //jika ada data eksekusi baris berikutnya
    if(Serial.read()== STX)      {       //cek serial apakah STX ?
      if(Serial.parseInt() == Addr) {    //cek apakah ditujukan ke Addr=2 ?
        if(Serial.read() == Cmd) {       //cek apakah Cmd=r ?
          if(Serial.parseInt() == ETX) { //cek apakah ETX ?
              delay(5);             //delay agar Master siap menerima data 
            tx_main(); open_sub();  //tx pd bus utama, open pd Sub-bus
            Serial.print(SOH);           //kirim SOH ke Master
            Serial.print(Addr);          //kirim alamat ke Master
            Serial.print(analogRead(0)); //kirim data sensor ke Master
            Serial.print(EOT);           //kirim EOT ke Master
            Serial.flush();         //tunggu hingga pengiriman selesai
            return;                 //keluar dari blok-if pengecekan ETX
          }
        }
      }
// B -------  blok jika alamat yang ditujukan ke alamat “3”
      else {
        if(Serial.read() == Cmd) {       //cek apakah Cmd=r ?
          if(Serial.parseInt() == ETX) { //cek apakah ETX ?
          tx_sub(); open_main();         //tx pd Sub-bus, open pd bus utama
// C -------  kirim permintaan paket dari Slave-2 ke Slave-3
            delay(10);             //delay agar Slave-3 siap menerima data 
            Serial.print(STX);  //kirim STX ke Sub-bus
            Serial.print(3);    //kirim Addr ke Sub-bus
            Serial.print(Cmd);  //kirim Cmd ke Sub-bus
            Serial.print(ETX);  //kirim ETX ke Sub-bus
            Serial.flush();     //tunggu hingga pengiriman paket data selesai            
            rx_sub(); open_main();       //rx pd Sub-bus, open pd bus utama
// D -------  cek paket data dari Slave-3
            while(Serial.available()) {//menunggu data serial dari Slave-3
              if(Serial.read()==SOH)  {//cek apakah SOH ?
                if(Serial.find("2"))  {//cek apakah alamat ditujukan ke “2”
                  int value=Serial.parseInt();//salin data VR3 dari Slave-3
                  if(Serial.read()==EOT) {//cek apakah EOT ?
// E --------------  kirim data VR3 dari Slave-3 ke Master
                    tx_main(); open_sub();
                    Serial.print(SOH);  //kirim SOH ke Master
                    Serial.print(1);    //kirim alamat ke Master
                    Serial.print(value);//kirim data VR3 ke Master
                    Serial.print(EOT);  //kirim EOT ke Master
                    Serial.flush();     //tunggu hingga pengiriman selesai
                    return;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
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