Probleme programmation DS18B20

Bonjour,
j ai un souci de programmation le code :

#include <OneWire.h> //librairie Onewire - Port OneWire - sorte de pilote contenant les instructions pour s'en servir
#include <DallasTemperature.h> // librairie dallastemperature - T° - sorte de pilote contenant les instructions pour s'en servir

/*
Arduino branchement
Analog Pin 0 = H% Sensor
Analog Pin 1 = H% Sensor
Analog Pin 2 = H% Sensor
Analog Pin 3 = H% Sensor
Analog Pin 4 = SDA pour ds1307
Analog Pin 5 = SCL pour ds1307

Digital Pin 0 = Relais Chauffage Terra 1
Digital Pin 1 = Relais Chauffage Terra 2
Digital Pin 2 = Relais Chauffage Terra 3
Digital Pin 3 = Relais Chauffage Terra 4
Digital Pin 4 = Relais H% Terra 1
Digital Pin 5 = Relais H% Terra 2
Digital Pin 6 = Relais H% Terra 3
Digital Pin 7 = Relais H% Terra 4
Digital Pin 8 = Relais Lumière Terras
Digital Pin 9 =
Digital Pin 10 =
Digital Pin 11 =
Digital Pin 12 =
Digital Pin 13 = T° Sensor

*/

int time;
int val_up=0;
int val_down=0;
long last_time1 = 0;
long last_time2 = 0;

//Définition pin de sortie
int CTerra1 = 0;
int CTerra2 = 1;
int CTerra3 = 2;
int CTerra4 = 3;
int HTerra1 = 4;
int HTerra2 = 5;
int HTerra3 = 6;
int HTerra4 = 7;
int LTerra = 8;

// Définition pin entrée digital Dallas
#define ONE_WIRE_BUS 13

// Définition communication avec tout matériel Onewire
OneWire oneWire(ONE_WIRE_BUS);

// Référence t° Dallas
DallasTemperature sensors(&oneWire);

// arrays to hold device addresses
uint8_t T1[8], T2[8], T3[8], T4[8], T5[8], T6[8], T7[8], T8[8];

char buf1[10];
char buf2[10];
char buf3[10];
char buf4[10];
char buf5[10];
char buf6[10];
char buf7[10];
char buf8[10];

// Nuit_Jour Temp
float Temp1Nuit=22.0;
float Temp1Jour=25.0;

void setup(void)
{
// Pin mis en sortie
pinMode(CTerra1, OUTPUT);
pinMode(CTerra2, OUTPUT);
pinMode(CTerra3, OUTPUT);
pinMode(CTerra4, OUTPUT);
pinMode(HTerra1, OUTPUT);
pinMode(HTerra2, OUTPUT);
pinMode(HTerra3, OUTPUT);
pinMode(HTerra4, OUTPUT);
pinMode(LTerra, OUTPUT);

// Démarre le port série
Serial.begin(1200);
Serial.println("Gestion Terra");

/RTC.stop(); // a enlever / à la première initialisation et a remettre ensuite
RTC.set(DS1307_SEC,00); //réglage secondes du moment
RTC.set(DS1307_MIN,28); //réglage minutes du moment
RTC.set(DS1307_HR,11); //réglage heures du moment
RTC.set(DS1307_DOW,1); //réglage jour de la semaine du moment
RTC.set(DS1307_DATE,31); //réglage date du moment
RTC.set(DS1307_MTH,05); //réglage mois du moment
RTC.set(DS1307_YR,11); //réglage année du moment
RTC.start(); // a enlever /* à la première initialisation et a remettre ensuite
*/

// Démarre la librairie
sensors.begin();
if (!sensors.getAddress(T1, 0)) Serial.println("Unable to find address for Device 0");
if (!sensors.getAddress(T2, 1)) Serial.println("Unable to find address for Device 1");
if (!sensors.getAddress(T3, 2)) Serial.println("Unable to find address for Device 2");
if (!sensors.getAddress(T4, 3)) Serial.println("Unable to find address for Device 3");
if (!sensors.getAddress(T5, 4)) Serial.println("Unable to find address for Device 4");
if (!sensors.getAddress(T6, 5)) Serial.println("Unable to find address for Device 5");
if (!sensors.getAddress(T7, 6)) Serial.println("Unable to find address for Device 6");
if (!sensors.getAddress(T8, 7)) Serial.println("Unable to find address for Device 7");
// show the addresses we found on the bus
Serial.print("Device 0 Address: ");
printAddress(T1);
Serial.println();
Serial.print("Device 1 Address: ");
printAddress(T2);
Serial.println();
Serial.print("Device 2 Address: ");
printAddress(T3);
Serial.println();
Serial.print("Device 3 Address: ");
printAddress(T4);
Serial.println();
Serial.print("Device 4 Address: ");
printAddress(T5);
Serial.println();
Serial.print("Device 5 Address: ");
printAddress(T6);
Serial.println();
Serial.print("Device 6 Address: ");
printAddress(T7);
Serial.println();
Serial.print("Device 7 Address: ");
printAddress(T8);
Serial.println();
}

// fonction pour afficher les adresses
void printAddress(uint8_t deviceAddress[])
{
for (uint8_t i = 0; i < 8; i++)
{
Serial.print(deviceAddress*, HEX);*

  • if (i < 7) Serial.print(" ");*
  • }*
    }
    void loop(void)
    {
    sensors.requestTemperatures(); // envoie de commande de récupération

// lecture de la t° (autant que de capteur dallas - jusqu'a 10 dans exemple)
itoa(sensors.getTempCByIndex(0),buf1,9);
if (!sensors.getAddress(T1, 0))
{
if (sensors.getTempCByIndex(0)<25)

  • {*

  • Serial.print("Terra 1 : ");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(0));*

  • Serial.println(" Chauffage en route ");*

  • }*

  • else*
    {

  • Serial.print("Terra 1 : ");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(0));*

  • Serial.println(" Ventilation en route ");*
    }
    }
    itoa(sensors.getTempCByIndex(1),buf2,9);
    if (!sensors.getAddress(T2, 1))
    {
    if (sensors.getTempCByIndex(1)<25)

  • {*

  • Serial.print("Terra 2 : ");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(1));*

  • Serial.println(" Chauffage en route ");*

  • }*

  • else*
    {

  • Serial.print("Terra 2 : ");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(1));*

  • Serial.println(" Ventilation en route ");*
    }
    }

  • itoa(sensors.getTempCByIndex(2),buf3,9);*

  • if (!sensors.getAddress(T3, 2))*
    {
    if (sensors.getTempCByIndex(2)<25)

  • {*

  • Serial.print("Terra 3 : ");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(2));*

  • Serial.println(" Chauffage en route ");*

  • }*

  • else*
    {

  • Serial.print("Terra 3 :");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(2));*

  • Serial.println(" Ventilation en route ");*
    }
    }

  • itoa(sensors.getTempCByIndex(3),buf4,9);*

  • if (!sensors.getAddress(T4, 3))*
    {
    if (sensors.getTempCByIndex(3)<25)

  • {*

  • Serial.print("Terra 4 : ");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(3));*

  • Serial.println(" Chauffage en route ");*

  • }*

  • else*
    {

  • Serial.print("Terra 4 : ");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(3));*

  • Serial.println(" Ventilation en route ");*
    }
    }

  • itoa(sensors.getTempCByIndex(4),buf5,9);*

  • if (!sensors.getAddress(T5, 4))*
    {
    if (sensors.getTempCByIndex(4)<25)

  • {*

  • Serial.print("Terra 5 : ");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(4));*

  • Serial.println(" Chauffage en route ");*

  • }*

  • else*
    {

  • Serial.print("Terra 5 :"); *

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(4));*

  • Serial.println(" Ventilation en route ");*
    }
    }

  • itoa(sensors.getTempCByIndex(5),buf6,9);*

  • {*

  • if (!sensors.getAddress(T6, 5))*
    {
    if (sensors.getTempCByIndex(5)<25)

  • {*

  • Serial.print("Terra 6 : ");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(5));*

  • Serial.println(" Chauffage en route ");*

  • }*

  • else*
    {

  • Serial.print("Terra 6 : ");*

  • Serial.print("T° : ");*

  • Serial.print(sensors.getTempCByIndex(5));*

  • Serial.println(" Ventilation en route ");*
    }
    }
    }
    }[/quote]
    La carte duemilanove 328
    une proshield ou sont connectés les DS18B20 avec sur le 5v une résistance de 1k, la 4k7 empêchait la reconnaissance des capteurs pour la pin 2
    et les pin 1 et 3 sont sur le GNd de la carte
    les capteurs sont montés en série avec des prises jack audio (peu de longueur), pour pouvoir ajouter au fur et a mesure des besoins de nouveaux capteurs
    alimentation le port usb de la carte (y compris les dallas)
    le problème :
    en mode 9600 bauds, caractrère bizarre en début de programme en 1200 pas de soucis
    il me reconnait bien les 2 capteurs connectés mais sur les autres adresses il me récupère la dernière adresse connue alors que je souhaite aucune
    par contre il ne me ressort aucune valeur pour les Terras 1 et 2 du programme (condition du loop) comme si il n y avait aucun adressage, alors que j ai bien l adressage des capteurs (demandé dans le setup)
    si quelqu un avait une idée, là je sèche
    merci par avance

Yep!

Si je ne me trompe, il te faut un delay() aprés le requestTemperatures, essayes avec 750 ms pour commencer.

...
sensors.requestTemperatures();
delay(750);
...

@+

Zoroastre.

J ai fait un screenshoot :

je viens d'essayé le 750 ms ca ne change rien, mais merci quand même, c'était l impression que ca me donnait au lancement qu il fallait un temps de latence, je ne savais pas le placer, mais le problème est autre à priori

Yep!

Tu devrais tenter de mettre quelques delay() entre tes requetes pour tester.
Tu conserves les 750 ms et ajoutes un delay entre 2 requetes pour voir si cela change quelques choses.

Je pense sincèrement que les commandes sont trop rapides. L'interrogation des ds18b20 réclame du temps, il y a quelques topics dessus dont le but est justement d'accélerer ces requetes (peut-être sur l'ancien forum).

@+

Zoroastre.

Quelqu' un peut me confirmer que l ordre de connexion des ds18b20 voir les onewire ne correspondent pas forcement à l ordre de reconnaissance par la carte
c est à dire que la carte classe par ordre croissant la liste des adresses qu'elles trouvent

et dans ce cas, y a t'il un moyen de contourner le problème dans le sens si je rajoute un nouveau capteur, celui ci doit se retrouver en dernière position de la liste d'adressage

Yep!

Pas sûr qu'il y ait un ordre spécifique. Il faudrait vérifier la bibliothèque mais je n'y croit pas trop !

Il y a un ancien topic ici : http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1209105786

Tu peux également si tu connais les adresses de chacune de tes sondes, les interroger individuellement.

void setup()
{
...
indoor0 = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };
...
}
void loop()
{
...
tempC0 = sensors.getTempC(indoor0);
...
}

Je remarque aussi que j'ai une commande supplémentaire que tu n'as pas implémentée :

DallasTemperature sensors(&oneWire);
DeviceAddress indoor0, indoor1, indoor2, outdoor;

@+

Zoroastre.

Merci pour ta réponse, je pense que je vais attaquer directement les adresses, ca évitera toute dérive lors de rajout de capteur dans le classement des adresses
ton indoor x028,... coresspond à l adresse complète de la rom ?

Yep!

Oui c'est l'adresse d'une de mes sondes.

indoor0 = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

dans ton cas :

T1 = { 0x28, 0xD0, 0x59, 0xFA, 0x1, 0x0, 0x0, 0x7D };

sauf erreur de frappe :wink:

@+

Zoroastre.

Re

j ai un souci, il y a un bout de code à mettre en plus je me faits jetter (je debute) ? :

// Référence t° Dallas
DallasTemperature sensors(&oneWire);
DeviceAddress Terra1, Terra2, Terra3, Terra4, Terra5, Terra6, Terra7;

setup :

//Definition des adresses des capteurs sur terra
Terra1 = { 0x28, 0xD0, 0x59, 0xFA, 0x1, 0x0, 0x0, 0x7D };
Terra2 = { 0x28, 0x91, 0x46, 0xFA, 0x1, 0x0, 0x0, 0x2C };

mais il me sort en erreur :

prog_gestion_terra.cpp: In function 'void setup()':
prog_gestion_terra:79: error: expected primary-expression before '{' token
prog_gestion_terra:79: error: expected ;' before '{' token prog_gestion_terra:80: error: expected primary-expression before '{' token prog_gestion_terra:80: error: expected ;' before '{' token

il bloque sur la première ligne d adresse

Yep!

Désolé c'est de ma faute, j'ai repris bêtement le commentaire de la lib :fearful:

uint8_t indoor0[8] = {0x28, 0xF1, 0xDC, 0x43, 0x2, 0x0, 0x0, 0x3};

@+

Zoroastre.

]:smiley:

je te remercie, je me tapais tous les sites pour comprendre :wink:
bonne soiree

:blush:

il y a un morceaux qu a sauter:
je te remercie de m a voir donner la réponse, :wink:

Yep!

Je relance un moment ce topic car, aprés un an d'absence, je reprends mon code et suis surpris de devoir déclarer manuellement mes DS18B20 dans le loop.
Lorsque je les déclare dans le setup, les sondes ne répondent pas. Est-ce normal ??? Aurais-je loupé quelque chose ?

@+

Zoroastre.

je te mets mon code, si ca peux t aider, comme çà je ne sais pas te répondre, avant je récupère l adressage des db18b20 avec un autre programme, si t en as besoin, je te le mets en post, les miennes sont en mode parasite :

#include <OneWire.h> //librairie Onewire - Port OneWire
#include <DallasTemperature.h> // librairie dallastemperature
#include <ds1307rtc.h> //librairie ds1307 - horloge
#include <Wire.h> //librairie ds1307 - horloge
#include <time.h> //librairie ds1307 - horloge
#include <WProgram.h>

/*
Arduino branchement
Analog Pin 0 = H% Sensor
Analog Pin 1 = H% Sensor
Analog Pin 2 = H% Sensor
Analog Pin 3 = H% Sensor
Analog Pin 4 = SDA pour ds1307
Analog Pin 5 = SCL pour ds1307

Digital Pin 0 = Relais Chauffage Terra 1
Digital Pin 1 = Relais Chauffage Terra 2
Digital Pin 2 = Relais Chauffage Terra 3
Digital Pin 3 = Relais Chauffage Terra 4
Digital Pin 4 = Relais Pompe H% Terra 1
Digital Pin 5 = Relais Pompe H% Terra 2
Digital Pin 6 = Relais Pompe H% Terra 3
Digital Pin 7 = Relais Pompe H% Terra 4
Digital Pin 8 = Relais Lumière Terras
Digital Pin 9 =
Digital Pin 10 =
Digital Pin 11 =
Digital Pin 12 =
Digital Pin 13 = T° Sensor
*/

// Définition pin Analogique capteur H%
int HTerra1 = 0;
int HTerra2 = 1;
int HTerra3 = 2;
int HTerra4 = 3;
int SDA=4;
int SCL=5;

//Définition pin de sortie
int CTerra1 = 0;
int CTerra2 = 1;
int CTerra3 = 2;
int CTerra4 = 3;
int PHTerra1 = 4;
int PHTerra2 = 5;
int PHTerra3 = 6;
int PHTerra4 = 7;
int LTerra = 8;

// Définition pin entrée digital Dallas
#define ONE_WIRE_BUS 13

// Définition communication avec tout matériel Onewire
OneWire oneWire(ONE_WIRE_BUS);

// Référence t° Dallas
DallasTemperature sensors(&oneWire);
uint8_t Terra1[8] = { 0x28, 0xF5, 0x31, 0x53, 0x3, 0x0, 0x0, 0x7A }; // Sonde Terra Rany
uint8_t Terra2[8] = { 0x28, 0xD0, 0x59, 0xFA, 0x1, 0x0, 0x0, 0x7D };
uint8_t Terra3[8] = { 0x28, 0x91, 0x46, 0xFA, 0x1, 0x0, 0x0, 0x2C };
uint8_t Terra4[8] = {};
uint8_t Terra8[8] = { 0x28, 0xEE, 0x1D, 0x63, 0x3, 0x0, 0x0, 0x48 }; // Sonde arduino

// Nuit_Jour Temp
float Temp1Nuit=22.00;
float Temp1Jour=25.00;

//H%
float HHTerra1 = 0.00;
float HHTerra2 = 0.00;
float HHTerra3 = 0.00;
float HHTerra4 = 0.00;
float Humeterra1 = 0.00;
float Humeterra2 = 0.00;
float Humeterra3 = 0.00;
float Humeterra4 = 0.00;

int current;

// Variable buttoir des horaires en secondes
int P_Matin_Min = 29100; // 8h05m00 (8*60*60)+(5*60)+(00)
int P_Matin_Max = 29130; // 8h05m30 (8*60*60)+(5*60)+(30)
int P_Soir_Min = 73800; // 20h30m00
int P_Soir_Max = 73830; // 20h30m30
int G_Journee_Min = 28800; // 08h00m00
int G_Journee_Max= 75600; // 21h00m00

// controle h% toutes les heures de la journée (3600s = 1 heure)
int Hydro9=32400;
int Hydro10=36000;
int Hydro11=39600;
int Hydro12=43200;
int Hydro13=46800;
int Hydro14=50400;
int Hydro15=54000;
int Hydro16=57600;
int Hydro17=61200;
int Hydro18=64800;
int Hydro19=68400;
int Hydro20=72000;
void setup(void)
{

// Démarre le port série
Serial.begin(9600);

// Pin mis en sortie
pinMode(CTerra1, OUTPUT);
pinMode(CTerra2, OUTPUT);
pinMode(CTerra3, OUTPUT);
pinMode(CTerra4, OUTPUT);
pinMode(PHTerra1, OUTPUT);
pinMode(PHTerra2, OUTPUT);
pinMode(PHTerra3, OUTPUT);
pinMode(PHTerra4, OUTPUT);
pinMode(LTerra, OUTPUT);

setSyncProvider(RTC.get);

if(timeStatus()!= timeSet)
Serial.println("Unable to sync");
else
Serial.println("RTC system time ");


Serial.println("Gestion Terra");


// Démarre la librairie
sensors.begin();

}


void loop(void)
{
current = (hour()*60*60) + (minute()*60) + second(); // heure courante en secondes

sensors.requestTemperatures(); // envoie de commande de récupération Temperature

// Recuperation hydrometrie avec alimentation 5v
HHTerra1=(analogRead(HTerra1)*5000.0)/1024.0;
HHTerra2=(analogRead(HTerra2)*5000.0)/1024.0;
HHTerra3=(analogRead(HTerra3)*5000.0)/1024.0;
HHTerra4=(analogRead(HTerra4)*5000.0)/1024.0;

// conversion pourcentage (tension -->3.9v)
Humeterra1=(HHTerra1-800)/31.0;
Humeterra2=(HHTerra2-800)/31.0;
Humeterra3=(HHTerra3-800)/31.0;
Humeterra4=(HHTerra4-800)/31.0;

delay(1000);


//Pulverisation du matin et soir
if ((P_Matin_Min < current && current < P_Matin_Max) || (P_Soir_Min < current && current < P_Soir_Max)) // entre 8h05m00 et 8h05m30 et 19h30m00 et 19h30m30
{
digitalWrite(PHTerra1,HIGH);
digitalWrite(PHTerra2,HIGH);
digitalWrite(PHTerra3,HIGH);
digitalWrite(PHTerra4,HIGH);
}
else
{
digitalWrite(PHTerra1,LOW);
digitalWrite(PHTerra2,LOW);
digitalWrite(PHTerra3,LOW);
digitalWrite(PHTerra4,LOW);
}

Yep!

Merci Stef84 :wink:

En supprimant cette ligne : DeviceAddress indoor; dans les variables globales çà fonctionne.

C'est tout bête en fait !

@+

Zoroastre.