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