Enregistrement sur carte SD uniquement la détection du capteur "HIGH"

Bonjour,
Mon projet en cours porte sur l’enregistrement autonome de détection de mouvements et de ses durées.
Mes modules : Base nano, Capteur SR 501, RTC DS3231 et carte micro SD .
Ma difficulté…
L’enregistrement sur la carte SD est permanent, déclenché par le RTC (détection ou pas)
Je veux donc pouvoir enregistrer et lire sur ma carte, seules, les lignes ou la détection était HIGH avec sa durée et son heure de déclenchement tout comme elle apparait plus ou moins dans mon moniteur de série.
Je pense qu’il faut que l’horodateur du RTC se base sur la détection et non le contraire….
Merci pour votre aide des plus précieuses
Sylvain

/*Exemple de code pour prendre des données et les écrire sur une carte SD
  RÉCIT MST 2016
  Inspiration http://www.worldofgz.com/electronique/ecrire-et-lire-des-donnees-sur-une-carte-sd/
  http://tiptopboards.free.fr/arduino_forum/viewtopic.php?f=5&t=68
  http://forum.arduino.cc/index.php?topic=107367.0
*/
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

File fichierSD;

const int capteur = 8;
const int ledPin = 3;
unsigned long passageDebut;
unsigned long passageFin;
unsigned long tempoDebut;
bool tempoActive = false;
int nombreDeDetections = 0;
byte etatCapteur = 1;

void setup() {

  pinMode(capteur, INPUT);
  pinMode(ledPin, OUTPUT);

  Serial.begin(9600);
  //Pour la carte SD=====================
  //Initialisation de l'instance
  if (!SD.begin(4)) { //10 pour notre carte, peut etre different
    Serial.println(F("Initialisation impossible !"));
    return;
  }
  Serial.println(F("Initialisation OK"));
  //Fin carte SD==========================

  //Pour l'horloge=========================
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();

  if (! rtc.isrunning()) {
    Serial.println("RTC ne fonctionne PAS!");
    // La ligne qui suit ajuste le RTC à la date et time du moment de compilation(si connectee a ordinateur)
    rtc.adjust(DateTime(__DATE__, __TIME__));
  }
  //Fin horloge=============================
}

void loop() {

  etatCapteur = digitalRead(capteur);
  if (etatCapteur == HIGH) { // Il y a quelqu'un
    if (tempoActive == false) {
      passageDebut = millis(); // Premier départ
      digitalWrite(ledPin, HIGH);
    }
    tempoActive = true; // Démarrage de la temporisation
    tempoDebut = millis();
    passageFin = millis();
  }
  if (((millis() - tempoDebut) > 5000) && tempoActive) { // cela fait 3s que l'on n'a plus vu personne
    tempoActive = false; // <- Il faut arrêter la temporisation ############################
    nombreDeDetections++;
    Serial.print("Nombre de detections: ");
    Serial.println(nombreDeDetections, DEC);
    Serial.println();
    Serial.print ("duree: ");
    Serial.print((passageFin - passageDebut) / 1000);
    Serial.println (" secondes");
    digitalWrite(ledPin, HIGH);
    Serial.println();
    Serial.println("_______________");
    Serial.println();
    digitalWrite(ledPin, LOW); // Mal placée, elle s'allumera moins d'une milliseconde et on ne le verra pas.
  }

  DateTime now = rtc.now();

  //On nomme le fichier selon la date, donc toutes les donnees prises le meme jour dans un seul fichier==========
  char datafile[13]; //tableau de 13 espaces pour le nom
  int jour = now.day();
  int mois = now.month();
  int annee = now.year();
  sprintf(datafile, "%02d%02d%04d.csv", jour, mois, annee); // %d pour un int
  datafile[13] = '\0'; //à mettre pour fermer convenablement le fichier
  //Fin nommer fichier==================

  //Ouverture du fichier==========================
  fichierSD = SD.open(datafile, FILE_WRITE);

  //Test pour écriture
  if (fichierSD) {

    //Ecriture
    maintenant();
    fichierSD.print(now.year(), DEC);
    fichierSD.print('/');
    fichierSD.print(now.month(), DEC);
    fichierSD.print('/');
    fichierSD.print(now.day(), DEC);
    fichierSD.print(' ');
    fichierSD.print(now.hour(), DEC);
    fichierSD.print(':');
    fichierSD.print(now.minute(), DEC);
    fichierSD.print(':');
    fichierSD.print(now.second(), DEC);
    fichierSD.println();
    fichierSD.print("Nombre de detections: ");
    fichierSD.println(nombreDeDetections, DEC);
    fichierSD.print ("duree: ");
    fichierSD.print((passageFin - passageDebut) / 1000);
    fichierSD.println (" secondes");
    fichierSD.println();
    fichierSD.close();

  }
  //Fermeture du fichier avec une ligne de plus============

  delay(1000);//duree en ms entre les mesures
}

//Fonction qui écrit la date et l'heure dans le fichierSD
void maintenant() {
  DateTime now = rtc.now();
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.