/*
Prototipo educativo de un "Datalogger"
implementado con un sensor de temperatura
DHT22 y un RTC DS1307. Utiliza las bibliotecas:
RTClib de Adafruit
https://github.com/adafruit/RTClib
DHT Sensor de Adafruit
https://github.com/adafruit/DHT-sensor-library
Para el tiempo, usa el formato Tiempo Unix
https://es.wikipedia.org/wiki/Tiempo_Unix
https://www.unixtimestamp.com/
Simulación disponible en línea en Wokwi
https://wokwi.com/projects/366275938732959745
*/
#include <DHT.h>
#include <Wire.h>
#include <RTClib.h>
#include <EEPROM.h>
// Constantes
const int DHTPIN = 2;
const int DHTTYPE = DHT22;
// Objetos
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 rtc;
// Arreglos de datos
float temperaturas[10];
float humedades[10];
unsigned long timestamps[10];
void setup() {
Serial.begin(9600);
dht.begin();
if (!rtc.begin()) {
Serial.println("No se pudo encontrar el RTC");
while (1);
}
if (!rtc.isrunning()) {
Serial.println("El RTC no está funcionando. Configurando...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop() {
for (int i = 0; i < 10; i++) {
DateTime now = rtc.now();
float temperatura = dht.readTemperature();
float humedad = dht.readHumidity();
temperaturas[i] = temperatura;
humedades[i] = humedad;
timestamps[i] = now.unixtime();
delay(1000);
}
guardarEnEEPROM();
leerDesdeEEPROM();
delay(20000);
}
void guardarEnEEPROM() {
int direccion = 0;
for (int i = 0; i < 10; i++) {
EEPROM.put(direccion, temperaturas[i]);
direccion += sizeof(float);
EEPROM.put(direccion, humedades[i]);
direccion += sizeof(float);
EEPROM.put(direccion, timestamps[i]);
direccion += sizeof(unsigned long);
}
}
void leerDesdeEEPROM() {
Serial.println("Datos almacenados en la EEPROM:");
int direccion = 0;
for (int i = 0; i < 10; i++) {
float temperatura;
EEPROM.get(direccion, temperatura);
direccion += sizeof(float);
float humedad;
EEPROM.get(direccion, humedad);
direccion += sizeof(float);
unsigned long timestamp;
EEPROM.get(direccion, timestamp);
direccion += sizeof(unsigned long);
Serial.print("Temperatura: ");
Serial.print(temperatura);
Serial.print(" °C, Humedad: ");
Serial.print(humedad);
Serial.print("%, Timestamp: ");
Serial.println(timestamp);
}
}