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