Programme
Une petit description de ce que je veux faire.
Initialisation
Test niveau -> Si capteur = 2cm
Led clignote 0.5s
Enregistre première Date mise en service
Si pb pour écrire dans la SD
Led allumé rouge 2s/éteint 1s puis retest.
Boucle main
test toutes les heures
Lit capteur
Lit heures
Enregistre dans SD (date - niveau - calcul)
si niveau > led clignote 1S
si niveau > led allumé
fin boucle
Et enfin voici le programme :
/* Testeur de niveau avec log des data sur carte SD.
Materiel :
arduino mini
Capteur d'humidité
RTC horloge+eeprom
Lecteur SD
Led bicolor
le but est de mesurer tt les heures un niveau d'eau à l'aide du capteur
puis de stocker avec la date dans une SD
*/
#include <Wire.h> // Inclusion de la librairie Wire pour la gestion de l'I2C qui nous permettra de communiquer avec le DS1307
//#include "structure.h" // Inclusion de notre fichier de structure qui définit le type "Date"
#include <SPI.h>
#include <SD.h> //Utiliser la librairie SD
#include <RTClib.h> // pour l'horloge temps réel
//Date date; //RTC_DS1307 RTC; Création de l'objet date qui contiendra les données sur la date/heure courante
RTC_DS1307 RTC;
Sd2Card card; //Variables utilisées par le programme
SdVolume volume;
SdFile root;
// Nombre de secondes entres chaque prise de mesure
//#define DELAI_MESURES 3600
#define DELAI_MESURES 3600
DateTime now;
//DateTime now = RTC.now();
File logfile; //Fichier
// Modifier ceci selon le module utilisé, pour le shield Ethernet utilsier pin 4
// Pour les shields et modules Adafruit : pin 10; Sparkfun SD shield: pin 8
const int chipSelect = 4; //Configuré en sortie
const char ledr = 3; //Une LED pour indiquer le point zéro
const char ledv = 5; //Une LED pour indiquer le point zéro
const char capteur = 0; //broche A0 sur laquelle va être connecté le capteur de niveau
float tension = 0; //variable qui va enregistrer la tension lue en sortie du capteur
int can = 0; // valeur d'entrée de l'arduino.
float distance = 0; // valeur de la distance calculé (0-4cm par pas de 0,5)
int decalage = -2; //Décalage du zéro en milieu de capteur.
boolean initsd = false; //validation init SD
// make a string for assembling the data to log:
String datastring = "";
long tempsInitial = 0; // nombre de secondes entre le 1 jan 2000 et le début du script
long derniereMesure = 0; // moment de la plus récente prise de mesure
char filename[] = "RAPPOR00.CSV";
void setup()
{
//définition des broches utilisées
pinMode(ledr, OUTPUT);
pinMode(ledv, OUTPUT);
Serial.begin(9600); //la voie série pour monitorer
Serial.println("Hello !");
Wire.begin();
RTC.begin();
Serial.print("Initialise la SD card...");
// CS est pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("defaut d'initialisation!");
for (int i=1; i<=20; i++) {
digitalWrite(ledr, HIGH);
delay(800);
digitalWrite(ledr,LOW);
}
return;
}
Serial.println("initialization done.");
initsd = true;
digitalWrite(ledv, HIGH);
delay(800);
digitalWrite(ledv,LOW);
// initialisation des temps initial (RTC)
now = RTC.now();
tempsInitial = now.get();
derniereMesure = now.get()-DELAI_MESURES;
// Création d'un fichier
for (uint8_t i = 0; i < 100; i++) {
filename[6] = i/10 + '0';
filename[7] = i%10 + '0';
if (! SD.exists(filename)) {
logfile = SD.open(filename, FILE_WRITE);
logfile.println("date;heure;CAN;niveau");
Serial.println("date;heure;CAN;niveau");
break;
}
if (! logfile) {
Serial.print("echec de la creation du fichier");
Serial.print("Nom du fichier: ");
Serial.println(filename);
}
}
// test du niveau zero
//cherchezero();
}
void cherchezero() {
/*Allume la led verte quand niveau atteind.
il faut que la valeur can=400 */
boolean niv = false;
while ( !niv ) {
can=analogRead(capteur);
if ((can >= 402) && (can <=409)) {
digitalWrite(ledv, HIGH);
niv = true;
} else {
digitalWrite(ledv, LOW);
}
}
Serial.println(can);
delay(1000);
digitalWrite(ledv, LOW);
return;
}
//recupere la date du jour
void actuel() {
String mois = "";
if (now.day() < 10) datastring=datastring+("0"); // date
datastring=datastring+(now.day());
datastring=datastring+("-");
switch (now.month()) {
case 1:
mois=("janvier");
break;
case 2:
mois=("fevrier");
break;
case 3:
mois=("mars");
break;
case 4:
mois=("avril");
break;
case 5:
mois=("mai");
break;
case 6:
mois=("juin");
break;
case 7:
mois=("juillet");
break;
case 8:
mois=("aout");
break;
case 9:
mois=("septembre");
break;
case 10:
mois=("octobre");
break;
case 11:
mois=("novembre");
break;
case 12:
mois=("decembre");
break;
}
//if (now.month() < 10) datastring=datastring+("0");
datastring=datastring+mois;
datastring=datastring+("-");
datastring=datastring+(now.year());
datastring=datastring+(";");
char temps[50];
sprintf(temps, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
datastring=datastring+temps;
/*
Serial.println(datastring+" ? "+now.hour());
if (now.hour() < 10) datastring=datastring+("0"); // heure
datastring=datastring+(now.hour(), DEC);
Serial.println(datastring);
datastring=datastring+(":");
if (now.minute() < 10) datastring=datastring+("0");
datastring=datastring+(now.minute(), DEC);
datastring=datastring+(":");
Serial.println(datastring);
if (now.second() < 10) datastring=datastring+("0");
datastring=datastring+(now.second(), DEC);
*/
datastring=datastring+("; ");
//Serial.println(datastring);
}
void loop()
{
if (!initsd) {
digitalWrite(ledr,HIGH);
delay(1000);
digitalWrite(ledr,LOW);
setup();
}
//récupère la date du jour
datastring = ("");
actuel();
// // on mesure les données pertinentes
now = RTC.now(); // quelle heure est-il?
if ((now.get()-derniereMesure)< DELAI_MESURES) return;
derniereMesure = now.get();
can = analogRead(capteur);
tension = (can * 5.0) / 1023; // conversion de cette valeur en tension
if (can < 900 && can > 350) {
// plage utile du capteur 0 -> 4 cm
// la courbe des donnée relevé donne une concordance avec une puissance.
// Où x=distance recherché et Y= valeur can
// y = 515070311676*(x^-4,3724) + decalage" ^ représente puissance"
distance = 515070311676*(can^-4,3724);
} else if (can > 900) {
distance = 0 + decalage;
} else if (can < 352) {
distance = 4 + decalage;
}
//Serial.println(distance);
digitalWrite(ledv,HIGH);
delay(2000);
digitalWrite(ledv,LOW);
// Écriture du fichier
logfile = SD.open(filename, FILE_WRITE);
logfile.seek(logfile.size());
logfile.print(datastring);
logfile.print(";");
logfile.print(can);
logfile.print(";");
logfile.println(distance); // Ecrit la ligne de data
Serial.print(datastring);
Serial.print(";");
Serial.print(can);
Serial.print(";");
Serial.println(distance);
logfile.close();
}