Go Down

Topic: pb sur l'enregistrement avec horodatatage (Read 364 times) previous topic - next topic

red_skyy

Mar 22, 2019, 03:57 pm Last Edit: Mar 22, 2019, 04:02 pm by red_skyy
Bonjour,
J'ai un projet de bac qui consiste à améliorer un odomètre et ma partie et d'enregistrer les 100 dernières données avec horodatage, le soucis c'est que j'arrive à enregistrer les données mais je ne sais pas comment les enregistrer avec la date et l'heure,

Mon programme pour avoir l'heure :

Code: [Select]

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;
int second;

char daysOfTheWeek[7][12] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};

void setup () {
 
  while (!Serial); // for Leonardo/Micro/Zero

  Serial.begin(9600);
  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (!rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
  }

  rtc.adjust(DateTime(__DATE__, __TIME__));
}

void loop () {
    DateTime now = rtc.now();
   
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(" | ");
    //Serial.print('0'); // a griser le 10 du mois
    Serial.print(now.day(), DEC);
    Serial.print('/');
    Serial.print('0'); // a griser le 10eme mois de l'année
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.year(), DEC);
    Serial.print(" | ");
   
    if(now.hour() <= 9)
    {
      Serial.print("0");
      Serial.print(now.hour(), DEC);
      Serial.print(':');
    }
    if(now.hour() >= 10)
    {
      Serial.print(now.hour(), DEC);
      Serial.print(':');
    }
   
    if(now.minute() <= 9)
    {
      Serial.print("0");
      Serial.print(now.minute(), DEC);
      Serial.print(':');
    }
    if(now.minute() >= 10)
    {
      Serial.print(now.minute(), DEC);
      Serial.print(':');
    }
   
    if(now.second() <= 9)
    {
      Serial.print("0");
      Serial.print(now.second(), DEC);
    }
    if(now.second() >= 10)
    {
      Serial.print(now.second(), DEC);
    }
 
    Serial.println();
    delay(1000);
}


Mon programme pour enregistrer une donnée en .csv (il y a du .txt mais je le changerai par la suite) :

Code: [Select]

#include <SD.h>
#include <SPI.h>

File monFichier;

void setup() {
  Serial.begin(9600);
  Serial.println("Initialisation de la carte SD...");

  if (!SD.begin(4)) {
    Serial.println("L'initialisation de la carte SD a echoue !");
    return;
  }
  Serial.println("L'initialisation de la carte SD a reussie !");

  monFichier = SD.open("test.txt", FILE_WRITE); //on peut en ouvrir qu'un à la fois //

  if (monFichier) { //si le fichier a bien été ouvert :
    Serial.println("En train d ecrire dans le fichier test.txt");
    monFichier.println("Abonnez vous à la chaine de PiewDiePie !");
    monFichier.close();
    Serial.println("Fait");
  } else { // sinon :
    Serial.println("Erreur lors de l'ouverture de test.txt");
  }
}



void loop() {
}


PS : j'utilise un shield pour la carte sd (je n'ai pas la réf) et une horloge temps réel

Merci d'avance pour l'aide

edit : j'ai oublié de le préciser mais j'ai une carte Arduino Uno avec deux shield, un pour la carte sd (j'ai trouvé le lien) et un shield grove

J-M-L

#1
Mar 22, 2019, 07:44 pm Last Edit: Mar 22, 2019, 07:45 pm by J-M-L
bonsoir

le second code vous montre comment on écrit dans un fichier, le premier comment on lit l'heure et on l'affiche. (et clairement aucun des deux n'a été écrit par vous - allez je vous donne peut être le fait que vous ayez modifié le texte en "Abonnez vous à la chaine de PiewDiePie !"...)

où est votre travail pour essayer de les mettre ensemble ? (et qu'avez vous fait ces derniers mois?....)
Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

red_skyy

Il est vrai que j'ai pas fait ces codes mais en essayant de les assembler voila ce que ca m'a donné mais ca ne fonctionne pas :
Code: [Select]
#include <SD.h>
#include <SPI.h>
#include <Servo.h>
#include "RTClib.h"

Servo myservo;
File monFichier;
RTC_DS1307 rtc;

const int buttonPin = 2;
int buttonState = 0;

rtc(SDA, SCL);

void setup() {
   
  Serial.begin(9600);
Serial.println("Initialisation de la carte SD..");

  if (!SD.begin(4)) {
    Serial.println("L'initialisation de la carte SD a echoué !");
    return;
  }
  Serial.println("L'initialisation de la carte SD a reussie !");

      //monFichier = SD.open("test.csv", FILE_WRITE);
  myservo.attach(4);
  myservo.write(1);
  }
     rtc.begin();   

void loop() {
  buttonState = digitalRead(buttonPin);
 
  if (buttonState == HIGH) {
    myservo.write(90);
    monFichier = SD.open("test.csv", FILE_WRITE);
    if (monFichier) {   
        Serial.println("En train d ecrire dans le fichier test.txt");
        monFichier.println("fontionel");
        monFichier.print(",");
        monFichier.print(rtc.getTimeStr());
        monFichier.close();
        Serial.println("Fait");
        //myFile.println(int(rtc.getTemp()));
       monFichier.close(); // close the file
    }
      else {
    Serial.println("Erreur lors de l'ouverture de test.csv");
    }
  }
  else{
    myservo.write(9);
     }
}
  // if the file didn't open, print an error:
  else {
    Serial.println("Erreur lors de l'ouverture de test.csv");
  }
      //delay(3000);

Mais il se trouve que j'avais mal compris le sujet et il faut non pas que j'enregistre a chaque mouvement mais chaque fois que l'on appuie sur un bouton ce qui simplifie la chose je suppose, le probleme est que je ne connais pas la commande qui enregistre

J-M-L

Vous comprenez ce que fait le second programme ?

On ouvre le fichier en écriture
Tout ce qu'on « print » dedans est écrit
On ferme le fichier

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

red_skyy

oui j'arrive a comprendre ce que font les deux programmes séparément

dbrion06

Qu'est ce qui est écrit dans "test.csv" (normalement, vous pouvez retirer la SD de l'arduino et la brancher dans un PC?)
Qu'est ce que vous voulez qu'il soit écrit?

red_skyy

Pour le moment c'est juste un test qui n'est pas avec le programme complet mais je souhaite qu'il y soit écrit une variable (qui sera ajoutée lorque mon programme fonctionnera) avec l'heure, pour le moment je sais comment enregistrer la variable dans la carte sd mais pas avec l'heure.

dbrion06

avez vous testé le programme du post 2 qui contient
Code: [Select]

   monFichier = SD.open("test.csv", FILE_WRITE);
    if (monFichier) {   
        Serial.println("En train d ecrire dans le fichier test.txt");
        monFichier.println("fontionel");
        monFichier.print(",");
        monFichier.print(rtc.getTimeStr());
        monFichier.close();
        Serial.println("Fait");
        //myFile.println(int(rtc.getTemp()));
       monFichier.close(); // close the file


Question 1: Que donne test.csv avec ce programme?
Question 2: Est ce ce que vous voulez? (les deux questions, Q1 et Q2 ne sont pas exclusives et peuvent apporter des réponses interessantes)

red_skyy

Non je n'ai pas tester ce programme, et test.csv me donne "fonctionnel 10/010/10 10:010:10" et non l'heure correcte et je n'ai pas compris la question 2

dbrion06

#9
Mar 27, 2019, 06:17 pm Last Edit: Mar 27, 2019, 06:17 pm by dbrion06
Est il normal que l'horloge donne ces valeurs?
Il faut bien commencer par dépanner quelque chose....
Quote
test.csv me donne "fonctionnel 10/010/10 10:010:10"
Si je lis votre code, il devrait donner une virgule à la fin de fonctionnel, quelque chose comme  "fonctionnel, 10/010/10 10:010:10"
Edit: quel est le code qui a fait ça?

red_skyy

Non ce n'est pas normal qu'elle donne ca ^^' je l'ai essayer avec le code a part et elle se met a la bonne heure mais elle ne donne pas la bonne heure dans le programme d'enregistrement, c'est le programme que j'ai donné qui donne ces valeurs
PS : Je n'ai pas le matériel sous la main

red_skyy

#11
Mar 29, 2019, 02:22 pm Last Edit: Mar 29, 2019, 02:57 pm by red_skyy
J'ai finalement trouvé la solution pour mon programme que j'ai mis en commun avec mon collègue et le voici :
Code: [Select]
#include <SD.h>
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
#include "rgb_lcd.h"

rgb_lcd lcd;
File monFichier;
RTC_DS1307 rtc;

int pinA = 2;
int pinB = 3;
int second;
int button = 5;
int buttonState = 0;

volatile int pos = 0;
int apos;

char daysOfTheWeek[7][12] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};

void setup() {

  pinMode(3, INPUT);  // interruption n°0 sur broche 2
  attachInterrupt(1, frequence, RISING); //interruption 0 = broche 2 de l'Arduino,programme d'interruption nommé frequence, déclenché sur front montant
  lcd.begin(16, 2); //initialise  l'afficheur 2 lignes de 16 caractères
  lcd.setCursor(0, 0); //positionnement du curseur ligne 1
  lcd.print("Impulsions: ");//affichage du mot Fréquence (sans accents)
  lcd.setCursor(0, 1); //positionnement du curseur ligne 1
  lcd.print("Distance: ");//affichage du mot Fréquence (sans accents)
  Serial.begin(9600);

  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (!rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
  }

  rtc.adjust(DateTime(__DATE__, __TIME__));
  Serial.println("Initialisation de la carte SD...");
  if (!SD.begin(4)) {
    Serial.println("L'initialisation de la carte SD a echoue !");
    return;
  }
  Serial.println("L'initialisation de la carte SD a reussie !");
}

void loop ()
{
  DateTime now = rtc.now();
  buttonState = digitalRead(button);
  lcd.setCursor(12, 0); //positionnement du curseur après le mot Fréquence
  lcd.print(pos);//affichage du mot Fréquence (sans accents)
  lcd.print(" ");//affichage du mot Fréquence (sans accents)
  lcd.setCursor(10, 1); //positionnement du curseur après le mot Fréquence
  apos = map(pos, 0, 1020, 0, 172);
  lcd.print(apos);// affichage du nombre de périodes durant la seconde écoulée
  lcd.print("cm   ");//affichage du mot Fréquence (sans accents)
  if (buttonState == HIGH)
  {
    monFichier = SD.open("test.csv", FILE_WRITE);
    if (monFichier)
    {
      Serial.println("En train d'ecrire dans le fichier test.csv");
      monFichier.print(apos);
      monFichier.print(" cm");
      monFichier.print(" , ");
      // monFichier.println(";");
      monFichier.print(daysOfTheWeek[now.dayOfTheWeek()]);
      monFichier.print(" , ");
      //Serial.print('0'); // a griser le 10 du mois
      monFichier.print(now.day(), DEC);
      monFichier.print('/');
      monFichier.print('0'); // a griser le 10eme mois de l'année
      monFichier.print(now.month(), DEC);
      monFichier.print('/');
      monFichier.print(now.year(), DEC);
      monFichier.print(" , ");

      if (now.hour() <= 9)
      {
        monFichier.print("0");
        monFichier.print(now.hour(), DEC);
        monFichier.print(':');
      }
      if (now.hour() >= 10)
      {
        monFichier.print(now.hour(), DEC);
        monFichier.print(':');
      }

      if (now.minute() <= 9)
      {
        monFichier.print("0");
        monFichier.print(now.minute(), DEC);
        monFichier.print(':');
      }
      if (now.minute() >= 10)
      {
        monFichier.print(now.minute(), DEC);
        monFichier.print(':');
      }

      if (now.second() <= 9)
      {
        monFichier.print("0");
        monFichier.print(now.second(), DEC);
      }
      if (now.second() >= 10)
      {
        monFichier.print(now.second(), DEC);
      }
      monFichier.println();
      monFichier.close();
      Serial.println("Fait");
    } else { // sinon :
      Serial.println("Erreur lors de l'ouverture de test.csv");
    }
    pos = 0;
  }

  delay(500);
}

void frequence()
{
  int sA = digitalRead(pinA);
  int sB = digitalRead(pinB);
  int apos = pos;                    // Mémorisation de la position précédente
  if (sA == sB)
  {
    pos = pos - 1;
  }
  else
  {
    pos = pos + 1;
  }
}

Il fonctionne correctement et m'enregistre la valeur avec la date dans un fichier .csv mais le nouveau petit soucis c'est qu'il me met toutes les valeurs dans la même case ce qui est embêtant, et je ne vois pas comment lui faire écrire une valeur par case comme ceci : en case A "La Valeur" puis en B "le jour" en case C la date et en case D l'heure

EDIT : J'ai trouvé la solution il fallait juste que je remplace les , en ; pour qu'excel comprenne. Merci pour votre aide j'ai fini ma partie :D

Go Up