#include <SPI.h>
#include <SD.h>
#include <DHT.h>
#include <TaskScheduler.h>
#define DHTPIN 8
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE); // Crear objeto DHT para el sensor de temperatura y humedad
const int chipSelect = 10; // Pin de selección del lector de tarjetas SD
File dataFile; // Objeto de archivo para manejar el archivo de datos
Scheduler scheduler; // Objeto para programar tareas
bool writingInProgress = false; // Es una bandera que indica si la escritura en el archivo está en progreso
// Prototipos de funciones
void readSensorData(); // Función para leer datos del sensor
void writeDataToFile(float temperature, float humidity); // Función para escribir datos en el archivo
Task taskReadSensor(5000, TASK_FOREVER, &readSensorData); // Tarea para leer el sensor cada 5 segundos
Task taskWriteSD(10000, TASK_FOREVER, &writeDataToFile); // Tarea para escribir en la tarjeta SD cada 10 segundos
void setup() {
Serial.begin(9600); // Iniciar comunicación serial
dht.begin(); // Inicializar el sensor DHT
if (!SD.begin(chipSelect)) { // Inicializar la tarjeta SD
Serial.println("¡Error al inicializar la tarjeta SD!"); // Mensaje de error si falla la inicialización
return;
}
dataFile = SD.open("data.txt", FILE_WRITE); // Abrir el archivo de datos
if (dataFile) {
dataFile.println("Temperatura, Humedad"); // Escribir cabecera en el archivo
dataFile.close(); // Cerrar el archivo
Serial.println("Archivo creado correctamente."); // Mensaje de éxito
} else {
Serial.println("¡Error al abrir el archivo!"); // Mensaje de error si no se pudo abrir el archivo
}
scheduler.addTask(taskReadSensor); // Agregar tarea de lectura al programador de tareas
scheduler.addTask(taskWriteSD); // Agregar tarea de escritura al programador de tareas
taskReadSensor.enable(); // Habilitar tarea de lectura
taskWriteSD.enable(); // Habilitar tarea de escritura
}
void loop() {
scheduler.execute(); // Ejecutar tareas programadas
}
void readSensorData() {
float temperature = dht.readTemperature(); // Leer temperatura
float humidity = dht.readHumidity(); // Leer humedad
if (!writingInProgress) { // Verificar si la escritura no está en progreso
writingInProgress = true; // Marcar que la escritura está en progreso
writeDataToFile(temperature, humidity); // Escribir datos en el archivo
writingInProgress = false; // Restablecer bandera después de la escritura
}
}
void writeDataToFile(float temperature, float humidity) {
dataFile = SD.open("data.txt", FILE_WRITE); // Abrir archivo de datos en modo escritura
if (dataFile) {
dataFile.seek(0); // Mover el puntero al inicio del archivo
dataFile.println(temperature); // Escribir temperatura
dataFile.println(humidity); // Escribir humedad
dataFile.close(); // Cerrar archivo
Serial.print("Nuevos datos escritos en data.txt: "); // Mensaje de éxito
Serial.print("Temperatura ");
Serial.print(temperature);
Serial.print(" °C, ");
Serial.print("Humedad ");
Serial.print(humidity);
Serial.println("%");
} else {
Serial.println("¡Error al abrir el archivo para escribir!"); // Mensaje de error si no se pudo abrir el archivo
}
}