Enregistreur de données

gillou
sam, 12/28/2019 - 15:54
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
Anonyme
sam, 12/28/2019 - 17:33
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é.
gillou
sam, 12/28/2019 - 20:46
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;
Anonyme
dim, 12/29/2019 - 11:31
Replace cette ligne :
Serial.println(" " + temps + " | " + String(temperature)+ " | " + String(humidite));
par :
Serial.println(" " + temps + ";| " + String(temperature)+ "; | " + String(humidite));
A+
gillou
jeu, 01/02/2020 - 16:14
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);
}
Anonyme
jeu, 01/02/2020 - 18:06
Heureux d'avoir pu t'aider et à une prochaine fois si tu as besoin !
gillou
ven, 01/03/2020 - 19:19
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
Anonyme
sam, 01/04/2020 - 07:37
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 !
gillou
sam, 01/04/2020 - 16:49
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.
Anonyme
dim, 01/05/2020 - 08:35
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.