No aun no he hecho lo de quitar detach y attach del loop, hare una prueba con el protoboard y el codigo con tu modificacion para ver como se comporta, para descartar errores de todo tipo, si vuelve a generar falsas pulsaciones ya no tendre ninguna duda que es el codigo.
Aqui coloco el codigo original:
#include <SPI.h>
#include <Wire.h>
#include <SD.h>
#include "RTClib.h"
RTC_DS1307 rtc;
File myFile;
volatile unsigned int sensor;
unsigned long T0 = 0;
char filename[13];
char registro[30];
byte min_registro[12]={0,5,10,15,20,25,30,35,40,45,50,55};
void interrupcion_sensor()
{
if (millis() > T0 + 250)
{ sensor++;
T0 = millis();
}
}
void setup()
{
Serial.begin(9600);
delay(3000);
pinMode(10, OUTPUT);//MEMORIA SD
pinMode(3,OUTPUT); //LED
attachInterrupt(0, interrupcion_sensor, FALLING);
Wire.begin();
rtc.begin();
digitalWrite(3,HIGH); ///////////////////////////
delay(500); // DISPOSITIVO ENCENDIDO //
digitalWrite(3,LOW); //////////////////////////
if (!SD.begin(10)) {
Serial.println(F("Se ha producido un fallo al iniciar la comunicacion con la memoria SD"));
digitalWrite(3,HIGH); //Led se mantiene encendido indicando un error
while(1);
}
Serial.println(F("Se ha iniciado la comunicacion correctamente con la memoria SD"));
if (!rtc.isrunning())
{
myFile = SD.open("cfg.txt");
if (myFile) {
Serial.println(F("Abriendo archivo cfg.txt"));
if (myFile.available()) {
byte day = myFile.parseInt();
byte month = myFile.parseInt();
int year = myFile.parseInt();
byte hour = myFile.parseInt();
byte minute = myFile.parseInt();
byte second = myFile.parseInt();
rtc.adjust(DateTime(year, month, day, hour, minute, second));
}
myFile.close();
Serial.println(F("Datos cargados correctamente al reloj en tiempo real"));
digitalWrite(3,HIGH); //Led titila indicando que ha sido exitoso el proceso.
delay(500);
digitalWrite(3,LOW);
delay(500);
digitalWrite(3,HIGH);
delay(500);
digitalWrite(3,LOW);
delay(500);
digitalWrite(3,HIGH);
delay(500);
digitalWrite(3,LOW);
}
else
{
Serial.println(F("Error abriendo archivo cfg.txt"));
digitalWrite(3,HIGH); //Led se mantiene encendido indicando un error
while(1);
}
}
}//FIN SETUP
void loop()
{
DateTime now = rtc.now(); // Obtiene la fecha y hora del RTC
snprintf(filename, sizeof(filename), "%02d%02d%04d.txt", now.day(), now.month(), now.year());
for (byte i = 0; i < 12; i++)
{
if ((now.minute() == min_registro[i]) && (now.second() == 0)) // Compara la hora del RTC con el ciclo de medicion
{
digitalWrite(3,HIGH); //inicia proceso de registro
//Serial.println(F("Iniciando registro de datos en la memoria SD"));
SD.begin(10); // se inicializa SD por si se retiro
//Serial.println(F("Inicializar memoria SD"));
delay(20);
myFile = SD.open(filename, FILE_WRITE);
if (myFile)
{
detachInterrupt(0);
snprintf(registro, sizeof(registro), "%02d/%02d/%04d %02d:%02d:%02d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), sensor);
myFile.println(registro);
myFile.close(); // cerrar archivo .txt
sensor = 0;
}
attachInterrupt(0, interrupcion_sensor, FALLING);
}
}
delay(1000);
digitalWrite(3,LOW);//finaliza proceso de registro
} // fin de bucle
Codigo falsas pulsaciones:
#include <SPI.h>
#include <Wire.h>
#include <SD.h>
#include "RTClib.h"
RTC_DS1307 rtc;
File myFile;
volatile unsigned int sensor;
unsigned long T0 = 0;
char filename[13];
char registro[30];
bool flag=false;
void interrupcion_sensor()
{
if (millis() - T0 > 250)
{ sensor++;
T0 = millis();
}
}
void setup()
{
pinMode(10, OUTPUT);//MEMORIA SD
pinMode(3,OUTPUT); //LED
digitalWrite(3,HIGH); ///////////////////////////
delay(500); // DISPOSITIVO ENCENDIDO //
digitalWrite(3,LOW); //////////////////////////
Serial.begin(9600);
delay(3000);
attachInterrupt(0, interrupcion_sensor, FALLING);
Wire.begin();
rtc.begin();
if (!SD.begin(10)) {
Serial.println(F("Se ha producido un fallo al iniciar la comunicacion con la memoria SD"));
digitalWrite(3,HIGH); //Led se mantiene encendido indicando un error
while(1);
}
Serial.println(F("Se ha iniciado la comunicacion correctamente con la memoria SD"));
if (!rtc.isrunning())
{
myFile = SD.open("cfg.txt");
if (myFile) {
Serial.println(F("Abriendo archivo cfg.txt"));
if (myFile.available()) {
byte day = myFile.parseInt();
byte month = myFile.parseInt();
int year = myFile.parseInt();
byte hour = myFile.parseInt();
byte minute = myFile.parseInt();
byte second = myFile.parseInt();
rtc.adjust(DateTime(year, month, day, hour, minute, second));
}
myFile.close();
Serial.println(F("Datos cargados correctamente al reloj en tiempo real"));
digitalWrite(3,HIGH); //Led titila indicando que ha sido exitoso el proceso.
delay(500);
digitalWrite(3,LOW);
delay(500);
digitalWrite(3,HIGH);
delay(500);
digitalWrite(3,LOW);
delay(500);
digitalWrite(3,HIGH);
delay(500);
digitalWrite(3,LOW);
}
else
{
Serial.println(F("Error abriendo archivo cfg.txt"));
digitalWrite(3,HIGH); //Led se mantiene encendido indicando un error
while(1);
}
}
}//FIN SETUP
void loop()
{
DateTime now = rtc.now(); // Obtiene la fecha y hora del RTC
snprintf(filename, sizeof(filename), "%02d%02d%04d.txt", now.day(), now.month(), now.year());
if (flag) {
if( (now.minute()%5)>0 ) {
flag=false; // Si el resto de minuto/5 no es cero, "armamos" siguente flag
}
}
else {
if ( ((now.minute()%5)==0) && (now.second()<3) ) {
digitalWrite(3,HIGH); //inicia proceso de registro
//Serial.println(F("Iniciando registro de datos en la memoria SD"));
SD.begin(10); // se inicializa SD por si se retiro
//Serial.println(F("Inicializar memoria SD"));
delay(20);
myFile = SD.open(filename, FILE_WRITE);
if (myFile)
{
detachInterrupt(0);
snprintf(registro, sizeof(registro), "%02d/%02d/%04d %02d:%02d:%02d %d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second(), sensor);
myFile.println(registro);
myFile.close(); // cerrar archivo .txt
sensor = 0;
}
flag=true; // y desarmamos flag para evitar guardar más veces
attachInterrupt(0, interrupcion_sensor, FALLING);
}
}
delay(500);
digitalWrite(3,LOW);//finaliza proceso de registro
} // fin de bucle