Go Down

Topic: Vos remarques sur ce sketch (Read 1 time) previous topic - next topic

franck29

Mar 15, 2013, 07:30 pm Last Edit: Mar 15, 2013, 07:40 pm by Jean-François Reason: 1
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 :)

Voici le programme:

Code: [Select]
#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();
 }
}

[/color]

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




Avez vous des remarques sur ce premier teste?

Franck





Artouste


...

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  :smiley-mr-green:

franck29

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

Bernardino

dans le code :
Code: [Select]
for (byte i = 0; i < 9; i++)

i est déclaré en byte

A+
Olivier

franck29

#4
Mar 16, 2013, 08:49 am Last Edit: Mar 16, 2013, 09:34 am by franck29 Reason: 1
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:
Code: [Select]
byte i = 0;
for (i = 0; i < 9; i = i + 1)


C'est la même chose que:

Code: [Select]
for (byte i = 0; i < 9; i++)

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...

++
Julien - www.idreammicro.com

68tjs

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.

franck29


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?


68tjs

Quote
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.

skywodd

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.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

franck29

Vous venez d'éclaircir ma lanterne ;)

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?

skywodd


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 ;)
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.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

franck29

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  ;)

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  :~

fdufnews

Quote
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.

Quote
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.

papybricol

Bonsoir,


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

http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ARDUINOINITIATION

très progressif et pédagogique. Chaque ligne de code a sa justification commentée.
...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

Go Up