Récupération d'adresse DS18B20 dans un tableau

Bonjour à tous,
J'ai un réel soucis par rapport au tableau.

J'explique en gros ce que je veux que mon programme fasse.

  • Lire une adresse de sonde DS18B20 par la fonction readAdress()
  • A chaque nouvelle sonde détectée, celle-ci devrait stocker son adresse dans un tableau nommé tableauAdress[][] ( maximum 3 sondes pour mon programme.) Et vérifier sont code CRC8.
  • A l'aide du tableau d'adresse ainsi créé, je voudrais lire les températures des sondes.

Je crée une méthode readAdress qui emploie la fonction Search() de la librairie OneWire. Celle-ci stocke l'adresse de la sonde dans une variable nommée adress ( déclaration : byte adress[9])
Cette adresse devrait se stocker dans un tableau de 2 dimension ( déclaration : byte tableau [][9])
Ainsi tableau[0] stockerais la première adresse
tableau[1] la deuxième,...
Pour cela, j'ai créé la fonction constructionTableau() qui copie les élément de adresse et par une boucle for() la mets dans ce tableau.
J'ai testé cette méthode et elle a l'air fonctionnelle. ( je print les éléments de tu tableau créé pour vérifier et c'est la même chose que adress ).

Mon problème arrive malheureusement.
Quand je reprend mon tableau ainsi créé ( donc après avoir appellé readAdress() ), celui-ci me place un "0" avant chaque byte enregistré et je ne sais pas pourquoi . C'était avant, je sais pas pourquoi, j'ai changé quelque chose et maintenant, je n'ai que des "0".
Le programme :

#include <OneWire.h>
int pin=3;;
byte tableauAdress[2][9];// si adress[9] != 1, adresse non valide
OneWire leCapteur(pin);
void setup(){
  Serial.begin(9600);
}
void loop(){
  readAdress(leCapteur,tableauAdress);
  
  delay(3000);
  Serial.println(" ");
  Serial.print("ROMtrafique =");// le ROMtrafique devrait correspondre avec mes adresse créé par readAdress()
  for( int i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(tableauAdress[0][i], HEX);
   
  }
  Serial.println("capteur 1 :");
  Serial.println(getTemp(tableauAdress[0],leCapteur));
  Serial.println("capteur 2 :");
  Serial.println(getTemp(tableauAdress[0],leCapteur));
  delay(3000);
}
// a faire dans le setup()

//Rempli un tableau adress du capteur et la vérifie
void constructionTableau(byte tableau[][9],byte adress[9],byte b){
  for( int i = 0; i < 8; i++) {
    tableau[b][i]=byte(adress[i]);
    }
    for( int i = 0; i < 8; i++)
    Serial.write(' ');
    delay(500);
    Serial.print(tableau[b][i], HEX);
  }
  Serial.println(" ");
}
//Construit un tableau d'adresse de max 3 oneWire ( à cause du switch pour le moment )
boolean readAdress(OneWire capteur,byte tableau[][9]){// lit l'adresse et regarde si elle est correcte
byte adress[9];
byte b = 0;
  while(capteur.search(adress)&& b<sizeof(tableau)){//construit le tableau avec l'adresse et retourne true si "ok"
  b++;
  switch (b){
    case 0 :
      constructionTableau(tableau,adress,b);
      break;
    
    case 1:
      constructionTableau(tableau,adress,b);
      break;
    
    case 2:
      constructionTableau(tableau,adress,b);
      break;
    
  }
    
  if(capteur.crc8(adress,7)!=adress[7]){
    adress[9]=1;
    Serial.print("error dans le crc8");
    return false;
  }
   Serial.print("ROM =");// ici je print l'adresse courante pour la vérifier avec constructionTableau()
  for( int i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(adress[i], HEX);
  }
  Serial.println(" ");
  }
  adress[9]=1;//signifie true
  return true;
}

La fonction getTemp(), n'a pas été mise car elle ne sert à rien pour mon problème :wink:

Ce que me renvoie mon arduino :

28 5E 49 BC 4 0 0 24 // ce qu'enregistre le tableau[b][i]
ROM = 28 5E 49 BC 4 0 0 24 // On remarque que c'est correcte, les bytes sont bien enregistré car égal au ROM
 28 77 9B BD 4 0 0 56 // deuxième capteur pareil
ROM = 28 77 9B BD 4 0 0 56 
 
ROMtrafique = 0 0 0 0 0 0 0 0 // Là, je rappelle mon talbeauAdress pour vérifier l'adresse enregister. Et bien, rien n'est enregistre
capteur 1 :
-5.00 // le -5 indique dans le getTemp ( non fourni ) une erreur dans l'adresser renvoyée
capteur 2 :
-5.00

Merci à tous pour votre aide

Là il y a une erreur

byte b = 0;
  while(capteur.search(adress)&& b<sizeof(tableau)){//construit le tableau avec l'adresse et retourne true si "ok"
  b++;
  switch (b){
   ......

Tu incrémentes b avant le switch. Du coup il n'y aura jamais rien dans la ligne 0 du tableau puisque tu n'entres jamais dans le case 0.
Il faudrait placer cette incrémentation avant l'accolade qui ferme le while

      Serial.println(" ");
      b++;
  }
  adress[9]=1;//signifie true

Conseil:
pour le debug de fonctions manipulant des tableaux, ne pas oublier de faire imprimer les index des tableaux en plus du contenu de celui-ci.

Merci fdufnews :D, c'était tout simplement le b qui était mal placé.

Par contre, mon idée de rajoute une unité au tableau ( donc au lieu que adress soit un tableau de byte 8, j'ai fait un de 9) ça ne fonctionne pas.
Enfait, tout va bien jusqu'à la mesure de température. Quand on appelle l'adresse et que l'on fait la commande capteur.select(adress), il faut que l'adresse soit un tableau de 8 éléments. Un tableau de 9 créé un perturbation et fait déconner tout le truc.

C'est assez bizarre je trouve ... Mais je suppose que c'est parce que certaine librairie OneWire ont un système de reconnaissance d'adresse plus haute que 64bits. Ce qui fait que l'adresse devient fausse et que donc le reste devient faux ;).

Je vais essayer de remettre cela au propre et de créé un système qui me dit si oui ou non mon adresse est réellement bien enregistre. Mais normalement cela fonctionne car sinon, cela enverra false.
Le seul soucis de mon programme c'est que si 1 capteur sur 10 déconne, les autres sont automatiquement "false" aussi.

Voilà :slight_smile:

renaudyes:
Par contre, mon idée de rajoute une unité au tableau ( donc au lieu que adress soit un tableau de byte 8, j'ai fait un de 9) ça ne fonctionne pas.

On ne peut pas juger car tu n'as pas mis le code de getTemp.

renaudyes:
En fait, tout va bien jusqu'à la mesure de température. Quand on appelle l'adresse et que l'on fait la commande capteur.select(adress), il faut que l'adresse soit un tableau de 8 éléments. Un tableau de 9 créé un perturbation et fait déconner tout le truc.

Surprenant, la librairie ne lit que les 8 premiers éléments du tableau passé en argument.
Quelle perturbation?

La perturbation ce fait au niveau de la lecture de la 9ème "case" du tableau.
Enfait, quand mon adresse récupérée était correcte, j'avais un bout de code faisant :
tableau[8]=byte(1); ( ce qui écrivait 1 sur la case 9)
et 0 quand c'était faux.
Or la lecture de l'adresse avec la fonction select(array) me renvoyait l'erreur d'un array trop grand.
Donc, qui ne lit pas au dessus des tableau[8].

Je n'ai pas cherché beaucoup plus loin. j'ai donc créé une nouvelle variable de type bolean qui se charge du travail. Cependant cette méthode est moins jolie, et je pense, légèrement plus lente.

Mais cela reste fonctionnelle. Sachant que je n'appelle qu'une fois cette fonction :wink: