Go Down

Topic: 4 emisores nrf24l01 a un receptor (Read 4699 times) previous topic - next topic

gepd

Puedes enviar una cabecera diferente para cada dato, y para saber quien lo envía, puedes crear un array con ambas informaciones, algo como:

Code: [Select]
double info_enviar[2];

info_enviar[0] = 02 //id
info_enviar[1] = 15.8 // valor del sensor


Es una manera de solucionarlo, no sé si funcionará bien
Deviot el plugin IoT para Sublime Text. Si quieres probarlo y ayudarme con tu feedback, visita: https://github.com/gepd/Deviot

plogar

Bueno, pues para hacer la trama te paso un pequeño trozo de código para el emisor:
Code: [Select]

    float t = dht.readTemperature(); //SENSOR
    float h = dht.readHumidity();     //SENSOR
    float a = sensors.getTempCByIndex(0); //SENSOR 1
    float b = sensors.getTempCByIndex(1); //SENSOR 2
   
    // Lo que vamos a transmitir
    char a1[7],b1[7],t1[7],h1[7],trama[25];
/* Convertimos distintos tipos de variable en char, buscar información sobre este comando */
    dtostrf(a, 6, 3, a1); 
    dtostrf(b, 6, 3, b1);
    dtostrf(t, 6, 3, t1);
    dtostrf(h, 6, 3, h1);

    trama[0]=a1[0];
    trama[1]=a1[1];
    trama[2]=a1[2];
    trama[3]=a1[3];
    trama[4]=a1[4];
    trama[5]='a';
   
    trama[6]=b1[0];
    trama[7]=b1[1];
    trama[8]=b1[2];
    trama[9]=b1[3];
    trama[10]=b1[4];
    trama[11]='b';
   
    trama[12]=t1[0];
    trama[13]=t1[1];
    trama[14]=t1[2];
    trama[15]=t1[3];
    trama[16]=t1[4];
    trama[17]='t';
   
    trama[18]=h1[0];
    trama[19]=h1[1];
    trama[20]=h1[2];
    trama[21]=h1[3];
    trama[22]=h1[4];
    trama[23]='h';
    trama[24]='\0';
   
   

    Serial.print("Enviando...");
    Serial.print(trama);
    bool ok = radio.write( &trama, sizeof(trama) );
   

En la salida es algo como: Enviando...23.45a12.45b45.67t56.01
Para tu caso podrías poner el indicativo inicialmente, y los demás datos pues o separarlos por espacios o por palabras

Sabiendo el orden que tienen los datos en la trama, pues ya puedes acceder a ellos individualmente. Es recomendable que siempre tengan los mismos dígitos, es decir, si las medidas son del 99.00 al 00.00 pues solo necesitarías 5 caracteres en la trama. Sin embargo si mides desde el 100.00 al -99.00 pues ya necesitarías un carácter más.

En la hoja de características del sensor, página 37, indica que puede recibir desde 6 nodos a través de la dirección del emisor, no profundiza casi nada, solo habla de que deberán de estar configurados de una determinada forma...Habría que buscar más a fondo.

surbyte

#32
Nov 13, 2015, 01:05 pm Last Edit: Nov 13, 2015, 01:08 pm by surbyte
Porque trabajan tan complicadamente y no usan sprintf para hacer lo mismo de manera mas facil e intuitiva.

Code: [Select]
    float t = dht.readTemperature();      //SENSOR
    float h = dht.readHumidity();         //SENSOR
    float a = sensors.getTempCByIndex(0); //SENSOR 1
    float b = sensors.getTempCByIndex(1); //SENSOR 2
    char buffer[30];
    // Lo que vamos a transmitir
    char a1[7],b1[7],t1[7],h1[7],trama[25];
    /* Convertimos distintos tipos de variable en char, buscar información sobre este comando */
    dtostrf(a, 6, 3, a1);
    dtostrf(b, 6, 3, b1);
    dtostrf(t, 6, 3, t1);
    dtostrf(h, 6, 3, h1);

     sprintf(trama, "%sa%sb%sc%st%sh\0", a1, b1, c1, t1, h1);
   
    Serial.print("Enviando...");
    Serial.print(trama);
    bool ok = radio.write( &trama, sizeof(trama) );   


Lo mismo de modo mas simple no?

plogar


surbyte

Solo una acotación menor. 
Yo armo siempre las tramas usando sprintf

liebherr

Bueno ya me disculpareis, lo primero agradeceros vuestra ayuda, por otra parte deciros que yo se lo justo mas bien poco y he probado el código de surbyte y no funciona se tienen que declarar las variables, pero una cosa que vosotros dais por sentada a mi se me hace un autentico castillo, jejeje

Este código supongo que es para el emisor, y para el receptor seria lo mismo?

Bueno gracias por vuestra paciencia.

Un saludo.

surbyte

Como no va a funcionar si es lo mismo que el de plogar con sprintf
Ahora si el código de plogar no funciona no lo se, no lo he probado.

liebherr

No es que no funcione, me he explicado mal, al decir tu surbyte que era mejor con sprintf probé el tuyo, pero seguro que no lo aplico bien

dejo el codigo para que lo veais que no tengo ni idea

Code: [Select]

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>

    float sensors[3];
    float t = dht.readTemperature();      //SENSOR
    float h = dht.readHumidity();         //SENSOR
    float a = sensors.getTempCByIndex(0); //SENSOR 1
    float b = sensors.getTempCByIndex(1); //SENSOR 2
    float c = sensors.getTempCByIndex(2); //SENSOR 3

  float angulo1Y;
  float angulo1X;
  float bateria1;
  float tempera1;
  unsigned long id1;

// nRF24L01(+) radio attached using Getting Started board
RF24 radio(7,8);

// Network uses that radio
RF24Network network(radio);

// Address of our node
const uint16_t this_node = 1;

// Address of the other node
const uint16_t other_node = 0;

// How often to send 'hello world to the other unit
const unsigned long interval = 2000; //ms

// When did we last send?
float last_sent;

// How many have we sent already
unsigned long packets_sent;

// Structure of our payload
struct payload_t
{
  //float ms;
  float angulo1Y;
  float angulo1X;
  float bateria1;
  float tempera1;
  unsigned long counter;
  uint8_t id1; //ID del nodo
};

void setup(void)
{
  Serial.begin(57600);
  Serial.println(" EMISOR 1 ");
 
  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 90, /*node address*/ this_node);
}

void loop(void)
{
  // Pump the network regularly
  network.update();

 angulo1Y = 21.01;
 angulo1X = 21.02;
 bateria1 = 21.03;
 tempera1 = 21.04;
 packets_sent = 1;
 id1=1;

    char buffer[30];
    // Lo que vamos a transmitir
    char a1[7],b1[7],c1[7],t1[7],h1[7],trama[25];
    /* Convertimos distintos tipos de variable en char, buscar información sobre este comando */
    dtostrf(a, 6, 3, a1);
    dtostrf(b, 6, 3, b1);
    dtostrf(c, 6, 3, c1);
    dtostrf(t, 6, 3, t1);
    dtostrf(h, 6, 3, h1);

     sprintf(trama, "%sa%sb%sc%st%sh\0", a1, b1, c1, t1, h1);
   
    Serial.print("Enviando...");
    Serial.print(trama);
    bool ok = radio.write( &trama, sizeof(trama) );


Ya me perdonareis por lo poco que entiendo.

Un saludo.


surbyte

sprinft solo te encapsula la trama, mira que esta faltando y agregalo si falta algo.

liebherr

Ya me gustaría a mi saber si falta algo, jejeje.

De todas maneras muchas gracias.

Saludos.

surbyte

Me he perdido con tu hilo. dime que post funcionaba y ya sabemos que este no. Para ver donde puede estar tu problema

liebherr

No es que no funcione, si que funciona, el tema esta en separar los datos de los 4 sensores, me llegan todos los datos correctamente al receptor, el problema es separarlos, osea que pueda calcular el anguloY del receptor 1 con el anguloY del receptor 2, y asi los otros tambien.

He probado de diferenciarlos con una sentencia if, pero supongo que no lo hago bien

Code: [Select]

    // si el emisor es el numero 1
    if ( id = 1 ) 
    {
    // pasar los datos a las variables de este emisor
      id1=id; anguloY1=anguloY; anguloX1=anguloX; bateria1=bateria; tempera1=tempera;
    Serial.print(" grados Y1 "); Serial.println(anguloY1);
      }
    // si el emisor es el numero 2
     if ( id = 2 ) 
    {
    // pasar los datos a las variables de este emisor
      id2=id; anguloY2=anguloY; anguloX2=anguloX; bateria2=bateria; tempera2=tempera;
    Serial.print(" grados Y2 "); Serial.println(anguloY2);
      }
    Serial.print(" Calculo grados Y "); Serial.print(anguloY1+anguloY2); Serial.print(" Calculo grados X "); Serial.println(anguloX1+anguloX2);


Saludos


liebherr

Bueno, ya se el porque no me funcionaba bien, tenia: if(id=1) y tenia que ser: if(id==1)

Errores de novato y gracias a un amigo que me lo ha dicho.

Bueno seguimos con el proyecto a ver como se va desarrollando.

Saludos.

the3dgar13

Yo en particular, diría que... Crees un vector, en el receptor, que trabaje con los tantos mensajes que te envían los emisores, asignándole un lugar a cada mensaje, y en el caso de que no estés enviando mensajes desde cualquier emisor, codifica que el emisor envíe algo como "no hay mensaje" así mantienes una comunicación continua aunque no estés enviando nada ;-)

liebherr

Muchas gracias the3dgar13, en principio como he puesto esta funcionando y muy bien, he podido separar los datos y por otra parte el sistema tiene que recoger datos todo el tiempo, no puede parar.

Seguiré informando.

Saludos.

Go Up