Vocabulario técnico inglés-español – Technical Glossary

Recursos para técnicos y estudiantes – Technical and student resources

Buscar en www.sapiensman.com:


Travel Chess Sets

Save 10% on your order by signing up for our newsletter at thechessstore.com.

21- Aplicaciones Electrónicas. Desarrollo con Arduino para medición de temperatura, humedad, sensación térmica. Detección de incendio. Con almacenamiento de datos en SD.

El siguiente desarrollo está destinado a realizar un seguimiento de la temperatura, humedad relativa y sensación térmica del salón donde se encuentra el sensor. Se pensó el proyecto para ser usado en depósitos cerrados de material inflamable, como por ejemplo fardos de algodón, o tanques de líquidos inflamables, donde se podrían producir incendios por elevación excesiva de temperatura o por reacciones químicas.  
Se busca tomar las muestras de los valores citados en forma continua y almacenarlos en un archivo de tarjeta SD, con fines estadísticos, y para sacar conclusiones sobre las variaciones climáticas del entorno.

Consta además de un sensor de llama, y un relé que se activa como alarma con el sensor de llama. Se desarrollaron dos programas para operar el dispositivo, uno para habilitar la lectura continua de datos desde el sensor, la visualización de los mismos en un display de 20 caracteres  por cuatro filas,  la grabación de los datos en una tarjeta SD, la medición permanente de rayos ultravioleta en el recinto, que puede detectar posibles fuentes de llama, y en ese caso, conmuta un relé que se puede usar para una alarma externa.

El dispositivo que se podría activar con el relé no está incluido en el proyecto, pero podría ser una bocina, lámpara, etc., que se active con otra tensión de trabajo, como por ejemplo 220 V CA, 12V CC, etc.

El otro programa, en caso de requerirse, está destinado a leer los datos almacenados en la tarjeta SD, en formato CSV, y mostrarlos en el monitor serie, y  que podrían usarse para fines estadísticos. Y también debería cargarse en la misma plaqueta usada para almacenar los datos. Este sketch, se usaría en caso de que no se quiera quitar la tarjeta SD del desarrollo Arduino, la  que podría leerse en una PC. Entonces a fin de evitar esto, se usará el mismo.

La plataforma de hardware elegida para el desarrollo es Arduino, con una placa Arduino Uno, display LED 20x4 (LCD2004) y un sensor de temperatura y humedad DHT11 (en placa HW-507). Desarrollando el software en el entorno de desarrollo integrado IDE Arduino.

 

 

 

 

Vídeo : https://youtu.be/Ue7g8XNH5CE

#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);
}

A continuación, Sketch para el caso en que se quiera leer el contenido almacenado en la tarjeta SD, directamente desde el mismo Arduino Uno, a través del monitor serie. La otra alternativa es extraer la tarjeta y leerla en alguna lectora de tarjetas en la PC.
Al hacer correr el programa siguiente, habrá que abrir el monitor serie, y los datos aparecerán en forma inmediata en formato CSV (o sea archivo de texto, separado por comas):

// Desarrollo para Diplomatura en robótica, año 2022

#include <SPI.h>
#include <SD.h>
#include <LiquidCrystal.h>

// LCD 20x4 en Arduino UNO
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// SD
const int SD_CS = 3; // Chip Select del módulo SD (ajustá según tu cableado)
File myFile;

void setup() {
// LCD
lcd.begin(20, 4);
lcd.print("Leyendo datos SD");
lcd.setCursor(0, 1);
lcd.print("Ver Monitor Serie");

// Serial
Serial.begin(115200);
while (!Serial) { ; } // por si se usa Leonardo/Micro (en UNO se ignora)
Serial.println("Iniciando SD ...");

// Asegurar SPI master en UNO
pinMode(10, OUTPUT);

// Iniciar SD
if (!SD.begin(SD_CS)) {
Serial.println("No se pudo inicializar la SD");
lcd.setCursor(0, 2);
lcd.print("SD: FALLO INICIO ");
return;
}
Serial.println("Inicializacion exitosa");
lcd.setCursor(0, 2);
lcd.print("SD: OK ");

// Abrir archivo
myFile = SD.open("archivo.txt");
if (myFile) {
Serial.println("archivo.txt:");
// Vuelco directo del contenido (CSV o texto plano)
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
Serial.println();
Serial.println("---- Fin de archivo ----");

lcd.setCursor(0, 3);
lcd.print("Lectura completada ");
} else {
Serial.println("Error al abrir archivo.txt");
lcd.setCursor(0, 3);
lcd.print("Error abriendo arch");
}
}

void loop() {
// Nada: solo lectura una vez
}