#include <SPI.h>
#include <SD.h>
File myFile; // archivo para almacenar datos
#include <DHT.h> // librería sensor DHT11
#define DHTPIN 2 // pin digital 2, sensor DHT11
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
#include <LiquidCrystal.h> // librería del display
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // pines UNO -> LCD
// Carácter personalizado para "º" (grado)
byte N[8] = {
B00111,
B00101,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
};
const int salidarelay = 10; // salida para relé (pin 10)
const int SD_CS = 3; // Chip Select de la SD (según tu cableado)
void lcdPrintLine(uint8_t col, uint8_t row, const char* txt, uint8_t width = 20) {
lcd.setCursor(col, row);
lcd.print(txt);
// Relleno con espacios para borrar restos de textos más largos
int len = strlen(txt);
for (int i = len; i < width; i++) lcd.print(' ');
}
void setup() {
Serial.begin(9600);
Serial.print("Inicializando tarjeta SD ...");
// Iniciar SD (CS en pin 3, según tu conexión)
if (!SD.begin(SD_CS)) {
Serial.println("No se pudo inicializar");
// Podés mostrar error en LCD si querés
} else {
Serial.println("inicializacion exitosa");
if (SD.exists("archivo.txt")) {
Serial.println("Borrando archivo.txt anterior.");
SD.remove("archivo.txt");
} else {
Serial.println("archivo.txt Nuevo.");
}
// En ambos casos, crear/abrir archivo nuevo
myFile = SD.open("archivo.txt", FILE_WRITE);
if (myFile) {
myFile.println("Tiempo(s),Humedad(%),Temperatura(C),SensacionTermica(C),Infrarrojo");
myFile.close();
} else {
Serial.println("Error creando archivo.txt");
}
}
delay(500); // retardo recomendado
// Sensor DHT
dht.begin();
delay(1000);
// LCD
lcd.createChar(0, N);
lcd.begin(20, 4);
lcdPrintLine(0, 0, "Temperatura-humedad");
// Dejo líneas vacías iniciales
lcdPrintLine(0, 1, "");
lcdPrintLine(0, 2, "");
lcdPrintLine(0, 3, "");
pinMode(salidarelay, OUTPUT);
digitalWrite(salidarelay, HIGH); // estado normal (ajustá según tu relé)
}
void loop() {
// Cada 5 segundos (DHT11 ~1 Hz)
delay(5000);
// Lecturas DHT11
float h = dht.readHumidity();
float t = dht.readTemperature(); // °C
// float f = dht.readTemperature(true); // °F (no se usa)
if (isnan(h) || isnan(t)) {
Serial.println("Error obteniendo los datos del sensor DHT11");
lcdPrintLine(0, 1, "Hum.rel.= -- %");
lcdPrintLine(0, 2, "Temp.= --");
lcd.write(byte(0)); lcd.print("C"); // ºC
lcdPrintLine(0, 3, "Sens.Term.= --");
lcd.write(byte(0)); lcd.print("C");
return; // reintentar en el próximo ciclo
}
float hic = dht.computeHeatIndex(t, h, false); // indice de calor en °C
// Mostrar en LCD (limpiando restos con padding)
{
char buf[21];
snprintf(buf, sizeof(buf), "Hum.rel.= %.0f %%", h);
lcdPrintLine(0, 1, buf);
lcd.setCursor(0, 2);
lcd.print("Temp.= ");
lcd.print(t, 0);
lcd.write(byte(0)); // º
lcd.print("C");
// completar con espacios hasta fin de línea
int used = 7 /*"Temp.= "*/ + (t >= 0 ? (t < 10 ? 1 : (t < 100 ? 2 : 3)) : 2) + 2; // aprox
for (int i = used; i < 20; i++) lcd.print(' ');
lcd.setCursor(0, 3);
lcd.print("Sens.Term.= ");
lcd.print(hic, 0);
lcd.write(byte(0));
lcd.print("C");
used = 12 /*"Sens.Term.= "*/ + (hic >= 0 ? (hic < 10 ? 1 : (hic < 100 ? 2 : 3)) : 2) + 2;
for (int i = used; i < 20; i++) lcd.print(' ');
}
// Sensor infrarrojo (flama) en A0
int llama = analogRead(A0);
// Lógica de alarma
if (llama < 100) {
digitalWrite(salidarelay, LOW); // alarma (ajustar a relé activo-bajo/alto)
lcdPrintLine(0, 0, "ALARMA! INCENDIO!");
} else {
digitalWrite(salidarelay, HIGH); // normalidad
lcdPrintLine(0, 0, "Temperatura-humedad");
}
// Escribir en SD en una sola línea CSV
myFile = SD.open("archivo.txt", FILE_WRITE);
if (myFile) {
myFile.print(millis() / 1000);
myFile.print(",");
myFile.print(h);
myFile.print(",");
myFile.print(t);
myFile.print(",");
myFile.print(hic);
myFile.print(",");
myFile.println(llama);
myFile.close();
} else {
Serial.println("Error al abrir archivo.txt para escribir");
}
// Monitor serie (opcional)
Serial.println("_______________");
Serial.print("Tiempo(s)="); Serial.println(millis() / 1000);
Serial.print("Humedad ="); Serial.print(h); Serial.println("%");
Serial.print("Temp. ="); Serial.print(t); Serial.println(" C");
Serial.print("Sens. T ="); Serial.print(hic); Serial.println(" C");
Serial.print("Infrarrojo (si <100 ALARMA) ="); Serial.println(llama);
}
|