Vos remarques sur ce sketch

Bonsoir,

Je débute sur ARDUINO et étant intéresser par un projet de relevé de température, j'ai décidé de me faire la main sur
le 1Wire.

J'ai pu trouvé un programme permettant de lire ces sondes. Le principal dans un premier temps est de comprendre ce
que fait le programme et pourquoi il a était écrit comme sa. A la base il était prévu pour une sonde, je l'est modifier
pour lire deux sondes est sa marche :slight_smile:

Voici le programme:

#include <OneWire.h>
#define BROCHE_ONEWIRE 7                                     // Broche utilisée pour le bus 1-Wire
 
OneWire ds(BROCHE_ONEWIRE);                                  // Création de l'objet OneWire ds

 
// Fonction récupérant la température depuis le DS18B20
// Retourne true si tout va bien, ou false en cas d'erreur

 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(800);                                                 // 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
   
  // Pas d'erreur
  return true;
}
 
// setup()
void setup() {
  Serial.begin(9600);                                         // Initialisation du port série
}
 
// loop()
void loop() {
  float temp1;
  float temp2;
   
  
  if(getTemperature(&temp1))                                  // Lecture des capteurs.
  if(getTemperature(&temp2))
  
  {
     
    
    Serial.print("La temperature du capteur 1 est de: ");     // Affichage des températures.
    Serial.print(temp1);
    Serial.write(176);
    Serial.write('C');
    Serial.println();
    Serial.print("La temperature du capteur 2 est de: ");
    Serial.print(temp2);
    Serial.write(176);                                        // Caractère °
    Serial.write('C');
    Serial.println();
  }
}

Et voila ce que cela donne dans le Terminal (je suis sur OSX):

Avez vous des remarques sur ce premier teste?

Franck

franck29:
...

Avez vous des remarques sur ce premier teste?

bonsoir
Puisque cela fonctionne bien , il n'y a pas grand chose à ajouter sur le sketch.

Un bon exercice avec les capteurs de T° pour apprécier les dispersions
mettre les 2 ds18B20 face a face , les entourer d'un peu de papier alu, mettre ça dans un bocal
et faire des relevés sur un longue periode , quelquefois il y a des grosses surprises concernant les ecarts :grin:

J'essaye de comprendre, dans la boucle "for" comment ce fait il que la variable "i" n'est nul
par déclaré?

dans le code :

for (byte i = 0; i < 9; i++)

i est déclaré en byte

A+
Olivier

Est ce spécifique au 1Wire le "Byte"?

Car dans les cours que j'ai pu lire il n'est pas mentionner.

Si on écrit:

byte i = 0;
for (i = 0; i < 9; i = i + 1)

C'est la même chose que:

for (byte i = 0; i < 9; i++)

Salut,

Le type byte n'est pas spécifique au 1-Wire. Il représente simplement un entier non signé codé sur 8 bits qui peut prendre une valeur allant de 0 à 255.

Les deux écritures de ta boucle for sont équivalentes. Personnellement je préfère la seconde qui permet de réduire la portée de la variable i à la boucle for. C'est à dire qu'en dehors de la boucle, la variable est inconnue au bataillon. Quand on début, le principal est d'utiliser ce qu'on comprend le mieux...

++

byte = octet en français
oct = racine linguistique de 8 -> système octal, octogone etc ...

L'octet (comme le CHAR) est utilisé à la place de l'INT parce que la longueur d'un INT dépend du compilateur utilisé. Un INT peut occuper 1 ou plusieurs octets.

AMHA il préférable d'utiliser les définitions beaucoup plus typés : int8_t (8 pour 8 bits -> 1 octet), int16_t (16 pour 16 bits-> 2octets) qui existent aussi en déclinaison non signée uint8_t, uint16_t.

SesechXP:
Salut,

Le type byte n'est pas spécifique au 1-Wire. Il représente simplement un entier non signé codé sur 8 bits qui peut prendre une valeur allant de 0 à 255.

Les deux écritures de ta boucle for sont équivalentes. Personnellement je préfère la seconde qui permet de réduire la portée de la variable i à la boucle for. C'est à dire qu'en dehors de la boucle, la variable est inconnue au bataillon. Quand on début, le principal est d'utiliser ce qu'on comprend le mieux...

++

Ma démarche peu vous sembler un peu bizarre mais je ne suis pas encore coutumier des "raccourcie" du langage C.

Donc j'essaye pour comprendre de ré écrire chaque ligne un peu moins "propre" comme vous dites. Mais sa m'aide
à mieux comprendre ce que fait chaque ligne.

Par exemple je ne sais pas ce que signifie ds.write, ds.select(addr) même si je comprend à peu près à quoi sa
sert dans le programme. Mais ce genre de chose n'est pas mentionner non plus dans le cours du site du Zéro.

Pouvez vous m'en dire un peu plus?

Mais ce genre de chose n'est pas mentionné non plus dans le cours du site du Zéro

C'est normal le site du zéro est généraliste.

Dans ton cas tu utilises une bibliothèque spécialisée pour un composant bien particulier.
Il faut donc aller voir à l'intérieur de la bibliothèque car en général dans l'univers Arduino les créateurs de bibliothèque oublient d'écrire une documentation digne de ce nom.

Bonjour,

"La temperature du capteur 2 est de: " -> F("La temperature du capteur 2 est de: ")
La macro F() est une spécialité arduino 1.0.x qui permet de mettre une chaine de caractères constante en mémoire flash et non en RAM.

Sinon je ne vois rien d'autre à dire personnellement.

Vous venez d'éclaircir ma lanterne :wink:

Une question un peu plus général. Ce que j'ai du mal à comprendre c'est la structure du programme.

Le sketch que j'utilise pour notre exemple, comment la personne qui la écrit a su dans quelle ordre
les lignes de code devait s'imbriquer les unes après les autres?

Il y a sûrement une logique à sa, vous pouvez m'aiguiller?

franck29:
Le sketch que j'utilise pour notre exemple, comment la personne qui la écrit a su dans quelle ordre
les lignes de code devait s'imbriquer les unes après les autres?

Ça c'est de l'algorithmique et de la réflexion.
La documentation du constructeur dit comment marche le capteur et comment/dans quel ordre faire les choses.
Ensuite c'est juste de la mise en application de la théorie avec du code arduino.

PS: vu les commentaires je reconnais le code de mon tutoriel sur le DS18B20 :wink:
Un début d'explication sur la logique du code est donné dedans, le reste c'est de la mise ne pratique de périphériques 1Wire mais je ne le détails pas.

Oui effectivement c'est bien de votre site qu'il provient, j'espère ne violer aucun droit?

De tous ceux que j'ai pu trouver, c'est le votre qui est le plus dictatique. Merci de mètre
votre travail à disposition de personne comme moi :wink:

Donc la structure d'un programme est donné par le constructeur du produit que l'on utilise.
Que ce soit un capteur ou bien un afficheur LCD je suppose?

Si ce que propose le Site du Zéro est "généraliste", dans ce cas vers quoi doit je me tourner
pour pouvoir (un jour) écrire moi même un sketch comme le votre?

Car ce qui me fait le plus défaut à l'heure actuel c'est par quoi commencer l'écriture d'un
programme :~

Donc la structure d'un programme est donné par le constructeur du produit que l'on utilise.
Que ce soit un capteur ou bien un afficheur LCD je suppose?

Oui et non.
La forme du programme dépend aussi de ce que tu veux faire.

Car ce qui me fait le plus défaut à l'heure actuel c'est par quoi commencer l'écriture d'un programme

Un programme cela démarre toujours par une idée et du papier et un crayon. L'idée c'est ce que tu veux faire. Le papier c'est pour formaliser le besoin et la démarche pour y arriver.
On fixe les entrées et les sorties. On détaille la manière de transformer l'information d'entrée en donnée de sortie.
On détaille les opérations. On analyse les documents fournis par les constructeurs pour déterminer comment mettre en oeuvre les capteurs ou les actuateurs.
A ce stade ce n'est pas encore du code C c'est du bon français. Cela permet de bien structurer les idées.
Ensuite on commence à chercher si des librairies existent qui pourraient couvrir nos besoins et nous éviter une partie du travail.
El là on va commencer à coder réellement. On écrit des petits morceaux de programme. Une fonction ou deux à la fois et on les teste pour vérifier qu'elles font bien ce que l'on en attend.
Puis on accole les petits morceaux les uns aux autres pour finir.

Bonsoir,

Voici des exemples de programmes simples avec la description des actions souhaitées en langage naturel et leur traduction en code Arduino.

très progressif et pédagogique. Chaque ligne de code a sa justification commentée.

Je suis sur ce site justement.

J'ai réussi à modifier le programme avec la Led et le Bouton. J'ai rajouté une seconde Led et j'ai
fait en sorte que le bouton non enfoncé = led verte allumé et bouton enfoncé = led rouge allumé.

// Déclaration des constantes

const int bouton = 2;     
const int led_verte = 3;
const int led_rouge = 4;      

// Déclaration des variables

int etatBouton = 0;                   // variable pour le statu du bouton

// Initialisation du programme

void setup() {
  
  pinMode(led_verte, OUTPUT);          
  pinMode(led_rouge, OUTPUT);  
  pinMode(bouton, INPUT);     
}

// Fonction loop: coeur du programme ce répétant sans cesse

void loop() {

  etatBouton = digitalRead(bouton);    // on lit l'état du bouton, enfoncé ou pas

  if (etatBouton == HIGH) {            // si bouton non enfoncé (pin 2 niveau haut) on allume la led verte
    digitalWrite(led_verte, HIGH);
    digitalWrite(led_rouge, LOW);
  } 
  if (etatBouton == LOW) {             // si bouton enfoncé (pin 2 niveau bas) on allume la led rouge                                                       
    digitalWrite(led_verte, LOW);
    digitalWrite(led_rouge, HIGH);
  }
  
}

L'écriture vous semble correct?

Je viens de comprendre aussi à quoi serve les fonctions "digitalWrite" et "digitalRead". Elle permette de lire
l'état d'une Pin ou de changer son état.

Par contre, en début de programme nous n'avons pas à inclure une bibliothèques. Cela signifie t'il que c'est
deux fonctions donnée en exemple font partie du langage naturel du C?

Non, pas dans le C de base, mais elles sont dans le "paquet" Arduino de base, surajouté au C.
comme d'autres fonctions, instructions:

Les bibliothèques, en option, correspondent à des usages spécifiques, fonction des "shields", capteurs ou actuateurs ajoutés à la carte Arduino.
Libraries - Arduino Reference (les plus courantes)

L'écriture est correcte (attention: point de vue d'un bricoleur :cold_sweat: sans formation académique!)
Au début ne cherche pas à faire un code plus compacte, mais moins facile à appréhender.

Cela signifie t'il que c'est deux fonctions donnée en exemple font partie du langage naturel du C?

Jette un oeil dans le répertoire de l'IDE et tu auras tous les fichiers ajoutés par "Arduino" et qui constituent la "bibliothèque arduino"

chez moi sous Linux c'est :
arduino/hardware/arduino/cores/arduino

sous Win ce ne doit pas être trop différent.

Listage :
Arduino.h HardwareSerial.cpp IPAddress.h Platform.h Server.h Udp.h USBDesc.h wiring.c wiring_shift.c
binary.h HardwareSerial.h main.cpp Printable.h Stream.cpp USBAPI.h WCharacter.h wiring_digital.c WMath.cpp
CDC.cpp HID.cpp new.cpp Print.cpp Stream.h USBCore.cpp WInterrupts.c wiring_private.h WString.cpp
Client.h IPAddress.cpp new.h Print.h Tone.cpp USBCore.h wiring_analog.c wiring_pulse.c WString.h