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