| |
— | logguer:programme [2019/08/13 10:16] (Version actuelle) – créée - modification externe 127.0.0.1 |
---|
| ====== Programme ====== |
| Une petit description de ce que je veux faire. |
| |
| <code> |
| 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 |
| </code> |
| |
| Et enfin voici le programme : |
| |
| <code c++> |
| |
| /* 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(); |
| |
| } |
| |
| </code> |
| |
| |