#include <Arduino.h>
#include "DHTesp.h"
int pinDHT = 15;
DHTesp dht;
// Configuración para almacenar una semana de lecturas (cada 10 minutos)
const int intervaloMuestreo = 10 * 60 * 1000; // 10 minutos en milisegundos
const int maxMuestras = 7 * 24 * 6; // 7 días de muestras cada 10 minutos
// Estructura para almacenar temperatura y humedad
struct Data {
float temperature;
float humidity;
};
Data* bufferCircular;
int indiceActual = 0; // Índice para el almacenamiento circular
// Declaración de la tarea de FreeRTOS
void leerDatos(void *pvParameters);
// Función para liberar memoria si es necesario
void liberarMemoria() {
if (bufferCircular != NULL) {
free(bufferCircular);
Serial.println("Memoria liberada");
}
}
void setup() {
Serial.begin(115200);
dht.setup(pinDHT, DHTesp::DHT22); // Configuración para DHT22
// Asignar memoria para el buffer circular dinámicamente
bufferCircular = (Data*) malloc(maxMuestras * sizeof(Data));
if (bufferCircular == NULL) {
Serial.println("Error al asignar memoria");
return;
}
Serial.println("Memoria asignada correctamente");
// Crear tarea de lectura en FreeRTOS
xTaskCreate(leerDatos, "LeerDatos", 2048, NULL, 1, NULL);
}
void loop() {
// Vacío porque usamos FreeRTOS
}
// Tarea para leer los datos del sensor cada 10 minutos
void leerDatos(void *pvParameters) {
while (1) {
TempAndHumidity data = dht.getTempAndHumidity();
// Validar y almacenar datos en el buffer circular
if (data.temperature != 0.0 || data.humidity != 0.0) {
bufferCircular[indiceActual].temperature = data.temperature;
bufferCircular[indiceActual].humidity = data.humidity;
// Imprimir la lectura y el estado del buffer
Serial.print("Guardando en índice ");
Serial.print(indiceActual);
Serial.print(" - Temp: ");
Serial.print(data.temperature, 2);
Serial.print(" °C, Hum: ");
Serial.print(data.humidity, 1);
Serial.println(" %");
indiceActual = (indiceActual + 1) % maxMuestras; // Avanzar en el buffer
} else {
Serial.println("Lectura inválida, reintentando en el siguiente ciclo...");
}
// Espera de 10 minutos (para pruebas rápidas, reduce este valor temporalmente)
vTaskDelay(pdMS_TO_TICKS(intervaloMuestreo));
}
}