Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

logguer:programme [2019/08/13 10:16] (Version actuelle)
Ligne 1: Ligne 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>
 +
  
logguer/programme.txt · Dernière modification: 2019/08/13 10:16 (modification externe)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0