Go Down

Topic: Problema con programacion varios nodos un master... (Read 1 time) previous topic - next topic

carama

Muy buenas, hace ya unos años estuve metido en un proyecto para poder mandar las lecturas de un DHT recogidas en un invernadero a un arduino UNO que haria de servidor, todo a traves de nRF24.

He vuelto a retomar el proyecto , pues en su dia solo conseguir mandar un nodo y no supe hacer varios.

En la actualidad tengo , un arduino UNO que hace de master y tres nanos con nRF24 mandando los datos de los DHT. Hasta qui todo bien , pero tengo dos problemas que no se como resolver por mas que miro, leo, pruebo ....

El primer problema es , que cuando entro en el serial del master los datos recogidos por los nodos se van desvirtuando, pongo una foto para que entendais lo que quiero decir:


Vemos que la primera lectura que corresponde con invernadero paloma llega bien, el segundo y tercero tambien, pero a partir de ahi, llegan los datos mal, se junta los datos de temperatura y los de humedad desaparecen, si sigo obeservando el serial al final aparece otra vez los de humedad pero mal posicionados.

Por otro lado , si uno de los nodos deja de emitir , no me muestra nada de los demas en el serial , como si solo funionara si los tres estan emitiendo .

Podeis decirme algo respecto a esto? donde mirar mas a ver si aun no he mirado?

Gracias.


surbyte

Para lograr que varios nodos se comuniquen con uno digamos Servidor tienes que usar una Red. En el caso de los nRF24 existe un programador  que siempre recomiendo que escribió dos librerías.
Una RF24Network y la otra RF24Mesh, la ultima hace que los nodos se conecten y tomen un ID de forma automática y en la primera estos Id se asignan a cada nodo via código.
Me gusta el primer caso para situaciones donde yo quiero identificar por ejemplo en tu caso la planta o la sección a la que le controlo la humedad y el segundo caso es para situaciones donde los nodos puedan retirarse y nada cambia si cambia el Id o su ubicación.

Ambas librerías estan en el administrador de librerías del IDE, búscalas como RF24 y lo que sigue.
Tiene ejemplos, te recomiendo que los pruebes y luego comentes o evacúes tus nuevas dudas.

carama

Gracias surbyte, ya me ayudastes mucho hace años y aun sigues por aqui jejeje, eso es bueno...

Voy a probar lo que med cies y ver de que manera puedo implantarselo a mi codigo, o mejor aun, hacer uno nuevo desde el principio y luego ir añadiendole lo demas. Comento  cuando haga pruebas.

surbyte

Te dejo un ejemplo para que veas como puedes implementarlo, no te guíes por la pregunta inicial porque obviamente la persona tenía errores pero si siguies viendo verás su solución y si no la entiendes lo vemos aquí.
Tal vez lo mejor sería que tomes ese ejemplo y lo adaptes a tu caso o necesidad y luego lo vamos corrigiendo.

Este es el ejemplo (RF24Network, multiple nrf24l01+ and DS18B20)y su link.

carama

Te dejo un ejemplo para que veas como puedes implementarlo, no te guíes por la pregunta inicial porque obviamente la persona tenía errores pero si siguies viendo verás su solución y si no la entiendes lo vemos aquí.
Tal vez lo mejor sería que tomes ese ejemplo y lo adaptes a tu caso o necesidad y luego lo vamos corrigiendo.

Este es el ejemplo (RF24Network, multiple nrf24l01+ and DS18B20)y su link.
Gracias , a raiz de lo que me has pasado y mirando algo mas he conseguido hacerlo funcionar bien, ya estoy recibiendo los datos identificados segun el sensor y emisor.

Ahora estoy con otra parte del proyecto, quiero hacer un archivo XML con los datos que recibo para luego subirlo a una base de datos y consultar los datos en una web con graficas y desde cualquier sitio.

El formato del XML que me sale es este=
Code: [Select]
<sensors>
<sensor>
1
<temperatura>23 </temperatura>
<humedad>50 </humedad>
</sensor>
<sensor>
2
<temperatura>23 </temperatura>
<humedad>50 </humedad>
</sensor>
<sensor>
3
<temperatura>23 </temperatura>
<humedad>50 </humedad>
</sensor>
</sensors>

Pero vuelvo a tener el mismo problema, tanto el 1 como el 2 y el 3 son iguales, y si voy refrescando mi ip (192.168....) cambian los valores de temperatura y humedad . Vamos que coge aleatoriamente los datos pero me los muestra iguales en los tres.

carama

Quizas seria mas sencillo, mandar directamente desde el arduino los datos a una base de datos, total , en mi red local tampoco me es necesario hacer una consulta de los datos de los sensores.

Asi de este modo, mando los datos del serial que estaria bien identificados;

Sensor 1 Tem 34 Hume 45
Sensor 2 Tem 33 Hume 50
Sensor 3 Tem 29 Hume 44

A una base de datos y ya los trato con php , para crear graficas y demas, no?

surbyte

cualquier forma debería funcionar.
Si es mas simple enviar como XML puedes seguir por esa vía.
Por el metodo Sensor Temp Hum me parece que envias demasiados caracteres innecesarios.
Solo
SX TYY HZZ es suficiente par ami gusto.
Veo que usas un DHT11.
Mi consejo es que cambies a un DHT22. Es un mal sensor el DHT11. Funcionar funciona pero ya verás la diferencia que es tener un DHT22 contra un DHT11.

Por otro lado XML no debería darte problemas. Puedes seguir todo tipo de tutoriales aquí ArduinoJson

carama

El DHT que utilizo es el DHT 21 :



Ahora mismo el problema que tengo es el siguiente:

Recibo los datos de los sensores correctamente, identificados por cada numero de sensor.
El problema es que el codigo que estoy utilizando como receptor , lee lo que le llega:

Code: [Select]
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <Wire.h>
float humidity;
float temperature;
RF24 radio(7,8);
RF24Network network(radio);
const uint16_t this_node = 00;
//const uint16_t other_node = 001;


struct payload_t
{
  byte senderID;
  float a;
  float b;
};

void setup(void)
{
Serial.begin(9600);
Serial.println("RF24 Network Rx-DS18B20");
SPI.begin();
radio.begin();
network.begin(/*channel*/ 88, /*node address*/ this_node);
radio.setPALevel(RF24_PA_LOW);
}
void loop(void)
{
network.update();
while ( network.available())
{

RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload));
Serial.print("Sensor: ");
Serial.print(payload.senderID);
Serial.print(" ");
Serial.print("Temp: ");
Serial.print(payload.a);
Serial.print(" C");
Serial.print("Hume: ");
Serial.print(payload.b);
Serial.println(" %");
}
}


Y aqui es donde no se identificar , cada lectura de los sensores y sus datos.

Entonces cuando creo el xml , me sale esto:

Code: [Select]
<?xml version="1.0"?>
<sensors>
<sensor name="sns<sensor>1
<temperatura>24 </temperatura>
<humedad>50 </humedad>
</sensor>
<sensor name="sns<sensor>2
<temperatura>24 </temperatura>
<humedad>50 </humedad>
</sensor>
<sensor name="sns<sensor>3
<temperatura>24 </temperatura>
<humedad>50 </humedad>
</sensor>
</sensors>


Como puedes ver, son los mismos datos en los tres sensores.

Lo que me has pasado lo he estado mirando , pero demasiada informacion y tengo la cabeza ya super liada.
 

surbyte

que tal algo asi?

Code: [Select]
void loop(void){
    network.update();
while ( network.available()) {
RF24NetworkHeader header;
payload_t payload;
network.read(header,&payload,sizeof(payload));
switch(payload.senderID) {
case 0: printSensor(payload);
break;
case 1: printSensor(payload);
break;
case 2:printSensor(payload);
break;
// etc
}
}
}

void printSensorData(struct ptmp) {
Serial.print("Sensor: ");
Serial.print(ptmp.senderID);
Serial.print(" ");
Serial.print("Temp: ");
Serial.print(ptmp.a);
Serial.print(" C");
Serial.print("Hume: ");
Serial.print(ptmp.b);
Serial.println(" %");
}


Lo hice con lo que estabas imprimiendo pero puedes hacerlo con tu XML
Mi consejo es que uses sprintf() para facilitar las cosas.

carama

Gracias Surbyte, pero desafortunadamente no va eso que me has puesto.

Code: [Select]
error: 'printSensor' was not declared in this scope


Y este otro error respecto a esta linea:

Code: [Select]
void printSensorData(struct ptmp) {
Code: [Select]
error: a function-definition is not allowed here before '{' token

carama

Aun asi , me he planteado el de no crear un XML al final, he visto que necesitaria de un servicio de ip fija o MYDDNS , para poder acceder al XML que estaria en mi pc .

Creo que lo mejor va a ser GET o POST, el primero lo veo muy poco seguro y mas teniendo en cuenta que la web sera accesible para el que quiera consultar los datos y he visto que POST es algo menos invulnerable.

Asi que ahora tengo, por un lado una Base de Datos creada y configurada en mi VPS , donde he alojado dos PHP , uno como config.php , donde estan los datos de conexion de la base de datos y el otro sensores.php , que seria el que recibe los datos del arduino . 

Pero volvemos al principio, jajajajajaa, como solo tengo una orden en el RX que lee lo que le entra , pues no diferencio los datos para subir a sensores.php.

surbyte

#11
Nov 10, 2020, 08:26 pm Last Edit: Nov 10, 2020, 08:27 pm by surbyte
Yo te sugerí un código mas o menos que te permitiría identificar los nodos, pensé que alguien que esta con estas cosas puede detectar simples errores como el que me acabas de preguntar.

Cometí dos errores pero eso pasa por hacerlo al vuelo.
Puse printSensor y luego definí printSensorData() y esta mal struct ptmp y debe ser payload_t ptmp

Debs cambiar esto

Code: [Select]
void printSensorData(struct ptmp) {

por

Code: [Select]
void printSensor(payload_t ptmp) {

carama

surByte, la verdad que eso ya lo hice, se poco de esto , pero solo por logica era de esperar que tenia que cambiar esas lineas como me has dicho, pero aun asi , persiste el error:

Code: [Select]
error: 'printSensor' was not declared in this scope


Siento si estoy molestando demasiado con esto, intento hacer lo que pueda por mi cuenta dentro de mis capacidades, de por hecho, prefiero encontrar yo las soluciones a que me las digan , de este modo aprendo mas.

gatul

Probá moviendo la funcion a la zona de declaraciones, antes de setup()

surbyte

Si estas trabajando con el IDE no hace falta ponerla antes pero bueno es una opción simplemente poner

Code: [Select]
void printSensor(payload_t ptmp);

antes del setup


Yo te pongo todo el código que compilé sin problemas asi en el IDE, al final pongo el resultado de la compilación

Code: [Select]
#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <Wire.h>
float humidity;
float temperature;
RF24 radio(7, 8);
RF24Network network(radio);
const uint16_t this_node = 00;
//const uint16_t other_node = 001;


struct payload_t
{
  byte senderID;
  float a;
  float b;
};

void setup(void)
{
  Serial.begin(9600);
  Serial.println("RF24 Network Rx-DS18B20");
  SPI.begin();
  radio.begin();
  network.begin(/*channel*/ 88, /*node address*/ this_node);
  radio.setPALevel(RF24_PA_LOW);
}

void loop(void) {
  network.update();
  while ( network.available()) {
    RF24NetworkHeader header;
    payload_t payload;
    network.read(header, &payload, sizeof(payload));
    switch (payload.senderID) {
      case 0: printSensor(payload);
        break;
      case 1: printSensor(payload);
        break;
      case 2: printSensor(payload);
        break;
        // etc
    }
  }
}

void printSensor(payload_t ptmp) {
  Serial.print("Sensor: ");
  Serial.print(ptmp.senderID);
  Serial.print(" ");
  Serial.print("Temp: ");
  Serial.print(ptmp.a);
  Serial.print(" C");
  Serial.print("Hume: ");
  Serial.print(ptmp.b);
  Serial.println(" %");
}



Code: [Select]
El Sketch usa 9454 bytes (30%) del espacio de almacenamiento de programa. El máximo es 30720 bytes.
Las variables Globales usan 761 bytes (37%) de la memoria dinámica, dejando 1287 bytes para las variables locales. El máximo es 2048 bytes.

Go Up