nRF24L01 & tableau de données

Bonsoir,

Je tente d'envoyer des températures d'une sonde a base de DS1820 via des nRF24L01+ sur un LCD 4x20.
Comme je désire utiliser plusieurs sonde, je les identifie via un "int", puis je créer un tableau pour avoir un
paquet via float qui contient l'ident de la sonde et la température. (pas de byte car je désire des virgule pour la température).

Problème je ne reçoit rien du coter du récepteur !
J'alimente les nrf via l'arduino ou via une alim externe

Si vous avez une idée de ce qui cloche, je suis preneur !

code de la sonde:

#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

#include <SPI.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <VirtualWire.h>
#define ONE_WIRE_BUS 2 //bus 2 pour le DS18

#include <LiquidCrystal.h> //Affichage de la température sur un lcd 2x8
LiquidCrystal lcd(9, 6, 5, 4, 3, 10); 

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress SDB = { 0x28, 0xC0, 0x09, 0xBC, 0x05, 0x00, 0x00, 0xC4 };  //sonde salle de bain
float tSDB;

int probeId = 1; //identifiant du DS18

void setup()
{
  Serial.begin(9600);
  Serial.println("Demarrage");
  lcd.begin(8, 2);
  
  sensors.begin();
  sensors.setResolution(SDB, 10);
  
  Mirf.cePin = 8;
  Mirf.csnPin = 7; 
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"sensor_2"); //Le nom du capteur de la sonde
  Mirf.payload = 6; // paquet 6 octets
  Mirf.channel = 0; // Canal 0
  Mirf.config();
  Mirf.setTADDR((byte*)"recepteur"); //Nom du recepteur

  Serial.println( "nRF24L01+ initialisation ...." );
}

void loop()
{
  senddata();
}
 
void senddata()
{
    while(Mirf.isSending()){
    }
    
    sensors.requestTemperatures();
    float tSDB = sensors.getTempC(SDB);
    
    lcd.clear();
    lcd.setCursor(2, 0);
    lcd.print("Temp ");
    lcd.setCursor(0, 1);
    lcd.print(">");
    lcd.setCursor(2, 1);
    lcd.print(tSDB);
    lcd.print("C");
    
    float packet[6]; // paquet 6 octets
    Serial.print("packet  ");
    Serial.println(packet[6]);
    
    packet[1] = probeId; // identifiant sonde
    Serial.print("probe  ");
    Serial.println(packet[1]);
    
    packet[5] = tSDB; // valeur temp
    Serial.print("temp  ");
    Serial.println(packet[5]);
    
    Mirf.send((byte *) &packet); // envoie des données
    while(Mirf.isSending());
    delay(5000); // toute les 5 secondes
}

Code du recepteur:

#include <Wire.h>
#include <SPI.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // ecran lcd 4x20
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
  
 void setup()
{
  Serial.begin(9600);
  Serial.println("Demarrage");
  lcd.init();  // initialize the lcd 
  lcd.backlight();
  
    Mirf.cePin = 8; // CE sur D8
  Mirf.csnPin = 7; // CSN sur D7
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.setRADDR((byte *)"recepteur"); //Le nom du serveur 
  Mirf.payload = 6;
  Mirf.channel = 0; // Canal 0
  Mirf.config();
 
  Serial.println( "nRF24L01+ initialisation ..." );
}
  
void loop()
{   
  //Si des données sont dispo
  if(Mirf.dataReady())
  {
    float datas[6];     // on stocke les données
    Mirf.getData((byte *) &datas);  
    
    //On affiche via le port série 
    Serial.print("Sonde =");
    Serial.println(datas[1]);
    Serial.print("Temp =");
    Serial.println(datas[5]);
    
    lcd.setCursor(0, 0); // affichage sur LCD
    lcd.print("Sonde ");
    lcd.print(datas[1]);
    lcd.setCursor(0, 1);
    lcd.print("Temp ");
    lcd.print(datas[5]);
}   
}

Bonsoir

Tu n'es pas assez précis. Qu'entends tu par « je ne reçois rien » ?

float packet[6];

déclare un tableau de 6 flottants. Soit 24 octets.
Dans packet[0], tu ne mets rien.
Dans packet[1], probeId. l'entier est donc casté en float.

packet[0] est envoyé ainsi que la moitié de packet[1].

De l'autre côté, tu devrais recevoir la moitié du probeId codage IEEE784 qui est interprété de travers puisque les 2 autres octets ne sont pas envoyés. Donc le nombre est probablement erroné.

Et ... c'est tout.

Si tu veux des virgules pas la peine de prendre des "float".
1 seul chiffre après la virgule est significatif. A l'émission il suffit de multiplier par 10 et de mettre le résultat dans un int . A la réception on fait l'opération inverse et le chiffre décimal est récupéré.

jlbechennec:
Bonsoir

Tu n'es pas assez précis. Qu'entends tu par « je ne reçois rien » ?

float packet[6];

déclare un tableau de 6 flottants. Soit 24 octets.
Dans packet[0], tu ne mets rien.
Dans packet[1], probeId. l'entier est donc casté en float.

packet[0] est envoyé ainsi que la moitié de packet[1].

De l'autre côté, tu devrais recevoir la moitié du probeId codage IEEE784 qui est interprété de travers puisque les 2 autres octets ne sont pas envoyés. Donc le nombre est probablement erroné.

Et ... c'est tout.

merci, mais comment faire pour mettre dans un seul paquet, le float et l'entier ?
car a l'arriver j'aimerai les distingués pour pouvoir différencié les différentes sondes.

je modifie le code et test demain.

a+

Fait une struct :

struct TEMPERATURE {
  int identifiant;
  float temperature;
} packet;

Dans setup :

packet.identifiant = 1;

Dans loop :

packet.temperature = tSDB;

jlbechennec:
Fait une struct :

struct TEMPERATURE {

int identifiant;
  float temperature;
} packet;




Dans setup :



packet.identifiant = 1;




Dans loop :



packet.temperature = tSDB;

je ne connaissais pas

struct
{
}

merci, je testerai ce soir.

subsix:
(pas de byte car je désire des virgule pour la température).

Le problème c'est que le nrf24l01 n'accepte que des bytes. Si tu veux très simplement transmettre un float, tu peux faire des multiplication par 10, division par 10 :

à l'émission :

MaTemperature *= 100; // je multiplie ma température par 100, donc si par exemple j'ai 30.25 => 3025
IntToByteArray(int(MaTemperature), packet); // fonction à coder, y'a rien de compliquer
Mirf.send((byte *) &packet);

Réception:

 Mirf.getData((byte *) &datas);
MaTemperature = ByteArrayToInt(data); // fonction à coder, y'a rien de compliquer
MaTemperature /= 100; // je divise ma température par 100, donc si par exemple j'ai 3025 => 30.25