Salut,
ci-dessous un exemple fonctionnel de gestion de multiple DS18b20.
Le code est configuré pour un fonctionnement en mode parasite (2 fils). Si tu utilises le mode normal, les performances seront améliorées (tps de réponse plus court), mais il faudra modifier quelques paramètres (voir dans les commentaires).
Quand ce sera ok chez toi:
- copier le code dans un fichier que tu appelleras DS18b20.pde
- copier ce fichier dans le répertoire "monprojet": il sera ajouté automatiquement à ce projet.
- supprimer la routine loop() de DS18b20.pde
- renommer setup() du sketch DS18b20.pde en setup_DS18b20()
- ajouter un appel de la routine "setup_DS18b20" dans le setup() de monprojet.pde
- ajouter un appel de la routine "gestion_temperature" dans le loop() de monprojet.pde
#include <stdio.h>
#include <string.h>
#include <OneWire.h>
#define NBRE_CAPTEUR 1 // nombre de capteur sur l'arduino
// *********** declararation des variables gestion des capteurs de temperature *******************
typedef struct Temperature Temperature;
struct Temperature
{
float valeur; // temperature en Celsius, 1 chiffre apres la virgule
byte addr[8]; // identifiant capteur
int pin; // numero de pin a utiliser
char mnemo[32]; // mnemonique de la variable
};
Temperature temperature[NBRE_CAPTEUR]; //creation des instances
// *********** fin declararation des variables gestion des capteurs de temperature *******************
void setup(){
Serial.begin(9600); // initialisation de la liaison serie
// *********** initialisation des variables gestion des capteurs de temperature *******************
temperature[0].addr[0]= 0x10; // identifiant capteur
temperature[0].addr[1]= 0x5;
temperature[0].addr[2]= 0x81;
temperature[0].addr[3]= 0x94;
temperature[0].addr[4]= 0x1;
temperature[0].addr[5]= 0x8;
temperature[0].addr[6]= 0x0;
temperature[0].addr[7]= 0x24;
temperature[0].pin=4;
temperature[0].valeur=0; // temperature en °C, 1 chiffre apres la virgule
strcpy(temperature[0].mnemo,"temp_salon"); // ex: salon
}
void loop(){
gestion_temperature();
delay(5000);
}
void gestion_temperature()
{
/********************************************************************************
Cette fonction permet d'interroger tous les capteurs de temperature OneWire
qui ont ete declare dans "temperature[i]"
********************************************************************************/
byte i=0;
for(i=0; i<NBRE_CAPTEUR; i++){
Serial.print(temperature[i].mnemo);
Serial.print(" => ");
temperature[i].valeur =getStuff(temperature[i].addr,temperature[i].pin);
Serial.print(temperature[i].valeur);
Serial.println(" C ");
delay(100);
}
}
float getStuff(byte addr[8], int pin) // indiquer le n[ch65533] de pin [ch65533] utiliser
{
/********************************************************************************
Cette fonction permet d'interroger le capteur de temperature OneWire
qui a [ch65533]t[ch65533] d[ch65533]clar[ch65533] dans "temperature[i]"
********************************************************************************/
OneWire ds(pin); // creation d'un objet OneWire avec le bon n[ch65533] de pin
byte i;
byte present = 0;
byte data[12];
float real_temp;
float temp_count;
float read_temp;
// Fonction recherche d[ch65533]sactiv[ch65533]e car non utilis[ch65533]e
/*if ( !ds.search(addr)) {
Serial.print("No more addresses.\n");
ds.reset_search();
}
Serial.print("R=");
for( i = 0; i < 8; i++) {
Serial.print(addr[i], HEX);
Serial.print(" ");
}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return 998;
}
if ( addr[0] != 0x10) {
Serial.print("Device is not a DS18S20 family device.\n");
return 999;
}
*/
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power off at the end (1=parasite mode)
delay(1000); // delay de 1s si mode parasite. 100ms en mode normal
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
read_temp=((data[1]<<8) | data[0]) >> 1 ; // Divide the temperature by 2
temp_count=float(data[7] - data[6])/(float)data[7]; // Convert to real temperature
real_temp = ((float)read_temp-0.25)+temp_count;
// arrondi 1 chiffre apres la virgule
int temp = real_temp*10;
real_temp = (float)temp/10;
// Serial.println();
return real_temp;
}
Si tu ne connais pas l'adresse de tes DS18b20, décommente provisoirement les lignes, ou plus simple, utilises le code sample.c fournis avec la lib OneWire pour déterminer toutes les adresses.
Gromain