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();
 
}