Enregistreur de données

Portrait de gillou

Bonjour,

Pour mon projet de traitement des parasites des abeilles, j'ai besoin dans un premier temps d'enregistrer des données venant de capteur disposé dans une ruche, temperature, humidité , co2 ....

Je me suis inspiré de la video de u=ri  https://www.youtube.com/watch?v=M9VvsFL-vZI

Le programme fonctionne bien , je vais l'adapté aux capteurs que j'ai besoin mais j'ai un souci sur le format des valeurs transmisent dans le fichier .csv

les valeurs sont inscrite avec un point comme separateur decimal  /  21.02 par exemple et libre office ne reconnait pas ces valeurs comme un nombre. Cela ne me permet pas de realiser des courbes ou des calculs par la suite. Sur excel idem.

Peu être avez vous une solution a me proposer pour que je puisse utiliser ces données sur un de ces tableurs.

Merci

Gilles

Portrait de Anonyme

Bonjour Gillou , il faut simplement remplacer les points par des virgules !

La syntaxe est MaChaine.replace(".",",");

Voici le code Modifié mais attention le fichier change de nom donnees.txt au lieu de donnees.csv !

Attention humidite est un nombre réel mais Humidite est une chaîne idem pour temperature et Temperature

Je n'ai pas testé la modif mais il ne doit pas y avoir de problème sinon donne moi ici le souci rencontré.

/****************************************
 * ENREGISTREUR DE DONNEES
 * le 03.04.2016
 * par Alexandre Pailhoux
 * modifié par Wolfram69
 * Ce programme permet de sauvegarger vos données au format txt sur une carte SD.
 * Vous pouvez ensuite ouvrir le fichier DONNEES.txt sous excel et créer facilement un graphique.
 * Cet exemple est adapté pour la lecture d'un capteur DHT
 *
 * Nécessite les libraires DS3231 et DHT
 * Schéma de cablâge disponible sur www.les-electroniciens.com
 *
 * Besoin d'aide? http://www.les-electroniciens.com/forum  
 */

/**************************************
 * Librairies
 */
#include <SD.h>
#include <SPI.h>
#include <DS3231.h> //Librairie à installer
#include "DHT.h"    //Librairie à installer

/**************************************
 * Affectation des broches
 */
#define CS_PIN 10
#define DHTPIN 2
#define DHTTYPE DHT22

/**************************************
 * Création des instances
 */
File monFichier;
DS3231  monRTC(SDA, SCL);
DHT monDHT(DHTPIN, DHTTYPE);

/**************************************
 * Initialisation
 */
void setup()
{
  Serial.begin(9600);
  monRTC.begin();
  monDHT.begin();

  Serial.print("Initialisation de la carte SD en cours...");
  if (SD.begin())
  {
    Serial.println(" Terminee.");
  } else
  {
    Serial.println(" Echec.");
    return;
  }  
  monFichier = SD.open("donnees.txt", FILE_WRITE);
  if (monFichier)
  {   
    monFichier.println("Heure,Temperature,Humidite");
    Serial.println("");
    Serial.println("   Heure  | Temperature | Humidite");
    monFichier.close();    
  }
}
/**************************************
 * Boucle Infinie
 */
void loop()
{  
  // On mesure par exemple l'humidité et la température.
  float humidite = monDHT.readHumidity();
  float temperature = monDHT.readTemperature();
 
  // On demande l'heure exacte au module Real Time Clock.
  String temps = String(monRTC.getTimeStr());

  // On met en forme la donnée au formar txt, c'est-à dire chaque paramètre séparé par une virgule.
  String Temperature = String(temperature);
  String Humidite  = String(humidite);
  Temperature.replace(".",",");
  Humidite.replace(".",",");

  String donnee = temps + "," + Temperature + "," + Humidite;

  // On enregistre la donnée
  monFichier = SD.open("donnees.txt", FILE_WRITE); //Maximum 8 caractères avant le .txt
  if (monFichier)
  {   
    monFichier.println(donnee);
    Serial.println(" " + temps + " |    " + String(temperature)+ "    |   " + String(humidite));
    monFichier.close();    
  }
  else
  {
    Serial.println("Impossible d'ouvrir le fichier");
  }  
  delay(60000);
}

Portrait de gillou

Wolfram69

Merci pour ta réponse et pour ta proposition de code.

Cela ne marche toujours pas , mais par contre une fois sur la feuille de calcul de libre office les valeurs ont bien des virgules au lieux des points. Mais la séparation en colonne ne ce fait pas .

En modifiant la ligne 82 de ton code

String donnee = temps + ";" + Temperature + ";" + Humidite;

j'ai remplacé les "," par ";" et là la separation est realisé pour les valeurs mais pas pour les titres heures , temperature et humidité .

C'est moindre mal.

Je continu a chercher et reviens vers toi ensuite.

Merci

Gilles

String donnee = temps + ";" + Temperature + ";" + Humidite;

Portrait de Anonyme

Replace cette ligne :

    Serial.println(" " + temps + " |    " + String(temperature)+ "    |   " + String(humidite));

par :

    Serial.println(" " + temps + ";|    " + String(temperature)+ ";    |   " + String(humidite));

A+

Portrait de gillou

Wolfram69

Merci pour ta derniere reponse mais je pense que cela influence uniquement la liaison serie. Alors que en fait le pb cité plus haut se passe sur les elements transferé sur la carte sd.

J'ai trouvée la solution

monFichier.println("Date;Heure;Temperature;Humidite"); // titres colonnes sur sd

j'ai remplacé la virgule par un point virgule sur cette ligne et tout est parfait, j'ai aussi ajouté une donnée la Date.

Merci beaucoup j'etais completement coincé et tu m'as permi de redemarer mon projet.

Gilles

/****************************************
     * ENREGISTREUR DE DONNEES
     * le 03.04.2016
     * par Alexandre Pailhoux
     * modifié par Wolfram69

* modifié par gillou
     * Ce programme permet de sauvegarger vos données au format txt sur une carte SD.
     * Vous pouvez ensuite ouvrir le fichier DONNEES.txt sous excel et créer facilement un graphique.
     * Cet exemple est adapté pour la lecture d'un capteur DHT
     *
     * Nécessite les libraires DS3231 et DHT
     * Schéma de cablâge disponible sur www.les-electroniciens.com
     *
     * Besoin d'aide? http://www.les-electroniciens.com/forum  
     */

    /**************************************
     * Librairies
     */
    #include <SD.h>
    #include <SPI.h>
    #include <DS3231.h> //Librairie à installer
    #include "DHT.h"    //Librairie à installer

    /**************************************
     * Affectation des broches
     */
    #define CS_PIN 10
    #define DHTPIN 2
    #define DHTTYPE DHT22

    /**************************************
     * Création des instances
     */
    File monFichier;
    DS3231  monRTC(SDA, SCL);
    DHT monDHT(DHTPIN, DHTTYPE);

    /**************************************
     * Initialisation
     */
    void setup()
    {
      Serial.begin(9600);
      monRTC.begin();
      monDHT.begin();

      // monRTC.getTimeStr(FORMAT_SHORT);       //inutile
      //monRTC.getDateStr(FORMAT_SHORT,FORMAT_BIGENDIAN,".");  //inutile

      Serial.print("Initialisation de la carte SD en cours...");
      if (SD.begin())
      {
        Serial.println(" Terminee.");
      } else
      {
        Serial.println(" Echec.");
        return;
      }  
      monFichier = SD.open("donnees.txt", FILE_WRITE);
      if (monFichier)
      {   
        monFichier.println("Date;Heure;Temperature;Humidite"); // titres colonnes sur sd
        Serial.println("");
        Serial.println("  Date      | Heure      | Temperature | Humidite");  // titres colonnes liaison serie
        monFichier.close();    
      }
    }
    /**************************************
     * Boucle Infinie
     */
    void loop()
    {  
      // On mesure par exemple l'humidité et la température.
      float humidite = monDHT.readHumidity();
      float temperature = monDHT.readTemperature();
     
      // On demande l'heure exacte au module Real Time Clock.
      String temps = String(monRTC.getTimeStr(FORMAT_SHORT));  // lire heure avec format court
      String Date = String(monRTC.getDateStr(FORMAT_SHORT,FORMAT_BIGENDIAN)); // lire date avec format court et FORMAT_BIGENDIAN
      
      // On met en forme la donnée au formar txt, c'est-à dire chaque paramètre séparé par une virgule.
      String Temperature = String(temperature);
      String Humidite  = String(humidite);
      Temperature.replace(".",",");
      Humidite.replace(".",",");
      String donnee = Date + ";" + temps + ";" + Temperature + ";" + Humidite;  // ecriture des données sur ""donnee""

      // On enregistre la donnée
      monFichier = SD.open("donnees.txt", FILE_WRITE); //Maximum 8 caractères avant le .txt
      if (monFichier)
      {   
        monFichier.println(donnee);
        Serial.println(" " + Date +" |   " + temps + " |    " + String(temperature)+ "    |   " + String(humidite));  // ecriture des données sur la liaison serie
        monFichier.close();    
      }
      else
      {
        Serial.println("Impossible d'ouvrir le fichier");
      }  
      delay(5000);
    }

Portrait de Anonyme

Heureux d'avoir pu t'aider et à une prochaine fois si tu as besoin !

Portrait de gillou

Wolfram69

J'ai rajouté au montage 5 sondes ds18b20.

Le code fonctionne bien et écrit les 5 valeurs de plus ( t0  , t1  , t2  , t3  , t4  )sur la carte sd avec un point si j'utilise une variable float ( donc toujours le même problème) , si j'utilise les variable int (  ts0 ,  ts1  , ts2  , ts3  ,  ts4  )  pas de point donc pas de souci. Mais dans mon projet , j'aurai peu etre besoin a certain moment de donnée précise. Peu t'on changer le point par une virgule d'une variable float??

J'ai essayé cela mais sa ne marche pas :

      t0.replace(".",",");  // remplacement du point en virgule pour copie sur la carte sd
      String donnee = Date + ";" + temps + ";" + Temperature + ";" + Humidite + ";" + t0 + ";"+ ts1 + ";"+ ts2 + ";"+ ts3 + ";"+ ts4;  // ecr

Voici le code complet

    /****************************************
     * ENREGISTREUR DE DONNEES
     * le 03.04.2016
     * par Alexandre Pailhoux
     * modifié par Wolfram69
     * Ce programme permet de sauvegarger vos données au format txt sur une carte SD.
     * Vous pouvez ensuite ouvrir le fichier DONNEES.txt sous excel et créer facilement un graphique.
     * Cet exemple est adapté pour la lecture d'un capteur DHT
     *
     * Nécessite les libraires DS3231 et DHT
     * Schéma de cablâge disponible sur www.les-electroniciens.com
     *
     * Besoin d'aide? http://www.les-electroniciens.com/forum  
     */

    /**************************************
     * Librairies
     */
    #include <SD.h>
    #include <SPI.h>
    #include <DS3231.h> //Librairie à installer
    #include "DHT.h"    //Librairie à installer
//------------------------------------------------------------
    // ajout code ds18b20
    #include <OneWire.h> //Librairie du bus OneWire
#include <DallasTemperature.h> //Librairie du capteur

OneWire oneWire(7);
DallasTemperature sensors(&oneWire);
DeviceAddress sonde0 = {0x28, 0xA5, 0x73, 0x3F, 0x12, 0x19, 0x01, 0x5D};
DeviceAddress sonde1 = {0x28, 0x41, 0xF9, 0xCF, 0x1E, 0x19, 0x01, 0x14};
DeviceAddress sonde2 = {0x28, 0x0F, 0xEB, 0x3B, 0x12, 0x19, 0x01, 0x49};
DeviceAddress sonde3 = {0x28, 0x5B, 0xFD, 0xD9, 0x1E, 0x19, 0x01, 0xAE};
DeviceAddress sonde4 = {0x28, 0x7C, 0x6F, 0xD9, 0x1E, 0x19, 0x01, 0xA9};
//----------------------------------------------

    /**************************************
     * Affectation des broches
     */
    #define CS_PIN 10
    #define DHTPIN 2
    #define DHTTYPE DHT22

    /**************************************
     * Création des instances
     */
    File monFichier;
    DS3231  monRTC(SDA, SCL);
    DHT monDHT(DHTPIN, DHTTYPE);

    /**************************************
     * Initialisation
     */
    void setup()
    {
      //Serial.begin(9600);
      Serial.begin(115200);
      monRTC.begin();
      monDHT.begin();

      // monRTC.getTimeStr(FORMAT_SHORT);       //inutile
      //monRTC.getDateStr(FORMAT_SHORT,FORMAT_BIGENDIAN,".");  //inutile

      Serial.print("Initialisation de la carte SD en cours...");
      if (SD.begin())
      {
        Serial.println(" Terminee.");
      } else
      {
        Serial.println(" Echec.");
        return;
      }  
      monFichier = SD.open("donnees.txt", FILE_WRITE);
      if (monFichier)
      {   
        monFichier.println("Date;Heure;Temperature;Humidite;T0;T1;T2;T3;T4"); // titres colonnes sur sd mod avec sonde ds
        Serial.println("");
        Serial.println("  Date      | Heure      | Temperature | Humidite");  // titres colonnes liaison serie
        monFichier.close();    
      }
      // -----------------------------------------------
      // ajout sonde ds18b20
     // Serial.begin(115200);
 sensors.begin();

 sensors.setResolution(sonde0, 12);
 sensors.setResolution(sonde1, 12);
 sensors.setResolution(sonde2, 12);
 sensors.setResolution(sonde3, 12);
 sensors.setResolution(sonde4, 12);
 //-------------------------------------------------------
      
    }
    /**************************************
     * Boucle Infinie
     */
    void loop()
    {

      //-----------------------------------------------------
      // ajout sonde ds18b20

      sensors.requestTemperatures();
 float t0=sensors.getTempC(sonde0);
 int ts0=t0;
  float t1=sensors.getTempC(sonde1);
 int ts1=t1;
  float t2=sensors.getTempC(sonde2);
 int ts2=t2;
  float t3=sensors.getTempC(sonde3);
 int ts3=t3;
  float t4=sensors.getTempC(sonde4);
 int ts4=t4;
 Serial.print("   0: ");
 Serial.print(t0);
 Serial.print("   1: ");
 Serial.print(t1);
 Serial.print("   2: ");
 Serial.print(t2);
 Serial.print("   3: ");
 Serial.print(t3);
 Serial.print("   4: ");
 Serial.print(t4);
 Serial.println();
//---------------------------------------------------------------

      
      // On mesure par exemple l'humidité et la température.
      float humidite = monDHT.readHumidity();
      float temperature = monDHT.readTemperature();
     
      // On demande l'heure exacte au module Real Time Clock.
      String temps = String(monRTC.getTimeStr(FORMAT_SHORT));  // lire heure avec format court
      String Date = String(monRTC.getDateStr(FORMAT_SHORT,FORMAT_BIGENDIAN)); // lire date avec format court et FORMAT_BIGENDIAN
      
      // On met en forme la donnée au formar txt, c'est-à dire chaque paramètre séparé par une virgule.
      String Temperature = String(temperature);
      String Humidite  = String(humidite);
      Temperature.replace(".",",");
      Humidite.replace(".",",");
   
      t0.replace(".",",");  // remplacement du point en virgule pour copie sur la carte sd
      String donnee = Date + ";" + temps + ";" + Temperature + ";" + Humidite + ";" + t0 + ";"+ ts1 + ";"+ ts2 + ";"+ ts3 + ";"+ ts4;  // ecriture des données sur ""donnee"" ET sonde ds

      // On enregistre la donnée
      monFichier = SD.open("donnees.txt", FILE_WRITE); //Maximum 8 caractères avant le .txt
      if (monFichier)
      {   
        monFichier.println(donnee);
        Serial.println(" " + Date +" |   " + temps + " |    " + String(temperature)+ "    |   " + String(humidite) + " |   " + t0 +" |   " + ts1 +" |   " + ts2 +" |   " + ts3 +" |   " + ts4);  // ecriture des données sur la liaison serie
        monFichier.close();    
      }
      else
      {
        Serial.println("Impossible d'ouvrir le fichier");
      }  
      delay(5000);
    }

Merci pour ta réponse

Gilles

Portrait de Anonyme

La fonction ".replace() ne fonctionne que sur des chaîne de caractères, il e faut donc transformé les variables "float" en "String"

exemple

String T1;
float t1 = 3.14;
T1= String(t1);
T1.replace("." , ",");

et maintenant dans T1 tu as "3,14" !

Je te rappelle qu'en langage C utilisé par l'IDE Arduino T1 n'est pas la même variable que t1, le nom des variables est dit "sensible à la casse", c'est à dire aux majuscules ou minuscules !

Portrait de gillou

wolfram69

Encore merci, cela marche parfaitement.

J'avais essayé de faire la même chose sans succès, j'ai du inverser quelque part,  t0 et T0.

Maintenant j'ai compris.

J'ai revu le code avec toutes les sondes ds18b20 sur la carte sd et aussi sur l'affichage du port série, s'est pareil, ca marche.

Il me reste a épurer le code et a bien commenter chaque étapes.

enregistreur_de_donnee_arduino_carte_sd.png

Portrait de Anonyme

Si tu as compris le principe c'est ce que j'apprécie le plus car je pense qu'il est plus important de savoir ce que l'on fait plutôt que d'appliquer une recette ! Bravo.