Comunicación bidireccional entre arduinos

Hola a todos,
este es mi primer post en el foro.

Desde hace algún tiempo he estado trabando con arduino, viendo tutoriales, practicando y realizando mis propios proyectos. en este sentido tome la decisión de realizar uno que me apasiona por lo cual he pasado investigando por varios lugares en Internet así como también aquí en el foro en donde hace unos meses atrás observe un código que para ese entonces no comprendía y que ahora después de leer practicar pude modificar para las necesidades de mi proyecto, en ese sentido pasare a explicarlo a continuación:

Quiero hacer el control y monitoreo de agua que ingresa a un tanque(en este caso, pero que puede tener diferentes aplicaciones)para ello el proyecto se divide en dos partes.

_interfaz de usuario
en donde la persona podrá configurar los diferentes parámetros y que consta de un arduino uno, una lcd 16x2 y un teclado 4x4.

_sistema de control
en donde están conectados la motobomba y su tarjeta relay ON/OFF, un sensor de flujo, un buzer, y un servomotor para abrir y cerrar la vavula.

*funcionamiento
en la interfaz puedo digitar la cantidad de agua a utilizar, luego esta información es almacenada por el arduino1 y transmitida al arduino2 vía serial para que este la interprete, abra la valvula y comience el proceso de medición que al llegar a la mitad del valor que configure en la interfaz me envié de nuevo los datos al arduino1 y pueda visualizarlos y asi emitir varias alarmas.

Cabe destacar que ya llevo un poco adelantado el proyecto y que hasta ahora cuento con un prototipo, el inconveniente que me dirige hacia ustedes es que el código es funcional, con esto me refiero a que puedo digitar la cantidad de liquido que quiero, mida la cantidad de agua que ingresa y me la muestre en la lcd y active las diferentes alarmas PERO ahi es donde tengo el inconveniente que por mas que he buscado, escrito y probado ideas que he encontrado en Internet no logro resolverlo y es que el codigo funciona perfectamente en un solo arduino, es decir, que este hace todo.
lo que yo quiero es hacer una comunicación ente los dos arduinos para que estos envíen y reciban información del proceso.

adjunto el código en el cual un arduino hace todo

#include <Servo.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <Keypad.h>

LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

int lcd_opcion  = 0;
int adc_chequear = 0;
int LitrosT;
int LitrosD;
int ledred = 18;
int ledyelow = 19;
int buzzer = 20;

Servo servo1;

#define btnRIGHT  0
#define TotalBotonReset 1 // UP button
#define DiarioBotonReset 2 // Down Button
#define btnNINGUNO   5
#define btnLEFT   3
#define btnSELECT 4



byte sensorInterrupt = 0;                //colocar 1 para q trabaje el pin 2
byte sensorPin = 2;


float Factor_calibracion = 6.20;

volatile byte PulsoCont;

float Caudal;

unsigned int FlujoMiliLitros;
unsigned long TotalMiliLitrosA;
unsigned long TotalMiliLitrosB; 
//unsigned long limiteTotal = 4000;
unsigned long limiteDiario = 3000;
unsigned long control = 0;
unsigned long alarma;


unsigned long Tiempo;
unsigned long limiteTotal;


long valor = 0;                              // first
double total = 0;
const byte filas = 4;                       // nº de filas
const byte columnas = 4;                    // nº de columnas
byte pinesFilas[filas]  =  {7, 6, 5, 4};    // orden filas f1, f2, f3, f4
byte pinesColumnas[columnas] = {14, 15, 16, 17};    // orden columnas c1, c2, c3 18, 19, 20, 21};
char teclas [filas] [columnas] = {
 
  {'1','2','3','A',},
  {'4','5','6','B',},
  {'7','8','9','C',},
  {'*','0','#','D',},
};

Keypad teclado = Keypad (makeKeymap(teclas),  pinesFilas, pinesColumnas, filas, columnas);


char tecla;
int numero;

void setup()
{    
  for(int i=14; i<=17;i++)
  {
   pinMode(i,INPUT); 
  }
  
  for(int A=18; A<=21;A++)
  {
   pinMode(A,OUTPUT); 
  }
       Serial.begin(9600);
    lcd.begin(16, 2);
  lcd.setCursor(4, 0);
  lcd.print("Daniela_04");
  delay(1000);
  lcd.clear();
  servo1.attach(3);
  pinMode(ledred, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(ledyelow, OUTPUT);
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);
  PulsoCont = 0;
  Caudal = 0.0;
  FlujoMiliLitros = 0;
  TotalMiliLitrosA = 0;
  TotalMiliLitrosB = 0;
  Tiempo = 0;
  alarma = 0;
  servo1.write(0);
  delay(50);
  attachInterrupt(sensorInterrupt, RPM, FALLING);
  
}


void loop()
{  
  tecla = teclado.getKey();
    if (tecla != NO_KEY)
    {
    switch(tecla)
      {
    case 'A':
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Cantidad:");
    lcd.setCursor(15,0);
    lcd.print("L");
    break;
    
    case '0'...'9':
    lcd.setCursor(11,0);
    valor = valor*10+(tecla - '0');
    lcd.print(valor);
    break;
    
    case 'C':
    valor = 0;
    total = 0;
    lcd.clear();
    break;
    

    case 'D':
    lcd.clear();
    valor = ( total != 0 ? total : valor);
    total = (valor/0.0010000)+1;
    
    limiteTotal = total;
    while(1){
    principal();
    }
   }
  }
 }// loop




void principal()
  {
    alarma = (limiteTotal/2);
    
    if((millis() - Tiempo) > 1000UL)
  {

    char buffer[20], str[6];
    detachInterrupt(sensorInterrupt);
   
    Caudal = ((1000.0 / (millis() - Tiempo)) * PulsoCont) / Factor_calibracion;
    
    Tiempo = millis();
    
    FlujoMiliLitros = (Caudal / 60) * 1000;
//    Serial.println(FlujoMiliLitros);
//    delay(10);
    
    TotalMiliLitrosA += FlujoMiliLitros;
    TotalMiliLitrosB += FlujoMiliLitros;
    
     unsigned int frac;
    
  lcd.setCursor(0,0);
      lcd.print("Fluj  Total  Diari");

    lcd.setCursor(0,1);
    sprintf(buffer, "%4s %4dL %4dL", dtostrf(Caudal, 4,2,str), TotalMiliLitrosA/1000); //1000U transformo float a string con 4 caracters y 2 decimales.
    lcd.print(buffer);
    Serial.println(buffer);
      PulsoCont = 0;
      attachInterrupt(sensorInterrupt, RPM, FALLING);
  }
}


void RPM() {
  PulsoCont++; 
}

La verdad les agradeseria mucho si me podrían ayudar con alguna idea de como hacer esto o en el mejor de los caso alguien que tenga un pequeño fragmento de código que yo pueda adecuar ya que me he etascado en este punto.

de antemano gracias..!!

No lo dices pero parece estar usando un MEGA?

Si usas un MEGA tienes 3 puertos Serie disponibles ademas del 0 que ahora usas para monitoreo.
Asi que simplemente intercambias RX y TX con el 2do arduino y compartes GND y tendras comunicación via Serial1 por ejemplo.

Cómo hacerlo, pues todo lo que quieras enviar al segundo Arduino saldra por print ejemplo

Serial1.print(Caudal); // enviará Caudal al 2do arduino

El segundo Arduino puede recibir datos por Serial0 o sea Serial a secas.

como con el clásico

if (Serial.available()>0) {
    char valor = Serial.read(); // esto lee un solo caracter 
}

asi que hay que trabajar las cosas del lado recepción.

hola surbyte, gracias por responderme.
Para ilustrarte un poco mas mi proyecto te comento que no estoy utilizando arduino Mega, solo dos arduinos UNO. Con respecto a lo que me comentaste estuve escribiendo y probando un poco algunas lineas tratando de resolver mi situación en base a o que dijiste pero lastimosamente aun no logro que funcione.

Estos son los dos códigos que llevo hasta el momento, espero si notas un error o mal planteamiento me puedas orientar para mejorarlo, cabe resaltar que son un bosquejo general de como creo debería ir pero no comprendo muchas coas sobre comunicación serial.

//TRANSMISOR
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Wire.h>


LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

#define btnRIGHT  0
#define TotalBotonReset 1 // UP button
#define DiarioBotonReset 2 // Down Button
#define btnNINGUNO   5
#define btnLEFT   3
#define btnSELECT 4


char tecla;
int numero;

unsigned long Tiempo;
unsigned long limiteTotal;
int conversion;

long valor = 0;                              // first
double total = 0;
const byte filas = 4;                       // nº de filas
const byte columnas = 4;                    // nº de columnas
byte pinesFilas[filas]  =  {7, 6, 5, 4};    // orden filas f1, f2, f3, f4
byte pinesColumnas[columnas] = {14, 15, 16, 17};    // orden columnas c1, c2, c3 18, 19, 20, 21};
char teclas [filas] [columnas] = {
 
  {'1','2','3','A',},
  {'4','5','6','B',},
  {'7','8','9','C',},
  {'*','0','#','D',},
};

Keypad teclado = Keypad (makeKeymap(teclas),  pinesFilas, pinesColumnas, filas, columnas);




void setup()
{    
  for(int i=14; i<=17;i++)
  {
   pinMode(i,INPUT); 
  }
  
  for(int A=18; A<=21;A++)
  {
   pinMode(A,OUTPUT); 
  }
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(4, 0);
  lcd.print("Daniela_04");
  delay(1000);
  lcd.clear();

}



void loop() 
{
 tecla = teclado.getKey();
    if (tecla != NO_KEY)
    {
    switch(tecla)
      {
    case 'A':
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Cantidad:");
    lcd.setCursor(15,0);
    lcd.print("L");
    break;
    
    case '0'...'9':
    lcd.setCursor(11,0);
    valor = valor*10+(tecla - '0');
    lcd.print(valor);
    break;
    
    case 'C':
    valor = 0;
    total = 0;
    lcd.clear();
    break;
    

    case 'D':
    lcd.clear();
    valor = ( total != 0 ? total : valor);
    total = (valor/0.0010000)+1;
    
    limiteTotal = total;
    while(1){
    principal();
    }
   }
  }

}




void principal()
  {
    //transmision de valor a procesar en el arduino2   
  conversion = (int)limiteTotal;

   if((millis() - Tiempo) > 1000UL)
   {
      
    Serial.print(conversion);
    Tiempo = millis();
  }

  //recepcion de datos

   if(Serial.available()>0)
  {
    int datos = Serial.read();

    if(datos == 'A'){

      //encender alguna alarma

    }


  if(datos == 'A'){
  //  mostrar mensaje en lcd

  }
    
  }

  
  }//loop
//RECEPTOR
#include <Wire.h>
#include <Servo.h>


int lcd_opcion  = 0;
int adc_chequear = 0;
int LitrosT;
int LitrosD;
int ledred = 18;
int ledyelow = 19;
int buzzer = 20;


Servo servo1;

#define btnRIGHT  0
#define TotalBotonReset 1 // UP button
#define DiarioBotonReset 2 // Down Button
#define btnNINGUNO   5
#define btnLEFT   3
#define btnSELECT 4



byte sensorInterrupt = 0;                //colocar 1 para q trabaje el pin 2
byte sensorPin = 2;


float Factor_calibracion = 6.20;

volatile byte PulsoCont;

float Caudal;

unsigned int FlujoMiliLitros;
unsigned long TotalMiliLitrosA;
unsigned long TotalMiliLitrosB; 
//unsigned long limiteTotal = 4000;
unsigned long limiteDiario = 3000;
unsigned long control = 0;
unsigned long alarma;


unsigned long Tiempo;
unsigned long limiteTotal;


void setup() {
for(int A=18; A<=21;A++)
  {
   pinMode(A,OUTPUT); 
  }
  Serial.begin(9600);
  servo1.attach(3);
  pinMode(ledred, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(ledyelow, OUTPUT);
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  PulsoCont = 0;
  Caudal = 0.0;
  FlujoMiliLitros = 0;
  TotalMiliLitrosA = 0;
  TotalMiliLitrosB = 0;
  Tiempo = 0;
  alarma = 0;
  servo1.write(0);
  delay(50);
  attachInterrupt(sensorInterrupt, RPM, FALLING);      

}



void loop() {

 //recepcion de datos
 while(Serial.available()>0);{
delay(10);

int datos = Serial.read();


datos = limiteTotal;

alarma = (limiteTotal/2);
    
    if((millis() - Tiempo) > 1000UL)
  {

    char buffer[20], str[6];
    detachInterrupt(sensorInterrupt);
   
    Caudal = ((1000.0 / (millis() - Tiempo)) * PulsoCont) / Factor_calibracion;
    
    Tiempo = millis();
    
    FlujoMiliLitros = (Caudal / 60) * 1000;
//    Serial.println(FlujoMiliLitros);
//    delay(10);
    
    TotalMiliLitrosA += FlujoMiliLitros;
    TotalMiliLitrosB += FlujoMiliLitros;
 }



    // transmision de datos

    if((millis() - Tiempo) > 500){//if 1

       if((TotalMiliLitrosA >= alarma)  // && (TotalMiliLitrosA <= alarma +1000))
    {
     digitalWrite(led, HIGH);
     Serial.print("Sr. usuario usted ha consumido la mitad de Litros establecidos"); 
     delay(100);
    }


    
    if (TotalMiliLitrosA >= limiteTotal) {
      lcd.clear();
      servo1.write(90);
      delay(800);
     while(1){
    LitrosT = (limiteTotal/1000.0);
    lcd.print("Cantidad:");
    lcd.setCursor(10,0); 
    lcd.print(LitrosT);
    lcd.setCursor(13,0);
    lcd.print("L");
    lcd.setCursor(0,1);
    lcd.print("Estado:>AGOTADO<");
    Serial.println("Sr. usuario >> usted ha consumido los L de agua establecidos");
    Serial.println("     ");
    delay(1000);
    }
    }
     }//if 1
   

    

     unsigned int frac;

     Serial.print("Fluj  Total  Diari");
    sprintf(buffer, "%4s %4dL %4dL", dtostrf(Caudal, 4,2,str), TotalMiliLitrosA/1000); //1000U transformo float a string con 4 caracters y 2 decimales.

    Serial.println(buffer);
      PulsoCont = 0;
      attachInterrupt(sensorInterrupt, RPM, FALLING);

     
 
 }//loop
 

void RPM() {
  PulsoCont++; 
}

Quedo atenta, gracias por tu tiempo

PD: he intentado responder dos veces pero no se como funciona este foro, no es muy intuitivo y las respuestas que escribo no aparecen en la publicación.

Esto debería ser asi

case 'D':
                lcd.clear();
                valor = ( total != 0 ? total : valor);
                total = (valor/0.0010000)+1;
                
                limiteTotal = total;
                while (1) {  // <= esto no termina nunca. Se queda clavado aca!!
                    principal();
                }
                break;

Pero ese while(1) hace que principal() se ejecute de por vida.
Cuando pulses D se acaba el mundo.

RECEPTOR
Esto no se que es

while(Serial.available()>0);{

Lo que haga nunca cambia lo que sigue asi que tu solo leeras un caracter porque si envias varios caracteres el ; al final de while(Serial.available()>0) no te permite seguir procesando otros caracteres.

Retira el ;

Además tienes esto

while(1) {
                LitrosT = (limiteTotal/1000.0);
                lcd.print("Cantidad:");
                lcd.setCursor(10,0); 
                lcd.print(LitrosT);
                lcd.setCursor(13,0);
                lcd.print("L");
                lcd.setCursor(0,1);
                lcd.print("Estado:>AGOTADO<");
                Serial.println("Sr. usuario >> usted ha consumido los L de agua establecidos");
                Serial.println("     ");
                delay(1000);
            }

Otra vez usas un while(1) que detiene todo. o Repite todo.

hola surbyte, tarde un poco en responderte por el trabajo. En consecuencia a lo que mencionaste corregí algunas cosas pero me he encontrado con algo que me tiene pensando en pasar a comprar y utilizar arduino leonardo y es el hecho de por un lado querer transmitir los datos del sensor ubicado en el arduino2 al arduino1 y a la vez querer imprimirlos por el puerto serial, como el leonardo tiene Serial y Serial1 creo que es la mejor opción $$.

Replantee la lógica del programa pero me encuentro con unos vacíos en cuanto a mandar Arrays de información y ese tipos de cosas que requiero para transmitir la medida tomada por el sensor ubicado en el arduino2 via serial y mostrarla en la lcd ubicada en el arduino1.

//transmisor
#include <Keypad.h>
#include <LiquidCrystal.h>
#include <Wire.h>


LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

#define btnRIGHT  0
#define TotalBotonReset 1 // UP button
#define DiarioBotonReset 2 // Down Button
#define btnNINGUNO   5
#define btnLEFT   3
#define btnSELECT 4


char tecla;
int numero;
char caracter;
String cadena;

unsigned long Tiempo;
unsigned long limiteTotal;
int conversion;

long valor = 0;                              // first
double total = 0;
const byte filas = 4;                       // nº de filas
const byte columnas = 4;                    // nº de columnas
byte pinesFilas[filas]  =  {7, 6, 5, 4};    // orden filas f1, f2, f3, f4
byte pinesColumnas[columnas] = {14, 15, 16, 17};    // orden columnas c1, c2, c3 18, 19, 20, 21};
char teclas [filas] [columnas] = {
 
  {'1','2','3','A',},
  {'4','5','6','B',},
  {'7','8','9','C',},
  {'*','0','#','D',},
};

Keypad teclado = Keypad (makeKeymap(teclas),  pinesFilas, pinesColumnas, filas, columnas);




void setup()
{    
  for(int i=14; i<=17;i++)
  {
   pinMode(i,INPUT); 
  }
  
  
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.setCursor(4, 0);
  lcd.print("Daniela_04");
  delay(1000);
  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("Definir Litros");

}



void loop() 
{
 tecla = teclado.getKey();
    if (tecla != NO_KEY)
    {
    switch(tecla)
      {
    case 'A':
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Cantidad:");
    lcd.setCursor(15,0);
    lcd.print("L");
    break;
    
    case '0'...'9':
    lcd.setCursor(11,0);
    valor = valor*10+(tecla - '0');
    lcd.print(valor);
    break;
    
    case 'C':
    valor = 0;
    total = 0;
    lcd.clear();
    break;
    

    case 'D':
    lcd.clear();
    valor = ( total != 0 ? total : valor);
    total = (valor/0.0010000)+1;
    
    limiteTotal = total;
    while(1){
    principal();
    }
  break;
    
   }
  }
 }




void principal()
  {
    //transmision de valor a procesar en el arduino2   
  conversion = (int)limiteTotal;

   if((millis() - Tiempo) > 1000UL)
   {
      
    Serial.print(conversion);
    Tiempo = millis();
  }


  //recepcion de datos

  if(Serial.available()>0)
 {
  delay(10); 
  lcd.clear();
  
  while(Serial.available()>0)
  {
   caracter = Serial.read();
   cadena += caracter; 
  }

  lcd.setCursor(0,1);
  lcd.print(cadena);
  caracter = '\0';
  cadena = "\0";


  if (//comparar si la informacion de litros que llega es igual a la establecida)
  {   //pero no veo como comprar ya que no llega un valor unico para comparar sino varios datos
      lcd.clear();
     while(1)   // detengo el proceso con este while y se quede ahí hasta que reinicie todo
    lcd.setCursor(0,1);
    lcd.print("Estado:>AGOTADO<");
    Serial.println("Sr. usuario >> usted ha consumido los L de agua establecidos");
    Serial.println("     ");
    delay(1000);

  
  }//loop
//receptor
#include <Wire.h>
#include <Servo.h>


int lcd_opcion  = 0;
int adc_chequear = 0;
int LitrosT;
int LitrosD;
int ledred = 9;
int ledyelow = 8;
int buzzer = 7;
int motobomba = 5;


Servo servo1;

#define btnRIGHT  0
#define TotalBotonReset 1 // UP button
#define DiarioBotonReset 2 // Down Button
#define btnNINGUNO   5
#define btnLEFT   3
#define btnSELECT 4



byte sensorInterrupt = 0;                //colocar 1 para q trabaje el pin 2
byte sensorPin = 2;


float Factor_calibracion = 6.20;

volatile byte PulsoCont;

float Caudal;

unsigned int FlujoMiliLitros;
unsigned long TotalMiliLitrosA;
unsigned long TotalMiliLitrosB; 
//unsigned long limiteTotal = 4000;
unsigned long limiteDiario = 3000;
unsigned long control = 0;
unsigned long alarma;



unsigned long Tiempo;
unsigned long limiteTotal;


void setup() {

  Serial.begin(9600);
  servo1.attach(3);
  pinMode(ledred, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(ledyelow, OUTPUT);
  pinMode(motobomba, OUTPUT);
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  PulsoCont = 0;
  Caudal = 0.0;
  FlujoMiliLitros = 0;
  TotalMiliLitrosA = 0;
  TotalMiliLitrosB = 0;
  Tiempo = 0;
  alarma = 0;
  servo1.write(0);
  delay(50);
  attachInterrupt(sensorInterrupt, RPM, FALLING);      

}



void loop() {

 //recepcion de datos
 while(Serial.available()>0){
delay(10);

int datos = Serial.read();


datos = limiteTotal;

alarma = (limiteTotal/2);
    
    if((millis() - Tiempo) > 1000UL)
  {

    char buffer[20], str[6];
    detachInterrupt(sensorInterrupt);
   
    Caudal = ((1000.0 / (millis() - Tiempo)) * PulsoCont) / Factor_calibracion;
    
    Tiempo = millis();
    
    FlujoMiliLitros = (Caudal / 60) * 1000;

    TotalMiliLitrosA += FlujoMiliLitros;
    TotalMiliLitrosB += FlujoMiliLitros;

     unsigned int frac;
 }



    // transmision de datos

    if((millis() - Tiempo) > 500){//if 1

    Serial.print("Fluj  Total  Diari");
    sprintf(buffer, "%4s %4dL %4dL", dtostrf(Caudal, 4,2,str), TotalMiliLitrosA/1000); //1000U transformo float a string con 4 caracters y 2 decimales.

    Serial.println(buffer);
    delay(10);
    PulsoCont = 0;
    attachInterrupt(sensorInterrupt, RPM, FALLING);
 
       
    }  //if 1     
       
       
       
       
       
       if((TotalMiliLitrosA >= alarma) 
    {
   // activar leds de Alerta
    }


    
    if (TotalMiliLitrosA >= limiteTotal) {
      servo1.write(90);
      delay(800);
  
  // Apagar motobomba
  // encender leds de alerta

    } 
 }
   
}//loop
 

void RPM() {
  PulsoCont++; 
}

Hasta ahora esto es lo que intente armar pero como no tengo tanto manejo sobre comunicación serial dejo algunos espacios comentados con la intención de que si ves que estas bien me puedas orientar de como hacerlo.

Gracias surbyte..!!

Bueno para trabajar en esta etapa creo que debes dejar un arduino como esta ahora supongo que con 0 y 1 como pines y el otro podrias usar SoftwareSerial definiciendo dos pines, de ese modo tendrias el monitor serie para informarte de lo que ocurre.
Durante la fase de pruebas usas SoftwareSerial en uno de los Arduinos y luego usas el puerto disponible y queda como versión definitiva.

Lo que dices de los dos puertos del Leonardo es cierto pero me parece algo grande para lo que necesitas.
Un simple NANO o un MINI PRO te sirven perfectamente.
No hace falta una placa estilo UNO para esto.

Pero es mi visión de lo que haces. Yo lo que tu haces lo hago con NANOs y módulos nRF24. Asi que ahora te crearé mas dudas.. jajaja

hola surbyte...
Entiendo lo que mencionas acerca de utilizar la librería SoftwareSerial pero creo que el principal inconveniente que tengo es como la estructura apropiada para enviar y recibir información.
Aun sigo experimentado con alunas lineas para que me funcione en la forma en que quiero pero todavía no lo consigo.

bueno respecto a los módulos nrf24 que mencionaste mmm... bueno la verdad no te voy a negar que me llamo mucho la atención después de investigar un poco sobre ellos, pero creo que seria comenzar prácticamente desde cero nuevamente ya que jamas los he utilizado a menos de que como mencionaste tengas algún sketch que me puedas facilitar para guiarme o por lo menos tener un punto de partida en base a lo que es enviar un dato y recibir información sobre el proceso.

Quedo atenta a tu respuesta, Gracias..!

Vamos a hacer un STOP en tu proyecto para que pueda seguirte porque me puse a mirar el código con mayor detenimiento y veo varias cosas que no me cierran del todo.

Preguntas

  1. Mides correctamente el caudal en el Arduino 2 A2(desde ahora lo llamaré asi)?
  2. para que usas un servo en A2?
  3. Tienes estos dispositivos conectodos a A2
int motobomba = 5;
int buzzer        = 7;
  1. El caudalímetro esta conectado a 0 pero tu comentario dice qu elo pongas en 2.. no entiendo para que haces eso.
byte sensorInterrupt = 0;                //colocar 1 para q trabaje el pin 2

O lo pones en 2 que tiene sentido o lo pones en 0 que no lo tiene.

  1. A1 tiene un teclado, LCD, y se conecta a A2 via Serial. Veo que solo usas Serial en A1 y A2 o sea que no ves nada como te mencioné en el post anterior.

Eso es un error cuando no se esta programando algo de lo que no se está seguro. Siempre aprovecha SoftwareSerial si no tienes PORT físico extra o bien como tu elegiste el LEONARDO por tener 2 seriales ahi si podrás usar Serial1. Pero el monitoreo de lo que ocurre es importantísimo.

A ver que me respondes para darte una lavada de cara al códigio.

Ok... de antemano muchas gracias por sacar un tiempito para ayudarme.

respuestas:

  1. No mido caudal en A2, he armado y desarmado el código y este me presenta error al compilar diciéndome que no he declarado "buffer".

  2. utilizo un servo en A2 para abrir y cerrar la válvula mariposa(se que es mas fácil con una electrovalvula) pero con el servo puedo cerrar a la mitad, cerrar proporcionalmente etc.

3.en realidad envío una señal a través del pin 5 y 7 que llega a una tarjeta relay que diseñe que me activa la motobomba y el buzer de 12v.

4.para hacer un llamado a las interrupciones en arduino la estructura es:
attachInterrupt(1(para trabajar la interrupción por el pin 2, RPM(llamar la funcion), FALLING(para cuando el pin pase de HIHG a LOW)); entonces para hacerlo un poco mas estético yo definí byte sensorInterrupt = 0; que debe ser igual a 1(me equivoque ahí disculpa, debe ser el producto de cambiar el código varias veces.

  1. tienes toda la razón, es como conducir a ciegas por eso prestando atención a lo que mencionaste sobre trabajar con softwareSerial he comenzado a leer como es el manejo de esta librería he ir cogiendo un poco de cancha con ella.

Por favor cualquier duda que tengas respecto al código no dudes en consultarme, con gusto responderé en cuanto pueda Gracias.

Bien te hice esas consultas para ver como ubicarme en tu trabajo y como encararlo.
Yo voy a reescribir mi versión usando SoftwareSerial asi que A1 se va a comunicar con A2 usando SoftwareSerial y A2 como esta.
Con A1 podras ver todos los msg de ida/vuelta.

Asi que veo como modificar las cosas y cuando lo tenga lo posteo.

Hola surbyte, me parece bien lo que planteas. Estaré pendiente a tu post para implementarlo de igual forma seguiré investigando para estar un poco mas dateada frente a lo que habías mencionado.