probleme detection sonde

bonsoir voici mon code il et écrit pour 5 sonde le problème et que si il n y a pas 5 sonde de connectée il ne fonctionne pas j aimerais palie a ce probleme

en quelque sorte si il n y a pas 5 sonde c pas grave il tourne quand meme et indique les sonde non connectée
(sans pour autant suprime les sonde je veut qu il s adapte en quelque sorte )

#include <OneWire.h>
#include <LiquidCrystal.h>
// Broche utilisée pour le bus 1-Wire
OneWire ds(13); // Création de l'objet OneWire ds
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


boolean getTemperature(float *temp){ 
byte data[9], addr[8]; // data : Données lues depuis le scratchpad 
// addr : adresse du module 1-Wire détecté 
if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}

ds.write(0x44, 1); // On lance une prise de mesure de température
delay(100); //tempo rafraichissement // Et on attend la fin de la mesure
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad

for (byte i = 0; i < 9; i++) // On lit le scratchpad
data[i] = ds.read(); // Et on stock les octets reçus
*temp = ((data[1] << 8) | data[0]) * 0.0625; // Calcul de la température en degré Celsius
return true;
}
void setup() {
lcd.begin(20, 4);
pinMode(7, OUTPUT); // sortie relais 1
pinMode(8, OUTPUT); // sortie relais 2
pinMode(9, OUTPUT); // sortie relais 3
pinMode(10, OUTPUT); // sortie relais 4
pinMode(6, OUTPUT); // sortie relais 5
pinMode(13, OUTPUT); // sortie relais ventillateur

}
void loop() {
float temp1;
float temp2;
float temp3;
float temp4;
float temp5;

if(getTemperature(&temp1)) // Lecture des capteurs.
if(getTemperature(&temp2))
if(getTemperature(&temp3))
if(getTemperature(&temp4))
if(getTemperature(&temp5))


{
lcd.setCursor(0, 0); // affichage temp 1
lcd.print("A=");
lcd.print(temp1);
lcd.print((char)223);

lcd.setCursor(12, 0); // affichage temp2 
lcd.print("B=");
lcd.print(temp2);
lcd.print((char)223);

lcd.setCursor(0, 1); // affichage temp3 
lcd.print("C=");
lcd.print(temp3);
lcd.print((char)223);

lcd.setCursor(12, 1); // affichage temp4 
lcd.print("D=");
lcd.print(temp4);
lcd.print((char)223);

lcd.setCursor(0, 2); // affichage temp5
lcd.print("E=");
lcd.print(temp5);
lcd.print((char)223);

lcd.setCursor(0, 3); // affichage temp5
lcd.print("Ventillateur=");
//lcd.print();



} 

//relais temp1 consigne 29°c
if(temp1 > 30) 
{
digitalWrite(7,HIGH); // relais connecté broche 7
lcd.setCursor(0, 0);
lcd.print("A=");
lcd.print(" alarm ");
// delay(100); //ENLEVER SLASH POUR CLIGNOTEMENT
//lcd.setCursor(0, 0);
//lcd.print(" ");
}
else
{
digitalWrite(7,LOW);
}

if(temp2 > 30) //relais temp2 consigne 29°c
{
digitalWrite(8,HIGH); // relais connecté broche 8
lcd.setCursor(12, 0);
lcd.print("B=");
lcd.print(" alarm ");
}
else
{
digitalWrite(8,LOW);

}
if(temp3 > 30) //relais temp2 consigne 29°c
{
digitalWrite(9,HIGH); // relais connecté broche 8
lcd.setCursor(0, 1);
lcd.print("C=");
lcd.print(" alarm ");
}
else
{
digitalWrite(9,LOW);

}
if(temp4 > 30) //relais temp2 consigne 29°c
{
digitalWrite(10,HIGH); // relais connecté broche 8
lcd.setCursor(12, 1);
lcd.print("D=");
lcd.print(" alarm ");
}
else
{
digitalWrite(10,LOW);

}

if(temp5 > 30) //relais temp5 consigne 29°c
{
digitalWrite(6,HIGH); // relais connecté broche 8
lcd.setCursor(12, 1);
lcd.print("E=");
lcd.print(" alarm ");
}
else
{
digitalWrite(6,LOW);
}

//relais ventilateur consigne 25°c

if(temp1 < 20,temp2 < 20,temp3 < 20,temp4 < 20) 
{
digitalWrite(13,HIGH); // relais connecté broche 7
lcd.setCursor(13, 4);
lcd.print(" Off ");
}
else
{
lcd.setCursor(13, 4);
lcd.print(" On ");

// delay(100); //ENLEVER SLASH POUR CLIGNOTEMENT
//lcd.setCursor(0, 0);
//lcd.print(" ");
//}
digitalWrite(13,LOW);
}






{ 


}

return;
}

bonjour,
il ne fonctionne pas, très vague comme piste.
le prog plante, une erreur?
boule cristale cassée depuis 5mn :slight_smile:

peut être a commenter cette ligne pour voir

return false; // Retourne une erreur

rien ne s affiche juste le mots off ....
j aimerais en quelque sorte que si la sonde n et pas detecter le programme marque a l emplacement de la sonde ND mes que les autre temperature s affiche

la si une sonde n et pas branche le programme et en rac ...:confused:

moijerem:
rien ne s affiche juste le mots off ....
j aimerais en quelque sorte que si la sonde n et pas detecter le programme marque a l emplacement de la sonde ND mes que les autre temperature s affiche

la si une sonde n et pas branche le programme et en rac ...:confused:

bonsoir
c'est normal et c'est du à la façon dont tu utilise les adresses 1-Wire
là tu fais de la recherche dynamique à chaque tour
si il n'y a qu'une sonde , il ne lira qu'une sonde, si il y en a 10 ,il en lira 10
si au tour suivant une (ou plusieurs) sonde est deconnectée suppreimée du bus, il lira le nombre de sondes presentes.
dans ton cas ce qu'il faut que tu fasse c'est de faire une affectation fixe des adresse des composants 1-wire .

cela deviendra tres complique non , il faudre donc detecter l adresse de chaque sonde la rentree dans le programme mes je ne vois pas comment :confused:

moijerem:
cela deviendra tres complique non

je pense savoir ce que tu veux faire.
tu prog pour X sondes la carte et suivant ce que veux un copain, client
tu rajoute ou non une sonde
et tout doit se faire automatiquement sans toucher au code
c'est ca?

oui cela serait le top :slight_smile: (et non pas client pour les copain :slight_smile: )

moijerem:
cela deviendra tres complique non , il faudre donc detecter l adresse de chaque sonde la rentree dans le programme mes je ne vois pas comment :confused:

c'est ce qui est couramment utilisé lors de l'utilisation multisonde 1-wire
il y a une procedure de decouverte des sondes et ensuite utilisation des sondes avec leur adresse physique.
ça permet surtout 2 choses :

  • affecter une sonde à un emplacement
  • detecter une sonde HS (ou absente)

avec ta methode tu affecte temp1 a la 1ere sonde lue, temp2 à la 2eme , temp3 à la 3eme ; etc
si pour une raison ou une autre par exemple ta 1ere sonde devient HS c'est la valeur de la sonde 2 qui sera affectée à temp1, et temp2 à sonde3

infobarquee a saisie ce que je voulais realise mes a vrais dire je ne vois pas comment :confused:

moijerem:
infobarquee a saisie ce que je voulais realise mes a vrais dire je ne vois pas comment :confused:

tu a 2 solutions
soit tu fais une lecture d'adresse et tu code en dur leurs adresses , simple mais pas pratique
soit tu prevoit dans ton programme un mode decouverte (par exemple jumper ou switch) un mode decouverte et tu enregistre leurs adresses, une fois sorti du mode decouverte tu adresse sequentiellement tes capteurs par chaque adresse, en cas d'erreur sur une adresse tu la saura.

la deuxieme solution pare excelente mes je ne vois meme pas comment code un mode découverte

mais si j ai bien compris si au démarrage du programme il ce detect en mode apprentissage alors par exemple
branche sonde A
on la branche
branche sonde B
on la branche ..... jusqu au moment ou l on ne veut plus rajouter de sonde et on retire le jumper et la le programme c le nombre de sonde et donc de relais affecte

moijerem:
la deuxieme solution pare excelente mes je ne vois meme pas comment code un mode découverte

mais si j ai bien compris si au démarrage du programme il ce detect en mode apprentissage alors par exemple
branche sonde A
on la branche
branche sonde B
on la branche ..... jusqu au moment ou l on ne veut plus rajouter de sonde et on retire le jumper et la le programme c le nombre de sonde et donc de relais affecte

Je n'ai pas de code sous la main aujourd'hui, mais j'en ai un bout qui traine quelque part.
en fait la phase decouverte consiste simplement à faire du ds.search(addr) de sauvegarder chaque adresse valide trouvée
et en phase exploitation utiliser les adresses prealablement trouvées en utilsant
ds.select(addr); ou addr prend en sequence les adresses initialement decouvertes

oui mes il sera donc obligatoire de monter des bouton pour adresse tout cela :confused:

je pence que infobarquee et sur une piste on verra

moijerem:
oui mes il sera donc obligatoire de monter des bouton pour adresse tout cela :confused:

je pence que infobarquee et sur une piste on verra

Le 1-WIRE est un bus tres agreable, mais c'est comme tout , il a des avantages mais aussi des contraintes .
Tu n'a pas 150 solutions pour "solutionner" ton probleme .

comme le dis Artouste notre Maaaaaitreeeee, il n'y a pas 36000 solutions.
mais le truc est que si tu changes une sonde, il faut lui attitrer un endroit en dur quand même.

je suis donc a votre ecoute

infobarquee:
...
mais le truc est que si tu changes une sonde, il faut lui attitrer un endroit en dur quand même.

Le vrai probleme avec le 1-W est d'affecter un capteur à "un emplacement" physique
en restant sur les capteurs de T° , la partie process la plus importante est de savoir où est "physiquement" le capteur qui renvoie l'info.
dans la methode simpliste utilisée là par majorem
tu ne sais pas en cas de defaillance/absence d'un (plusieurs) capteur "qui fait finalement quoi" 8)

exemple tiré par les cheveux (principe de la methode pierrafeu :grin: )
tu peux te retrouver avec un capteur dans le sejour qui va commander la mise en route du chauffage dans la salle de bain et 10 secondes plus tard le chauffage dans dans la cuisine.

une idée comme ca d'un coup.
entrer en dur dans l'EEPROM les sondes avec leur affectation, comme ca, elles ne bougent pas.
entrer sur une sd les sondes et affectation, si changement de sonde, il suffit de prendre la carte sd et changer dans le fichier la sonde.
plus pratique que de reprogrammer le nono.
t'en pense quoi mon petit Artoustinet? :slight_smile:

possible de cree un mode aprentissage ? avec un jumper ? comme sa chaque sonde et encree en durs a chaque relais

en quelque sort en mode apprentissage branche sonde A .... on la branche branche sonde B on la branche et une fois le nombre de sonde voulu on retire le jumper et le programme et fixe sur le nombre de sonde

infobarquee:
une idée comme ca d'un coup.
entrer en dur dans l'EEPROM les sondes avec leur affectation, comme ca, elles ne bougent pas.
entrer sur une sd les sondes et affectation, si changement de sonde, il suffit de prendre la carte sd et changer dans le fichier la sonde.
plus pratique que de reprogrammer le nono.
t'en pense quoi mon petit Artoustinet? :slight_smile:

qu'il y a plusieurs methodes
et que les methodes peuvent etre differentes selon le projet
Mais In fine , ça ne consiste qu'à acquerir (ou déjà connaitre ) les adresses des compos 1W sur le bus
apres tout de la frequence où le bus doit s'adapter au changement/ajout/suppression de capteur.
et l'approche n'est pas la meme selon s'il s'agit de 4/5 capteurs "chez toi" qui ne vont pas bouger ou d'implanter ici ou là
la meme solution avec des (5 ou X ) capteurs d'adresses differentes.