3 ds18b20 sur 1 emetteur 433 et récepteur : temperature+adresses onewire ?

Bonjour,

pour mon systeme de detection de 3 temperatures envoyées par un seul emetteur 433mhz, j’en suis a savoir envoyer les temperatures mais pas l’adresse de chaque capteur : comment faire ?
je vous livre mes croquis emetteur et recepteur :
envoyer la temperature et l’adresse correspondante de chaque ds18b20 ?
decoder l’adresse et la temperature correspondante sur le récepteur ?

code emetteur

//  test multiple ds18b20 avec un struct array
  // ok 28/10/19
  // avec recepteur multi18b20rx.ino
  // reste a pouvoir différencier les capteurs
  #include <VirtualWire.h>
  #include <OneWire.h>
  #include <DallasTemperature.h>
 
  #define ONE_WIRE_BUS 8
  OneWire oneWire(ONE_WIRE_BUS);
  DallasTemperature sensors(&oneWire);
  //const byte probe1[8]= {0x28, 0xaa, 0xcd, 0x79, 0x40, 0x14, 0x01, 0xc0};
  //const byte probe2[8]= {0x28,0xaa,      ajouter 2 et 3 eme capteur};
   
  const int transmit_pin = 4; // tx data

// creation structure 

struct package
{
  float temp159; 
  float temp160;
  float temp161; 
  //byte probe1[];
  //byte probe2[];
};

typedef struct package Package;
Package data;

void setup()
{
    sensors.begin();  // init les capteurs 18b20
    // Initialise the IO and ISR
    //Serial.begin(9600); // for debug
    vw_set_tx_pin(transmit_pin);
    //vw_set_ptt_inverted(true); // Required for DR3100
    vw_setup(1000);    // Bits per sec 
}

void loop()
{
   sensors.requestTemperatures(); // on lit les temperatures de tous les 18b sur le onewire ?
    delay(200);  // faut-il un delay  ?
   
   // par index
      data.temp159 = sensors.getTempCByIndex(0); // temp159
      data.temp160 = sensors.getTempCByIndex(1); // dans temp160
      data.temp161 = sensors.getTempCByIndex(2); // dans temp161
    
   // il faudra les differencier dans le récepteur
   // 
   // en collant l'adresse de chaque 18b20 avec la temperature correspondante ?
    /*
    // ou par adresse 
    ds.reset();
    ds.select(probe1);
    data.probe1[];
   data.temp159 = sensors.getTempC(probe1); //  dans temperature 1
    ds.reset();
    ds.select(probe2);
    data.probe2[];
   data.temp160 = sensors.getTempC(probe2); // dans temp160
   ds.reset();
    ds.select(probe3);
    data.probe3[];
   data.temp161 = sensors.getTempC(probe3); // dans temp161
   */
   // il faut retrouver adresse et 
   //temp159 et 160 et 161 dans le récepteur
   
  vw_send((uint8_t *)&data, sizeof(data));
  vw_wait_tx(); // Wait until the whole message is gone
  
  delay(10000UL);// augmenter à 30 secondes ou plus entre les émissions
  /*
  Serial.println(data.temp159);
  Serial.print("temp 2   ");
  Serial.println(data.temp160);
  delay(1000);
  */
}

code recepteur

/*
combiner avec l'emetteur multi18b20tx.ino
ou lm75amultiTX.ino
ajouter datalogger sdcard horodaté ou pas
ecrire sur la sd uniquement quand la temperature change de + ou - 20 degres
sur au moins 1 des 3 capteurs ca commence a devenir lourd pour mes capacités

*/
#include <LiquidCrystal.h>
#include <VirtualWire.h>

// Display pins
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);
//LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int receive_pin = 2;  // 12 pardefaut
    
struct package
{
  float temp159;   //temp159 = 0.0
  float temp160;  //temp160 = 0.0  ?
  float temp161;   //temp159 = 0.0
  //byte probe1[8];  // adresses onewire ?
  //byte probe2[8];
};

typedef struct package Package;
Package data;

// Array symbol degree
byte degree [8] = {B00001100,
 B00010010,
 B00010010,
 B00001100,
 B00000000,
 B00000000,
 B00000000,
 B00000000,
 };

void setup ()
{

 // Initialize the display
 // Create the custom character with the symbol of the degree
    lcd.createChar (0,degree);
    lcd.begin (16, 2);
    lcd.clear ();
  
// init for rx433
    vw_set_rx_pin(receive_pin);
    vw_setup(1000);  // Bits per sec
    vw_rx_start();    // Start the receiver

 
 
      } //end setup

void loop ()
{
 uint8_t buf[sizeof(data)];
    uint8_t buflen = sizeof(data);

    

if (vw_have_message())  // Is there a packet for us? 
  {
    vw_get_message(buf, &buflen);
    memcpy(&data,&buf,buflen);

    lcd.clear();

    lcd.setCursor (0,0);
    lcd.print ("N159 : ");
    lcd.setCursor (7,0);  
    lcd.print(data.temp159,1);
    lcd.setCursor (13,0);
 // Shows the symbol of the degree
    lcd.write (byte (0));
    lcd.print ("C");

    lcd.setCursor (0,1);
    lcd.print ("N160 : ");
    lcd.setCursor (7,1);
    lcd.print(data.temp160,1); // 1 decimale
    lcd.setCursor (13,1);
    lcd.write (byte (0));
    lcd.print ("C");
     
// 3eme capteur : comme lcd 16x2 il faut effacer les data qui précédent
    delay(4000); // delay avant effacement
    lcd.clear();
    lcd.setCursor (0,0);
    lcd.print ("N161 : ");
    lcd.setCursor (7,0);

    lcd.print(data.temp161,1);  //1 decimale
    lcd.setCursor (13,0);
 // Shows the symbol of the degree
     lcd.write (byte (0));
     lcd.print ("C");
     delay(4000);

  }
 

         } // end loop

Merci

Si je comprends bien tu envoies une structure composée de trois températures.
Je ne vois par trop ce qui te manque. L'ordre des données dans la structure est fixe. Donc si l'émetteur envoie toujours les trois données ensemble, le récepteur sait à quoi correspond chacune d'elles.
Sinon, si tu tiens absolument à incorporer l'adresse de chaque device dans la structure, pourquoi pas ?

struct package
{
  float temp159;
  float temp160;
  float temp161;
  byte probe1[8];
  byte probe2[8];
  byte probe3[8];
};

// OU

struct package
{
  float temp[3];
  byte probe[3][8];
};

// OU

struct deviceData
{

  byte address[8];
  float temp;
};

struct package
{
  struct deviceData device159;
  struct deviceData device160;
  struct deviceData device161;
};

A ta convenance.
La méthode getAddress() te permettra de renseigner les adresses.

ok, merci
en fait je pensais mettre les adresses pcque j’aurai plusieurs emetteurs/recepteurs 433mhz pour d’autres prises de temperature à distance, le recepteur démarre quand il reçoit une émission 433mhz qui ne lui est pas destinée, j’ai ajouté un byte d’identification emetteur/recepteur et çà à l’air de fonctionner
je n’ai qu’un petit probleme, comme j’ai copié des fonctions pour mettre un zero avant les digits
< 10, dans les heures/minutes/secondes affichées sur le lcd et écrites sur la carte sd, je voudrais faire de meme pour les temperatures, sur le lcd pas vraiment nécessaire, sur la sd, le digit < 10 décale la mise en forme sur le fichier txt d’un digit vers la gauche quand les temperatures < 10,

la fonction pour h min sec :

void printDigits(int digits)
{
// utility function for digital clock display:  prints leading 0
    
    if(digits < 10)
        lcd.print('0');
    lcd.print(digits);
}

    void printtosd(int digits)
{
// meme chose sur ecriture sd card çà marche pas pour les temperatures
// printtosd(data.temp159,1);  le 2eme argument est invalide
// il faut modifier ou creer une 3eme fonction tenant compte de la décimale
// sur les data temperatures
    if(digits < 10)
        mesTemp.print('0');
        mesTemp.print(digits);
}

le code complet dépasse le max autorisé sur le forum, une version moins complete

Merci