#include <SPI.h> // Incluye la librería SPI para la comunicación con dispositivos SPI
#include <SD.h> // Incluye la librería SD para interactuar con tarjetas SD
#include <DHT.h> // Incluye la librería DHT para el sensor de temperatura y humedad
#define DHTPIN 8 // Pin digital conectado al sensor
#define DHTTYPE DHT22 // Tipo de sensor DHT (DHT22)
DHT dht(DHTPIN, DHTTYPE); // Inicializa el objeto del sensor DHT
const int chipSelect = 10; // Pin CS de la tarjeta SD
unsigned long lastSensorReadTime = 0; // Variable para almacenar el tiempo de la última lectura del sensor
unsigned long lastSDWriteTime = 0; // Variable para almacenar el tiempo de la última escritura en la SD
unsigned long sensorInterval = 5000; // Intervalo de lectura del sensor en milisegundos
unsigned long sdWriteInterval = 10000; // Intervalo de escritura en la SD en milisegundos
void setup() {
Serial.begin(9600); // Inicializa la comunicación serial a 9600 baudios
pinMode(chipSelect, OUTPUT); // Establece el pin chipSelect como salida
if (!SD.begin(chipSelect)) { // Inicializa la tarjeta SD y verifica si se realizó con éxito
Serial.println("Fallo al inicializar la tarjeta SD."); // Imprime un mensaje de error si la inicialización falla
return; // Sale de la función setup si la inicialización falla
}
Serial.println("Tarjeta SD inicializada correctamente."); // Imprime un mensaje de éxito si la inicialización es exitosa
dht.begin(); // Inicializa el sensor DHT
}
void loop() {
unsigned long currentMillis = millis(); // Obtiene el tiempo actual en milisegundos desde el inicio del programa
// Hilo para la lectura del sensor
if (currentMillis - lastSensorReadTime >= sensorInterval) { // Verifica si ha pasado el tiempo del intervalo de lectura
lastSensorReadTime = currentMillis; // Actualiza el tiempo de la última lectura al tiempo actual
readSensor(); // Llama a la función para leer el sensor
}
// Hilo para la escritura en la tarjeta SD
if (currentMillis - lastSDWriteTime >= sdWriteInterval) { // Verifica si ha pasado el tiempo del intervalo de escritura en la SD
lastSDWriteTime = currentMillis; // Actualiza el tiempo de la última escritura al tiempo actual
writeDataToSD(); // Llama a la función para escribir los datos en la tarjeta SD
}
}
void readSensor() {
// Lectura de la temperatura y humedad del sensor
float humidity = dht.readHumidity(); // Lee la humedad del sensor DHT
float temperature = dht.readTemperature(); // Lee la temperatura del sensor DHT
// Verificación si la lectura fue exitosa
if (isnan(humidity) || isnan(temperature)) { // Verifica si la lectura de humedad o temperatura es inválida
Serial.println("Error al leer el sensor DHT22."); // Imprime un mensaje de error si la lectura es inválida
return; // Sale de la función si la lectura es inválida
}
// Mostrar los valores leídos en el monitor serial
Serial.print("Humedad: "); // Imprime el texto "Humedad: "
Serial.print(humidity); // Imprime el valor de humedad
Serial.print("% - Temperatura: "); // Imprime el texto " - Temperatura: "
Serial.print(temperature); // Imprime el valor de temperatura
Serial.println("°C"); // Imprime el símbolo de grado Celsius y un salto de línea
}
void writeDataToSD() {
// Abrir el archivo en modo de escritura
File dataFile = SD.open("data.txt", FILE_WRITE); // Abre el archivo "data.txt" en modo de escritura
// Si el archivo se abrió correctamente
if (dataFile) { // Verifica si el objeto File es válido
// Escribir los datos al principio del archivo
dataFile.seek(0); // Establece el puntero de escritura al principio del archivo
dataFile.print("Nuevos datos: "); // Escribe el texto "Nuevos datos: "
dataFile.print(dht.readHumidity()); // Escribe el valor de humedad
dataFile.print("%, "); // Escribe el símbolo de porcentaje y una coma
dataFile.print(dht.readTemperature()); // Escribe el valor de temperatura
dataFile.println("°C"); // Escribe el símbolo de grado Celsius y un salto de línea
// Cerrar el archivo
dataFile.close(); // Cierra el archivo después de escribir los datos
Serial.println("Datos escritos en la tarjeta SD."); // Imprime un mensaje de éxito
} else {
// Si no se pudo abrir el archivo
Serial.println("Error al abrir el archivo en la tarjeta SD."); // Imprime un mensaje de error
}
}