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:
#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):
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
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.
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.
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.
"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.
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
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
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.
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 sans formation académique!)
Au début ne cherche pas à faire un code plus compacte, mais moins facile à appréhender.