Problema con la suma de variables obtenidas de puestos serial

Hola, os comento, mi proyecto consiste en un arduino mega con una pantalla lcd en la que deseo ver un contador de semillas, los datos los recibe por los puertos serial1 y serial 2 de dos arduino nano que a su vez procesan y emiten el conteo. (Realizo este sistema porque ambos sensores están contando simultáneamente). El problema que tengo es que deseo visualizar la suma de los dos conteos (num1 y num2), pero no me funciona (funcion sumadatos). En este código tengo primero la recepción 1, que almacena los datos en un buffer y luego la cadena de datos que recibo a int. Esto sí se me muestra bien en la pantalla, luego la recepción 2 idéntica a la 1, que también me lo muestra (ambas las estoy mostrando en la pantalla para las comprobaciones. pero no soy capaz de sumar. ¿Alguna idea? Muchas gracias.
*tengo definidos los botones de la pantalla LCD aunque todavía no les estoy dando uso, mi intención es hacer una serie de menús.

//////////LCD//////////
#include <LiquidCrystal.h>  // Incluye la Libreria LiquidCrystal
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);  // Crea un Objeto LC. Parametros: (rs, enable, d4, d5, d6, d7)
  //VARIABLES BOTONES LCD
  int lcd_key     = 0;
  int adc_key_in  = 0;
  #define btnRIGHT  0
  #define btnUP     1
  #define btnDOWN   2
  #define btnLEFT   3
  #define btnSELECT 4
  #define btnNONE   5
  int read_LCD_buttons()  
  { adc_key_in = analogRead(0);      // Leemos A0
    // Mis botones dan:  0, 145, 329,507,743
    // Y ahora los comparamos con un margen comodo
    if (adc_key_in > 900) return btnNONE;     // Ningun boton pulsado 
    if (adc_key_in < 50)   return btnRIGHT; 
    if (adc_key_in < 250)  return btnUP;
    if (adc_key_in < 450)  return btnDOWN;
    if (adc_key_in < 650)  return btnLEFT;
    if (adc_key_in < 850)  return btnSELECT; 
    return btnNONE;  // Por si todo falla
  }
  //FIN VARIABLES BOTONES LCD
//////////FIN VARIABLES LCD//////////

//////////VARIABLES SERIAL//////////
long contadorglobal; // Contador que guardará la suma de las lecturas de todos los sensores
String bufferString1 = ""; //buffer donde se almacenan los números recibidos del cajón 1
String bufferString2 = ""; //buffer donde se almacenan los números recibidos del cajón 2
long num1; //contador sensor 1
long num2; //contador sensor 2
//////////FIN VARIABLES SERIAL//////////


void setup()
{  
  lcd.begin(16,2);  // Inicializa la pantalla LCD, y determina sus dimensiones (ancho y alto) 
  lcd.setCursor(0,0); //Fijamos la posición del texto
  lcd.print("SIEMBRAPC V0.5"); // Imprime "la versión actual del software" sobre el LCD  
  delay(1000);   
  lcd.setCursor(0,1); // Fimajos la posición del texto
  lcd.print("Carlos Pozuelo");
  delay(1000);
  lcd.clear();  // Limpia la pantalla
  delay(300);  
  lcd.setCursor(0,0);  // fijamos la posición del texto             
  lcd.print("SEMILLAS:");  

  //TRANSMISIÓN
  Serial.begin(115200); //Iniciamos puerto serial
  delay(1000);
  Serial1.begin(115200); //Iniciamos puerto serial1
  delay(1000);
  Serial2.begin(115200); //Iniciamos puerto serial2
  delay(1000);
}

void loop()
{
recepcion1();
recepcion2();
sumadatos();            
}

//////////RECEPCIÓN DE DATOS//////////
/////recepción 1
void recepcion1(){
  if(Serial1.available()>0){
    delay(22);
    String bufferString1 = "";  // Variable que servirá como buffer  
  while (Serial1.available()>0){ 
    bufferString1 += (char)Serial1.read();  
   }
   //se transforma el buffer a un numero entero:
   long num1 = bufferString1.toInt(); 
   //Se imprime el contenido del buffer
   //Serial.println(num1);
 lcd.setCursor(0,1);  // Ubicamos el cursor en la posicion 12 sobre la linea 1
lcd.print(num1);  // Imprimimos el valor del contenido sobre dicha ubicacion  
  }

}
/////recepción 2
void recepcion2(){
  if(Serial2.available()>0){
    delay(22);
    String bufferString2 = "";   //Variable que servirá como buffer
   while (Serial2.available()>0){ 
    bufferString2 += (char)Serial2.read();  
   }
   //se transforma el buffer a un numero entero:
   long num2 = bufferString2.toInt(); 
  
   //Se imprime el contenido del buffer
 lcd.setCursor(4,1);  // Ubicamos el cursor en la posicion 12 sobre la linea 1
lcd.print(num2);  // Imprimimos el valor del contenido sobre dicha ubicacion 
  }  
}

//////////FUNCION SUMA DATOS TOTAL//////////
void sumadatos(){
 long contadorglobal = num1 + num2; //Sumamos las dos cantidades obtenidas por puestos serial 1 y 2 y las almancenamos en contadorglobal
  Serial.println(contadorglobal); // Imprimimos el valor de contador global en el monitor
  lcd.setCursor(10,1);  
  lcd.print(contadorglobal);  // Imprimimos el valor de contador global en la pantalla lcd
}

El poblema es que en las dos rutinas en las que lees los datos de Serial1 y Serial2 creas variables locales con los mismos nombres de las variables globales num1 y num2 y por lo tanto borras los datos.
elimina en ambos casos long num1 por solo num1 = y funcionará.

Te dejo una para que quede claro como debe ser

void recepcion1(){
  if (Serial1.available()>0){
      delay(22);
      String bufferString1 = "";  // Variable que servirá como buffer  
      while (Serial1.available()>0) {
            bufferString1 += (char)Serial1.read();  
      }
      //se transforma el buffer a un numero entero:
      num1 = bufferString1.toInt();  // al no crear la variable local el dato se carga en la gloabal.
      //Se imprime el contenido del buffer
      //Serial.println(num1);
      lcd.setCursor(0,1);  // Ubicamos el cursor en la posicion 12 sobre la linea 1
      lcd.print(num1);  // Imprimimos el valor del contenido sobre dicha ubicacion  
  }
}

¡Muchísimas gracias! Funciona a la perfección. Es que soy bastante principiante...

Bueno pero ya aprendiste que las variables locales con el mismo nombre tapan a las globales, asi que ese error no lo cometerás en el futuro y si te pasa ya recordarás esta experiencia.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.