J’ai réussi à connecter et lire un capteur de température DS18B20 ainsi qu’un capteur de distance ultrasons SR06. Je parviens à lire les informations sur la console de l’arduino.
J’explique ici comment.
Nota : Cet article fait partie d’une série intitulée Niveau d’une cuve de fioul.
J’ai fait les branchements et la programmation en trois temps :
- le capteur de distance ultrason seul ;
- le thermomètre seul ;
- les deux ensemble.
Il y a eu un quatrième temps, dans lequel j’ai tenté de faire passer la communication par bluetooth et non USB mais mon dongle bluetooth pas cher ne fonctionne que par intermittence…
Capteur à ultrason HC SR-06 seul
Je me suis inspirée de http://tiptopboards.free.fr/arduino_forum/viewtopic.php?f=2&t=54
Les connexions (cf schéma grossier) : VCC sur 5V, GND sur ground, « trig » sur pin 9 et« echo » sur pin 8.
Le schéma ci-dessous montre le branchement avec les trois composants. Attention, lorsqu’on communique via USB avec l’arduino, les pins 0 et 1 connectés au capteur bluetooth doivent être déconnectés.
Le sketch de Tiptop boards fonctionne parfaitement.
//********************************************************** // Capteur de distance à ultrasons HC-SR04 avec Arduino Uno // TipTopBoards.com 06 01 2014 Rolland // Càabler +5V et GND du détecteur sur l'arduino // // Trig -> pin 9 // Echo -> pin 8 //********************************************************** #define trigPin 9 //Trig Ultrasons (sortie) #define echoPin 8 //Echo Ultrasons (entrée) void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); //Trig est une sortie pinMode(echoPin, INPUT); //Echo est le retour, en entrée } void loop() { long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(10); digitalWrite(trigPin, HIGH); delayMicroseconds(10); //Trig déclenché 10ms sur HIGH digitalWrite(trigPin, LOW); // Calcul de l'écho duration = pulseIn(echoPin, HIGH); // Distance proportionnelle à la durée de sortie distance = duration*340/(2*10000); //Vitesse du son théorique //Hors de portée (duration) if ( distance <= 0){ //Serial.print(duration); Serial.println("Hors de portee"); } else { Serial.print(distance); Serial.print(" cm "); Serial.print(duration); Serial.println(" ms"); } delay(1000); //0.1 sec entre deux mesures }
Et voici ce qu’on obtient sur la console :
Le thermomètre DS18B20 seul
C’était déjà un peu plus compliqué car je n’ai pas trouvé de sketch arduino tout fait. Il a fallu que je réfléchisse et que je comprenne ce que je faisais 🙂 !
Les sources d’information utilisées
Lorsqu’on veut connecter plusieurs capteurs de température :
- http://playground.arduino.cc/Learning/OneWire
- http://www.strangeparty.com/2010/12/13/arduino-1-wire-temperature-sensors/
Pour un seul capteur comme ici, voir
Pour le branchement du thermomètre, schéma sur http://bildr.org/2011/07/ds18b20-arduino/
Charger une librairie dans l’arduino
Pour pouvoir convertir les mesures en températures, il faut des calculs assez complexes. Il est donc infiniment plus simple d’utiliser des librairies adaptées, qui contiennent les fonctions qu’on utilisera sans même savoir comment elles sont codées.
La librairie principale pour les capteurs de température du type DS18B20 (presque un standard sur arduino) est la librairie Dallas temperature.
Comme je ne voulais connecter qu’un seul thermomètre, je n’avais pas besoin de la librairie one wire. Elle est cependant installée dans le croquis suivant et je n’ai pas vérifié ce qui se passerait si je l’enlevais.
Une fois la librairie téléchargée, il faut aller dans l’éditeur arduino et choisir Croquis / Importer bibliothèque / add library. Il suffit ensuite de choisir le fichier zip ou le répertoire contenant la librairie.
La première fois qu’on téléverse un programme dans l’arduino, ça prend du temps de lui ajouter la librairie. Ensuite, c’est déjà chargé.
le croquis de relevé de température
La source est http://www.milesburton.com/?title=Dallas_Temperature_Control_Library#The_Library, le croquis a été écrit par l’auteur de la librairie Dallas.
La principale modification faite est le delai passé à 2000 dans la dernière ligne de code.
//********************************************************** // Sonde de température DS18B20 avec Arduino Uno // // for multiple sensors, see http://playground.arduino.cc/Learning/OneWire and // http://www.strangeparty.com/2010/12/13/arduino-1-wire-temperature-sensors/ // // here, for only one temperature sensor // source http://www.milesburton.com/?title=Dallas_Temperature_Control_Library#The_Library // blue wire connected to pin 2 //********************************************************** #include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into pin 2 on the Arduino #define ONE_WIRE_BUS 2 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); void setup(void) { // start serial port Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); // Start up the library sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement } void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); // Send the command to get temperatures Serial.println("DONE"); Serial.print("Temperature for Device 1 is: "); Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire delay(2000); }
Ce croquis produit le résultat suivant :
Associer radar ultrason et thermomètre
J’ai associé des éléments des deux croquis précédents :
//********************************************************** // Arduino Uno avec // Capteur de distance à ultrasons HC-SR04 avec Arduino Uno // et thermomètre DS18B20 // // // ultrasons : Trig -> pin 9 // ultrasons : Echo -> pin 8 // température : data : pin 2 //********************************************************** // librairies pour le thermomètre #include <OneWire.h> #include <DallasTemperature.h> // Définir les entrées / sorties // Data wire is plugged into pin 2 on the Arduino #define ONE_WIRE_BUS 2 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); #define trigPin 9 //Trig Ultrasons (sortie) #define echoPin 8 //Echo Ultrasons (entrée) void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); //Trig est une sortie pinMode(echoPin, INPUT); //Echo est le retour, en entrée Serial.println("thermomètre DS18B20 et capteur ultrasons HC-SR04 connectés"); Serial.println("----------- ###### ----------"); // Start up the library sensors.begin(); // IC Default 9 bit. If you have troubles consider upping it 12. Ups the delay giving the IC more time to process the temperature measurement } void loop() { // ultrasons long duration, distance; digitalWrite(trigPin, LOW); delayMicroseconds(10); digitalWrite(trigPin, HIGH); delayMicroseconds(10); //Trig déclenché 10ms sur HIGH digitalWrite(trigPin, LOW); // Calcul de l'écho duration = pulseIn(echoPin, HIGH); // Distance proportionnelle à la durée de sortie distance = duration*340/(2*10000); //Vitesse du son théorique //Hors de portée (duration) if ( distance <= 0){ //Serial.print(duration); Serial.println("Hors de portee"); } else { Serial.print("Capteur ultrasons HC-SR06 : "); Serial.print(distance); Serial.print(" cm "); Serial.print(duration); Serial.println(" ms"); } delay(1000); //0.1 sec entre deux mesures // maintenant mesure la température // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); // Send the command to get temperatures Serial.print("DONE, "); Serial.print("Thermometre 1 : "); Serial.println(sensors.getTempCByIndex(0)); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire delay(2000); }
Ce croquis communique bien la distance à un objet ainsi que la température ambiante :
Ce qu’il me reste à faire
Je veux maintenant que la communication entre PC (et ensuite raspberry Pi) et Arduino soit réalisée par bluetooth et non pas via USB.
Ce sera l’objet du prochain article de cette série Niveau d’une cuve de fioul.
A bientôt.