Pages: [1] 2   Go Down
Author Topic: Vos remarques sur ce sketch  (Read 1426 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley

Voici le programme:

Code:
#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




« Last Edit: March 15, 2013, 01:40:39 pm by Jean-François » Logged

Offline Offline
Faraday Member
**
Karma: 33
Posts: 4964
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 1
Posts: 69
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

i est déclaré en byte

A+
Olivier
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
byte i = 0;
for (i = 0; i < 9; i = i + 1)

C'est la même chose que:

Code:
for (byte i = 0; i < 9; i++)
« Last Edit: March 16, 2013, 03:34:48 am by franck29 » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

++
Logged


France S-O
Offline Offline
Edison Member
*
Karma: 41
Posts: 2173
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?

 
Logged

France S-O
Offline Offline
Edison Member
*
Karma: 41
Posts: 2173
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vous venez d'éclaircir ma lanterne smiley-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?
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-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  smiley-confuse
Logged

France
Offline Offline
Faraday Member
**
Karma: 36
Posts: 3422
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Bretagne
Offline Offline
Full Member
***
Karma: 2
Posts: 196
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

...ils embarquèrent la logique, coupèrent les cordons, alors, libérés de leurs chaînes, une immensité s'ouvrait devant eux...

Pages: [1] 2   Go Up
Jump to: