Go Down

Topic: [SOLUCIONADO]Problemas para recepcion de datos de arduino a arduino (Read 207 times) previous topic - next topic

jorgetesla

Buenas tardes, tengo un proyecto en el cual tengo que generar una cadena de datos que adquiero de unos sensores, a partir de esos valores yo genero uno cadena para transmitirla a otro arduino que en este caso seria mi MAESTRO, el problema es que los manda bien pero no los recibe bien, en ciertas ocaciones si recibe toda la cadena completa pero la mayor parte del tiempo no, la verdad estoy un poco nuevo en el tema de arreglos para recibir cadenas y luego separarlas, a continuación les pasare los dos programas el transmisor y el de recepción ,


ARDUINO QUE TRANSMITE LA CADENA
}
en la función que se llama IMPRESION() es donde genero mi cadena para ser
transmitida
Code: [Select]

#include <DallasTemperature.h>
#include <TimerOne.h>
//ESCLAVO SAM//
//DANDO DE ALTA LIBRERIAS//
#define UNIDAD 101
#include <OneWire.h>
#include <Wire.h>

const int led = 13;  // the pin with a LED
//dando de alta se;ales analogicas//
  const byte REFERENCE_3V3 = A3;
  const byte BATT = A2;
  String Marca = "@";
  String Marca1= "#";
//Declaracion de pines analogicos para la lectura de los sensores de conductividad//
  int CE1= A8;
  int CE2= A9;
  int CE3= A10;
//Entradas digitales para declarar o energizar los sensores de conductividad//
  int pin_CE1=25;
  int pin_CE2=26;
  int pin_CE3=27;
//limites para los sensores de humedad//
  int lsce1=400;
  int lice1=250;
//DAMOS DE ALTA VARIABLES//
  float nivel_bateria=11.8;
  int valor_ce1;
  int valor_ce2;
  int valor_ce3;
  float valor_tmp1=0;
  float valor_tmp2=0;
  float valor_tmp3=0;
  //VARIABLES PARA GENERAR CADENA//
  String cadena_TX="";
  int  datos_TX[7];
//TEMPERATURA DEL SUELO//
  #define ONE_WIRE_BUS_1 22
  #define ONE_WIRE_BUS_2 23
  #define ONE_WIRE_BUS_3 24
    
  OneWire temp_suelo1(ONE_WIRE_BUS_1);
  OneWire temp_suelo2(ONE_WIRE_BUS_2);
  OneWire temp_suelo3(ONE_WIRE_BUS_3);

DallasTemperature sensor_temp1(&temp_suelo1);
DallasTemperature sensor_temp2(&temp_suelo2);
DallasTemperature sensor_temp3(&temp_suelo3);

float temperature = 0;
//DECLARACION DE VARIABLES DE TIMEPO NIVEL PROTOTIPO//
//****************************************************
//VARIABLES A PRUEBA PARA CALCULAR EL TIEMPO //

int reloj = 0;
int reloj1=0;
int orden=1;
//****************************************************//





void setup()
{
  Timer1.initialize(600000);
  Timer1.attachInterrupt(prendeled);
  Serial.begin(9600);
  sensor_temp1.begin();
  sensor_temp2.begin();
  sensor_temp3.begin();
  
  //Declaracion de los pines , Estados de los sensores de conductividad//
  pinMode(pin_CE1, OUTPUT);
  pinMode(pin_CE2, OUTPUT);
  pinMode(pin_CE3, OUTPUT);
  pinMode(led, OUTPUT);
}
volatile unsigned long contador_ciclos = 0;
volatile unsigned long contador_ciclos_minutos=0;
int ledstate= LOW;
int CE1state= LOW;
int CE2state= LOW;
int CE3state= LOW;

void prendeled(void)
{

contador_ciclos=contador_ciclos + 1;
if (contador_ciclos==60)
{
  contador_ciclos=0;
  contador_ciclos_minutos=contador_ciclos_minutos + 1;//EN TEORIA CUANDO SE CUENTE UN SEGUNDO , SE MANDARA LA VARIABLE A CERO Y SE AUMENTARA LA VARIABLE DE MINUTOS//
  if (contador_ciclos_minutos==1)//SE ORDENARA QUE HACER CADA 15 MINUTOS//
  {
    if (CE1state==LOW && CE2state==LOW && CE3state==LOW) //lE MANDAMOS A DECIR QUE SI ESTAN APAGADOS ENTONCES LOS PRENDA//
    {
      CE1state=HIGH;
      CE2state=HIGH;
      CE3state=HIGH;
    }
  
  }
  if (contador_ciclos_minutos==17) //DOS MINUTOS DESPUES DESPUES DE SENSAR SE APAGA LOS SENSORES//
  {
    CE1state=LOW;
    CE2state=LOW;
    CE3state=LOW;
  }
}
if (ledstate == LOW)
{
  ledstate=HIGH;
}
else
{
  ledstate=LOW;
}

      
       digitalWrite(led,ledstate);
       digitalWrite(pin_CE1,CE1state);
       digitalWrite(pin_CE2,CE2state);

  
}


void loop()
{
 noInterrupts();
 
 interrupts();
  
//MANDAMOS A LLAMAR ESTA FUNCION PARA CALCULAR CONDUCTIVDAD ELECTRICA//
sensores_ce();  
//MANDAMOS A LLAMAR LA FUNCION DE NIVEL DE BATERIA//
nivel_bateria = adquirir_bateria();
//IMPRIMIMOS LOS DATOS//
Impresion();
temperatura_suelo();
  Serial.println(cadena_TX);
  delay(200);
}
//FUNCION PARA MEDIR CONDUCTIVIDAD ELECTRICA//
void sensores_ce()
  {
    valor_ce1=analogRead(CE1);
    valor_ce2=analogRead(CE2);
    valor_ce3=analogRead(CE3);
  
  }
//FIN DEL PROCESO CONDUCTIVIDAD ELECTRICA//

float adquirir_bateria()
{
 float operatingVoltage = analogRead(REFERENCE_3V3);
 float rawVoltage = analogRead(BATT);
 operatingVoltage = 3.30 / operatingVoltage; //The reference voltage is 3.3V
 rawVoltage = operatingVoltage * rawVoltage; //Convert the 0 to 1023 int to actual voltage on BATT pin
 rawVoltage *= 4.90; //(3.9k+1k)/1k - multiple BATT voltage by the voltage divider to get actual system voltage
 return(rawVoltage);
}
//MANDAMOS A TRANSMITIR LA CADENA //
 void Impresion()
 {
  char tam;

  
  datos_TX[0]=valor_tmp1;
  datos_TX[1]=valor_tmp2;
  datos_TX[2]=valor_tmp3;
  datos_TX[3]=valor_ce1;
  datos_TX[4]=valor_ce2;
  datos_TX[5]=valor_ce3;
  datos_TX[6]=nivel_bateria;
  


   cadena_TX="";
  
  for(int i=0;i<(sizeof(datos_TX)/2);i++)
  {
    cadena_TX=cadena_TX+datos_TX[i];
    if(i<(sizeof(datos_TX)/2)-1)
    cadena_TX=cadena_TX+"/";
  }

  //tam=char(cadena_TX.length());
  cadena_TX=String(cadena_TX);
  cadena_TX=Marca+cadena_TX+Marca1;
  
  



  
 }

 //INICIO DE LA FUNCION
 void temperatura_suelo(void)
{
      sensor_temp1.requestTemperatures();
      sensor_temp2.requestTemperatures();
      sensor_temp3.requestTemperatures();
      valor_tmp1=sensor_temp1.getTempCByIndex(0);
      valor_tmp2=sensor_temp2.getTempCByIndex(0);
      valor_tmp3=sensor_temp3.getTempCByIndex(0);
      delay(200);
}



esta cadena es la quetransmite

http://s10.postimg.org/gi8mjmprd/foto_de_la_transmision.png





A continuacion esta el codigo del receptor  Y ES DONDE TENGO EL PROBLEMA
es el siguiente codigo
Code: [Select]

#define UNIDAD 101
#include <SoftwareSerial.h> //Needed for GPS
static const int RXPin = 5, TXPin = 4;
SoftwareSerial ss(RXPin, TXPin);

  int valor_tmp1=0;
  int valor_tmp2=0;
  int valor_tmp3=0;
  int valor_ce1=0;
  int valor_ce2=0;
  int valor_ce3=0;
  int nivel_bateria=0;
//Definimos la marca de cabecera de nuestra cadena de transmision
char Marca = '@';

//Generamos la cadena de transmision de datos
String cadena_TX = "";
String cadRX;
//Generamos un arreglo de datos de transmision
long int datos_RX[7];



void setup()
{
  Serial.begin(9600);
  ss.begin(9600);
  //Serial1.begin(9600);

}
void loop()
{


  if (ss.available() > 0)
  {
    paquete_RX();
  }
  }
void paquete_RX()
{
  Serial.print(datos_RX[0]);
Serial.print("/");
Serial.print(datos_RX[1]);
Serial.print("/");
Serial.print(datos_RX[2]);
Serial.print("/");
Serial.print(datos_RX[3]);
Serial.print("/");
Serial.print(datos_RX[4]);
Serial.print("/");
Serial.print(datos_RX[5]);
Serial.print("/");
Serial.print(datos_RX[6]);
Serial.println();
delay(200);
  int tamanio;
  char buff[35];
  char tam;
  cadRX = "";
  if (ss.read() == 64)
  {
    tamanio = ss.read();
    //m=char(tamanio.length());
    ss.readBytes(buff, tamanio);
    for (int c = 0; c < tamanio;c++)
    {
      cadRX = cadRX + buff[c];
    
    }

  }
  Split();
}
void Split()
{
  String valor = "";
int posini = 0;
int posfin = 0;
  int i=0;

  do
  {
    posfin = cadRX.indexOf("/", posini);
    valor = cadRX.substring(posini, posfin);
    posini = posfin+1;
    datos_RX[i] = valor.toInt();
     i++;
    
  }
  while (posfin >= 0);
  
  

}//Fin de Split()



en la funcion paquete_RX(), se recibe la cadena y en la function split() es donde separa la cadena que creo que es donde esta el problema pero no logro repararlo porfavor ocupo ayuda esto es el patron que genera
esta es la cadena que recibo se podran dar cuenta que me come datos porfavo alguien ayudeme ;(


http://s21.postimg.org/w7xb9fgmf/foto_RX.png


Lucario448

Me deja en duda este fragmento de código de paqueteRX:

Code: [Select]
if (ss.read() == 64)
  {
    tamanio = ss.read();

Según tu formato, el primer read devuelve '@', pero entonces tamanio = '-'?
Seguro que tamanio siempre es igual a '-'? (45)

Lucario448

#2
Sep 23, 2016, 06:57 pm Last Edit: Sep 23, 2016, 06:58 pm by Lucario448
Yo creo que el "tamanio" se debería de definir así:

Code: [Select]
char buff[65];
buffer[ss.readBytesUntil('#', buff, sizeof(buff))] = 0;
// Ahora el caracter '#' ya no estará en la lectura.

tamanio = strlen(buff);

jorgetesla

lucario pero en que parte de mi codigo lo pondria que tendrai que reemplazar

Lucario448

Después de "if (ss.read() == 64)",
y antes de "for (int c = 0; c < tamanio;c++)"
Reemplaza todo lo que hay entre esas líneas.

No vuelvas a declarar buff, solo cámbiale el tamaño a 65.

jorgetesla

tengo que declarar el buffer ocomo esta ese tema
porque me aparece esto mira

exit status 1
'buffer' was not declared in this scope

jorgetesla

amigo lucario solo secedio una peque;a diferencia, ahora si el primer valor si me da -127, pero me sigue arrojando valores en 0 y luego otra vez la cadena completa

Lucario448

A como está tu código, es normal que la primera vez todo arroje cero. Cambia la función paqueteRX de esta manera:

Code: [Select]
void paquete_RX()
{
  
  if (ss.read() == 64)
  {
 cadRX = "";
 char buff[65];
 buff[ss.readBytesUntil('#', buff, sizeof(buff))] = 0;
 // Ahora el caracter '#' ya no estará en la lectura.

 cadRX = buff; // Se puede así, en vez de introducir caracter por caracter.
  }
  Split();
  
  Serial.print(datos_RX[0]);
  Serial.print("/");
  Serial.print(datos_RX[1]);
  Serial.print("/");
  Serial.print(datos_RX[2]);
  Serial.print("/");
  Serial.print(datos_RX[3]);
  Serial.print("/");
  Serial.print(datos_RX[4]);
  Serial.print("/");
  Serial.print(datos_RX[5]);
  Serial.print("/");
  Serial.print(datos_RX[6]);
  Serial.println();
  delay(200);
}

jorgetesla

lucario muchas gracias men la verdad que me haz ayudado demasiado , pero mira los intervalos que tiene ahora mi impression cada 3 cadenas el priemr valor lo toma Cero observa
 y eso es con la function paquetes RX cambiada

Lucario448

Necesito ver qué es lo que procesa Split, así que quiero que esta parte de paquete_RX quede de esta manera:

Code: [Select]
if (ss.read() == 64)
  {
 cadRX = "";
 char buff[65];
 buff[ss.readBytesUntil('#', buff, sizeof(buff))] = 0;
 // Ahora el caracter '#' ya no estará en la lectura.

 Serial.println(buff); // Esta es la línea nueva
 cadRX = buff; // Se puede así, en vez de introducir caracter por caracter.
  }

jorgetesla

Buenos dias lucario
me fue bastante bien con las lineas que me pasaste incluso movi el split y lo puse dentro de la recepcion desapareciendo la function split , un dato que quiero que sepas esque
en la parte donde es "Serial.println(buff)" ps valla de maravilla porque me recibe los valores tal como los mando , osea DATOS FLONTANTES, pero al entrar al split este me los convierte a enteros quisiera que me pudieras ayudar para el momento de guardar en variables los datos que almacena datos_RX
  • sigan siendo flotantes y no sean enteros porque valla que nececito esos datos flotantes porfavor







Code: [Select]
void paquete_RX()
{

  int libre=0, bus=0;
 int car;
 int tam;
 char buff[65];
 String cadd;
 cadRX = "";
 int pos_ini = 0;
 int pos_fin = 0;
 if(ss.available())
 {
 
  buff[ss.readBytesUntil('#', buff, sizeof(buff))] = 0;
 // Ahora el caracter '#' ya no estará en la lectura.
Serial.println(buff);
 cadRX = buff; // Se puede así, en vez de introducir caracter por caracter.
   do   
   {
    pos_fin= cadRX.indexOf('/', pos_ini);
    cadd=cadRX.substring(pos_ini, pos_fin);
    datos_RX[i] = cadd.toInt();
    pos_ini = pos_fin +1;
    i++;
   }while(pos_fin > 0);
 
 }
}

asi tengo el codigo y re repito en la parte donde me separa por split me los convierte a enteros y me gustaria seguir teniendolos flotantes tal y como los imprime el buff

Lucario448

En las anteriores imágenes yo veo enteros separados por '/'; si ahora son valores decimales lo que mandas (con el '.' y todo), entonces quizá sería porque en vez de toInt() es toFloat() (función Split).

No sé, digo yo... ::)

jorgetesla

Problema solucionado , lo que pasa es que la function toFloat no me la marcaba y pensaba que no era una function pero veo que si:D problema solucionado con un toFloat();

Lucario448

Me alegro que por fin se haya solucionado tu problema! :)

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy