Total-Informatique

Le blog de sablier94

Graphique pour mesure de température DS18B20

novembre 23rd, 2013

J’avais commandé mon capteur de température waterproof depuis longtemps et j’ai enfin fait ce que je voulais en faire : des enregistrements de la température de mon aquarium avec un graphique disponible sur Internet.

Graphique de la température de mon aquarium en octobre

Graphique de la température de mon aquarium en octobre

Comme certains le savent peut-être j’ai un aquarium de 120 litres chez moi. Mon objectif est de faire plusieurs petits projets domotique pour mon aquarium (vérification de l’eau, distribution de nourriture, gestion de l’éclairage, …) et avec le matériel que j’avais actuellement j’ai commencé par utiliser mon capteur de température waterproof.

Pour réaliser ce projet vous aurez besoin de :

  • Un Arduino (l’Uno par exemple)
  • Un shield Ethernet compatible avec votre Arduino et un câble
  • Un capteur de température waterproof DS18B20
  • Un chargeur de smartphone pour l’alimentation
  • Une résistance entre 4.7 kΩ et 10 kΩ
  • Une breadboard (shield ou non) ou quelque chose pour brancher tout ça

Pour le capteur de température j’ai pris un Dallas DS18B20 waterproof qui est dans une protection métallique muni d’un câble d’un mètre.

Capteur DS18B20 waterproof

Capteur DS18B20 waterproof

Au début je pensais partir sur une solution « maison » avec un petit site web PHP qui reçoit les données et qui en fait un graphique. Cette solution aurait été la plus évolutive mais aussi la plus longue à réaliser. Ensuite je me suis rappelé que j’avais trouvé, via Twitter, un service web qui proposait ce que je voulais faire : http://open.sen.se. Pour l’instant il est encore en bêta mais vous pouvez demander facilement une invitation.

Comment cela fonctionne ? Tout d’abord il faut savoir quelle sera votre source de données. Pour ma part elle viendront d’un Arduino et par chance il proposent justement un code spécifique qui s’occupe de tout. Commencez par créer un « Channel Arduino-based » et remplissez les questionnaires qui vous demande le type des données qui sera envoyées et de quelle façon. Pour mon projet j’ai utilisé le type « Température » donc des nombres en C° en input. Ensuite allez dans l’onglet de vos appareils et éditez-le pour mettre « Ethernet connected Arduino ». Pour le numéro du pin c’est égal parce que nous allons modifier le code. Vous pouvez donc télécharger votre programme.

Passons maintenant au montage de la partie électronique. Pour les branchements vous pouvez suivre ce schéma :

Schéma du montage

Schéma du montage

Pour des informations complémentaires vous pouvez aller sur l’excellent blog de skywodd, la partie de récupération de la température du capteur est tirée de son code : http://skyduino.wordpress.com/2012/04/26/arduino-capteur-de-temperature-ds18b20/

Ensuite ajoutez les 2 shields à l’Arduino, branchez-le au secteur via un adaptateur USB (5V, entre 500 et 1A) et le câble Ethernet à votre routeur. Fixez le capteur de façon à ce que seulement la partie en métal soit dans l’eau. Je pensais que je pouvais aussi mettre une partie du câble dans l’eau mais bizarrement d’après mes tests il semblerait que non (la température retournée = 0).

Voilà ce que ça donne une fois que tout est connecté :

Branchements sur la breadboard

Branchements sur la breadboard

Si l’on analyse le code fourni par open.sen.se, on voit qu’au démarrage du sketch il va prendre automatiquement une IP via le DHCP et envoyer les données d’une variable tous les x temps. Il faut donc modifier le code pour qu’il envoie la température toutes les 2 heures. Voilà ce que ça donne après quelques modifications pour que l’envoi des données fonctionne correctement :

<br />//Une partie du code est générée par le service open.sen.se et une autre provient<br />// de l'article suivant http://skyduino.wordpress.com/2012/04/26/arduino-capteur-de-temperature-ds18b20/<br />//Pour la mise en place et l'utilisation de ce code, merci de voir http://total-informatique.com/graphique-pour-mesure-de-temperature<br /><br />#include &lt;SensuinoEth.h&gt;<br />#include &lt;SensuinoSerial.h&gt;<br />#include &lt;Ethernet.h&gt;<br />#include &lt;SPI.h&gt;<br />#include &lt;OneWire.h&gt; // Inclusion de la librairie OneWire<br /><br />#define DS18B20 0x28     // Adresse 1-Wire du DS18B20<br />#define BROCHE_ONEWIRE 7 // Broche utilisée pour le bus 1-Wire<br /><br />SensuinoEth pf;<br />const long int device_id = 16650; // This is your device's ID<br />const unsigned long int feed_44996 = 44996; // This is the feed "temperature-sensor"<br />unsigned long timeRef;<br />int val = 0;<br />char buffer[30];<br /><br />OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds<br /><br />// Fonction récupérant la température depuis le DS18B20<br />// Retourne true si tout va bien, ou false en cas d'erreur<br />boolean getTemperature(float *temp){<br /><%%KEEPWHITESPACE%%>  byte data[9], addr[8];<br /><%%KEEPWHITESPACE%%>  // data : Données lues depuis le scratchpad<br /><%%KEEPWHITESPACE%%>  // addr : adresse du module 1-Wire détecté<br /><%%KEEPWHITESPACE%%>  if (!ds.search(addr)) { // Recherche un module 1-Wire<br /><%%KEEPWHITESPACE%%>    ds.reset_search();    // Réinitialise la recherche de module<br /><%%KEEPWHITESPACE%%>    return false;         // Retourne une erreur<br /><%%KEEPWHITESPACE%%>  }<br /><%%KEEPWHITESPACE%%>  if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue<br /><%%KEEPWHITESPACE%%>    return false;                        // Si le message est corrompu on retourne une erreur<br /><%%KEEPWHITESPACE%%>  if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20<br /><%%KEEPWHITESPACE%%>    return false;         // Si ce n'est pas le cas on retourne une erreur<br /><%%KEEPWHITESPACE%%>  ds.reset();             // On reset le bus 1-Wire<br /><%%KEEPWHITESPACE%%>  ds.select(addr);        // On sélectionne le DS18B20<br /><%%KEEPWHITESPACE%%>  ds.write(0x44, 1);      // On lance une prise de mesure de température<br /><%%KEEPWHITESPACE%%>  delay(800);             // Et on attend la fin de la mesure<br /><%%KEEPWHITESPACE%%>  ds.reset();             // On reset le bus 1-Wire<br /><%%KEEPWHITESPACE%%>  ds.select(addr);        // On sélectionne le DS18B20<br /><%%KEEPWHITESPACE%%>  ds.write(0xBE);         // On envoie une demande de lecture du scratchpad<br /><%%KEEPWHITESPACE%%>  for (byte i = 0; i &lt; 9; i++) // On lit le scratchpad<br /><%%KEEPWHITESPACE%%>    data[i] = ds.read();       // Et on stock les octets reçus<br /><%%KEEPWHITESPACE%%>  // Calcul de la température en degré Celsius<br /><%%KEEPWHITESPACE%%>  *temp = ((data[1] &lt;&lt; 8) | data[0]) * 0.0625;<br /><%%KEEPWHITESPACE%%>  // Pas d'erreur<br /><%%KEEPWHITESPACE%%>  return true;<br />}<br /><br />void setup() {<br /><%%KEEPWHITESPACE%%>  Serial.begin(9600);<br /><%%KEEPWHITESPACE%%>  byte err;<br /><%%KEEPWHITESPACE%%>  // Use the following if you don't want to use DHCP<br /><%%KEEPWHITESPACE%%>  // pf.init(&amp;err, 0, "aa:bb:cc:dd:ee:ff", "192.168.1.150", "192.168.1.1");// First IP is for the Arduino, second IP is for the gateway<br /><%%KEEPWHITESPACE%%>  pf.init(&amp;err, 1, "aa:bb:cc:dd:ee:ff");<br /><%%KEEPWHITESPACE%%>  delay(1000);<br /><%%KEEPWHITESPACE%%>  pf.setSenseKey("YourSenseKey");// This is your sense key<br /><%%KEEPWHITESPACE%%>  /* We set the PINs */<br /><%%KEEPWHITESPACE%%>  pinMode(0, INPUT);<br /><%%KEEPWHITESPACE%%>  Serial.println("Init done");<br /><%%KEEPWHITESPACE%%>  // For each output feed, get the last value and trigger the right PIN on the arduino<br /><%%KEEPWHITESPACE%%>  //We listen for incoming events on the device<br /><%%KEEPWHITESPACE%%>  pf.longPollSense(device_id);<br /><%%KEEPWHITESPACE%%>  // Init timeRef<br /><%%KEEPWHITESPACE%%>  timeRef = millis();<br />}<br /><br />void loop() {<br /><br /><%%KEEPWHITESPACE%%>  float temp;<br /><br /><%%KEEPWHITESPACE%%>  // Lit la température ambiante à ~1Hz<br /><%%KEEPWHITESPACE%%>  if(getTemperature(&amp;temp)) {<br /><%%KEEPWHITESPACE%%>     val = temp;<br /><%%KEEPWHITESPACE%%>  }<br /><br /><%%KEEPWHITESPACE%%>  byte _check = pf.longPollCheck();<br /><%%KEEPWHITESPACE%%>    if(_check == 0) {<br /><%%KEEPWHITESPACE%%>      pf.longPollSense(device_id);<br /><br /><%%KEEPWHITESPACE%%>      unsigned long int feed_id = pf.getLastFeedId();<br /><%%KEEPWHITESPACE%%>      char *str = pf.getLastValue();<br /><br /><%%KEEPWHITESPACE%%>    } else if(_check == 2) {<br /><%%KEEPWHITESPACE%%>      pf.longPollSense(device_id);<br /><%%KEEPWHITESPACE%%>    }<br /><br /><%%KEEPWHITESPACE%%>    // Send the values from input feeds every hour or so<br /><%%KEEPWHITESPACE%%>    if (millis() - timeRef &gt; 1800000) {<br /><br /><%%KEEPWHITESPACE%%>      Serial.println("POST value for feed temperature-sensor");<br /><br /><%%KEEPWHITESPACE%%>      if(temp &gt; 15 &amp;&amp; temp &lt; 35)<br /><%%KEEPWHITESPACE%%>      {<br /><%%KEEPWHITESPACE%%>        dtostrf(val, 3, 1, buffer); //Pour avoire les décimales, au lieu de : sprintf(buffer,"%d",val);<br /><%%KEEPWHITESPACE%%>        Serial.println("Posting in feed temperature-sensor");<br /><%%KEEPWHITESPACE%%>        if(pf.postSense(feed_44996, buffer)) {<br /><%%KEEPWHITESPACE%%>          Serial.println("POST in feed temperature-sensor succeeded");<br /><%%KEEPWHITESPACE%%>        } else {<br /><%%KEEPWHITESPACE%%>          Serial.println("POST in feed temperature-sensor failed");<br /><%%KEEPWHITESPACE%%>        }<br /><%%KEEPWHITESPACE%%>      }<br /><%%KEEPWHITESPACE%%>      else<br /><%%KEEPWHITESPACE%%>      {<br /><%%KEEPWHITESPACE%%>        Serial.println("Temperature is not correct !");<br /><%%KEEPWHITESPACE%%>      }<br /><br /><%%KEEPWHITESPACE%%>      timeRef = millis();<br /><%%KEEPWHITESPACE%%>    }<br /><br /><%%KEEPWHITESPACE%%>  delay(5000);<br />}<br />

Il me reste un problème, c’est que les données de mon graphique ne sont pas décimales mais sont des entiers. Même si cela me suffit j’aurais bien voulu avoir plus de précision mais je n’ai pas encore trouvé qu’est-ce qu’il fallait modifier.

En bonus, voici une petite photo de mon aquarium :

Aperçu de mon aquarium

Aperçu de mon aquarium

Même si le projet d’open.sen.se semble au point mort, je pense que ça pourrait devenir un outil vraiment utile pour beaucoup de monde. Pour voir le graphique de la température de mon aquarium, suivez ce lien : http://open.sen.se/sablier94-fish-tank-data/. Une autre fonctionnalité d’open.sen.se est de pouvoir exporter son graphique au format HTML, voyez ce que ça donne :

 

Your email address will not be published. Required fields are marked *

*

Total-Informatique

Le blog de sablier94