#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
#include <Separador.h>
Separador s;
String direccion;
String slave1 = "101";                                   // Direccion del esclavo1
String slave2 = "102";                                   // Direccion del esclavo2
String slave3 = "103";                                   // Direccion del esclavo3
String slave4 = "104";                                   // Direccion del esclavo4
String S1_datosrecibidos;
String S1_dato1;
String S1_dato2;
String S1_dato3;
String S2_datosrecibidos;
String S2_dato1;
String S2_dato2;
String S2_dato3;
String S3_datosrecibidos;
String S3_dato1;
String S3_dato2;
String S3_dato3;
int Nivel_TK;
int Temp_H2o;
int Temp_Amb;
int PE_Slave1;
int SensorFLAMA_Slave3;
#define RS_MODE 2                                           // Pin para seleccionar modo transmisor o receptor del RS485
byte flag_rx = 0;                                           // Variable de estado para el modo receptor
unsigned long t_millis;                                     // Contador de tiempo transcurrido en milisegundos
void setup()
{
  pinMode(RS_MODE, OUTPUT);                                 // Pin de seleccion de modo del modulo RS485 como salida
  Serial.begin(9600);                                       // Configuracion del puerto serial a 9600 baudios
  lcd.init();     
  lcd.backlight();
  lcd.clear();
}
/////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////////////// 
void loop()
   {
     lcd.setCursor(0,0);lcd.print("****RS232  RS485****");
     lcd.setCursor(0,1); lcd.print("Nivel:");
         if((S1_dato2.toInt()) < 70)
          {
           lcd.print("BAJO");
          }
         else
          {
           lcd.print("OK  ");
          }
     lcd.setCursor(14,1);lcd.print(" %:");lcd.print(S1_dato2.toInt());
     lcd.setCursor(0,2);lcd.print("Temp H2o:");lcd.setCursor(10,2);lcd.print(S2_dato2.toInt());
     lcd.setCursor(14,2);lcd.print(" PE:");lcd.print(S1_dato3.toInt());
     lcd.setCursor(0,3);lcd.print("Temp Amb:");lcd.setCursor(10,3);lcd.print(S3_dato3.toInt());
     lcd.setCursor(14,3);lcd.print(" SF:");lcd.print(S3_dato2.toInt());
///////////////////////////////////////////////////////////
////////////// COMUNICACION CON EL ESCLAVO 1 //////////////
///////////////////////////////////////////////////////////
     digitalWrite(RS_MODE, HIGH);                              // Modo transmisor
     Serial.print(slave1);                                     // Envia la direccion del esclavo1
     Serial.print("*");                                        // Final de trama
     Serial.flush();                                           // Espera a que se transmitan los datos al esclavo
     digitalWrite(RS_MODE, LOW);                               // Modo receptor
 
     flag_rx = 1;
     t_millis = millis();
     while(flag_rx == 1)                                       // Espera a que responda el esclavo
         {
           if((millis() - t_millis) >= 1000 && flag_rx == 1)       // Si el esclavo no responde en 1 segundo, el maestro vuelve a transmitir datos
             {
               flag_rx = 0;
             }
           while(Serial.available() > 0)                           // Verifica si ha recibido datos del esclavo
               {
                 flag_rx = 0;
                 S1_dato1 = Serial.readStringUntil(',').toInt();
                 S1_dato2 = Serial.readStringUntil(':').toInt();
                 S1_dato3 = Serial.readStringUntil('*').toInt();
               }
         }
   delay (10);
///////////////////////////////////////////////////////////
////////////// COMUNICACION CON EL ESCLAVO 2 //////////////
///////////////////////////////////////////////////////////
    digitalWrite(RS_MODE, HIGH);                              // Modo transmisor
    Serial.print(slave2);                                     // Envia la direccion del esclavo1
    Serial.print("*");                                        // Final de trama
    Serial.flush();                                           // Espera a que se transmitan los datos al esclavo
    digitalWrite(RS_MODE, LOW);                               // Modo receptor
    flag_rx = 1;
    t_millis = millis();
    while(flag_rx == 1)                                       // Espera a que responda el esclavo
         {
           if((millis() - t_millis) >= 1000 && flag_rx == 1)       // Si el esclavo no responde en 1 segundo, el maestro vuelve a transmitir datos
             {
               flag_rx = 0;
             }
           while(Serial.available() > 0)                           // Verifica si ha recibido datos del esclavo
             {
               flag_rx = 0;
               S2_dato1 = Serial.readStringUntil(',').toInt();
               S2_dato2 = Serial.readStringUntil('*').toInt();
             }
         }
   delay (10);
///////////////////////////////////////////////////////////
////////////// COMUNICACION CON EL ESCLAVO 3 //////////////
///////////////////////////////////////////////////////////
   digitalWrite(RS_MODE, HIGH);                              // Modo transmisor
   Serial.print(slave3);                                     // Envia la direccion del esclavo1
   Serial.print("*");                                        // Final de trama
   Serial.flush();                                           // Espera a que se transmitan los datos al esclavo
   digitalWrite(RS_MODE, LOW);                               // Modo receptor
   flag_rx = 1;
   t_millis = millis();
   while(flag_rx == 1)                                       // Espera a que responda el esclavo
       {
         if((millis() - t_millis) >= 1000 && flag_rx == 1)   // Si el esclavo no responde en 1 segundo, el maestro vuelve a transmitir datos
           {
             flag_rx = 0;
           }
         while(Serial.available() > 0)                        // Verifica si ha recibido datos del esclavo
             {
               flag_rx = 0;
               S3_dato1 = Serial.readStringUntil(',').toInt();
               S3_dato2 = Serial.readStringUntil(':').toInt();
               S3_dato3 = Serial.readStringUntil('*').toInt();
             }
       }
    delay(900);
    lcd.clear();
    }
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////