#include <Wire.h>
#include <RTClib.h>
#include <SD.h> // Librería para manejar la SD card
#include <SPI.h>
RTC_DS1307 rtc; // Instancia del RTC
volatile int pulseCount = 0; // Contador de pulsos
int eventCount = 0; // Contador de eventos
// Pin donde se conecta el pluviómetro
const int rainPin = 2;
const int chipSelect = 10; // Pin CS del módulo SD card
char CadenaLluvia[30]; // Variable para almacenar cada evento
// Interrupción para contar pulsos
void pulseISR() {
pulseCount++; // Incrementa el contador cuando se detecta un pulso
}
void setup() {
Serial.begin(9600);
// Configuración del pin del pluviómetro
pinMode(rainPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(rainPin), pulseISR, FALLING); // Interrupción en el pin 2
// Iniciar la comunicación con el RTC
if (!rtc.begin()) {
Serial.println("No se pudo encontrar el RTC");
while (1);
}
// Si el RTC no está configurado, ajustamos la hora
if (!rtc.isrunning()) {
Serial.println("RTC no está configurado, ajustando la fecha y hora.");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Configura con la hora del sistema de la computadora
}
// Inicializar el módulo SD
if (!SD.begin(chipSelect)) {
Serial.println("Error inicializando la tarjeta SD");
while (1);
}
Serial.println("Tarjeta SD inicializada correctamente.");
}
void loop() {
if (pulseCount > 0) {
noInterrupts(); // Deshabilitar interrupciones temporalmente
int currentPulseCount = pulseCount; // Capturamos el valor de pulseCount
pulseCount = 0; // Reiniciar el contador de pulsos
interrupts(); // Rehabilitar interrupciones
// Incrementar el contador de eventos
eventCount++;
// Obtener la fecha y hora actual
DateTime now = rtc.now();
// Formatear el evento en CadenaLluvia
snprintf(CadenaLluvia, sizeof(CadenaLluvia), "Event: %d %04d/%02d/%02d %02d:%02d:%02d",
eventCount, now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
// Imprimir el resultado en la consola serial
Serial.println(CadenaLluvia);
// Guardar el evento en la tarjeta SD
File dataFile = SD.open("eventos.txt", FILE_WRITE); // Abrir o crear el archivo
if (dataFile) {
dataFile.println(CadenaLluvia); // Escribir el evento en el archivo
dataFile.close(); // Cerrar el archivo
} else {
Serial.println("Error abriendo el archivo eventos.txt");
}
}
delay(1000); // Revisa cada segundo
}