// Código realizado por Noelia de la Plaza
// Máster en Ingenieria de Telecomunicaciones
// Asigantura: Equipos e Instrumentación Electrónica.
// UNIR curso 2024-2025
// Este sistema permite medir y supervisar condiciones ambientales mediante
// múltiples sensores de diferente naturaleza: analógicos, digitales y MEMS.
// Incluye sensores de temperatura, humedad, inclinación y luminosidad.
// Genera alertas en condiciones críticas mediante salidas visuales (LCD, LEDs)
// y sonoras (buzzer). Está diseñado como una estación inteligente de monitoreo
// orientada a un escenario como una boya ambiental o sistema remoto.
// Para medir la tempertura se usan 2 sensores, uno
// analogico y otro digital, para comparar su sensibildad y funcionamiento
// bajo las mismas carácteristicas. Se representan ambos valores sobre el LCD.
// Con una alarma sonora se representa cuando esta temperatura ha superado un umbral de
// 80º en cualquiera de los dos sensores, considerandose un indencio.
// Para saber sí es de día o de noche, se emplea un fotodetector con lectura
// analogica. Mediante un LED amarillo, se representa la lectura del fotodetector.
// En este caso solo se emplean 2 valores, día y noche, considerando rangos intermedios
// tal y como se describe en le memoria de la práctica. De tal manera que cuando es de
// noche se enciende el LED de posicón y cuando es de día se apaga.
// Para medir la humedad, se emplea un lector digital y se representa con un LCD.
// Este sensor es util para saber si la boya esta bajo el agua, por lo que si se
// encuentra en 100% por más de 20 segundos se consdiera que esta hundido y se
// emplea la LCD para reprsentar que se envia una señal de alerta a la central de
// monitorado.
// Para medir la posición y la inclinación se emplea un giroscopio y se reprsenta
// con un servo la inclinación. Con un LED rojo se indica cuando esta inlcinación
// supera un umbral de 70º
// Resumen de sus funcionalidades:
// - Medición dual de temperatura (DHT22 y NTC) con activación de alarma por incendio
// - Detección de día/noche mediante LDR con LED indicador nocturno
// - Medición de humedad ambiental para detectar boya hundida
// - Medición de inclinación (MPU6050) con servo como actuador y LED de alerta
// - Todas las alertas se muestran de forma clara en la pantalla LCD
// Inclusión de librerías necesarias
#include <DHT.h> // Sensor de temperatura y humedad digital
#include <LiquidCrystal.h> // Control de pantalla LCD sin I2C
#include <Servo.h> // Control de servomotor
#include <Wire.h> // Protocolo I2C para sensores como MPU6050
#include <MPU6050.h> // Acelerómetro y giroscopio MPU6050
#include <math.h> // Librería matemática para cálculos
// logarítmicos (Ley de Beta dada por el Data sheet del NTC- lector
// analogico de temperatura)
// Definición de pines de los sensores y actuadores
#define DHTPIN 7 // Pin digital para datos del sensor DHT22
#define DHTTYPE DHT22 // Especificación del tipo de sensor DHT
#define LDRPIN A0 // Pin analógico para fotodetector (LDR)
#define NTCPIN A1 // Pin analógico para termistor NTC
#define LED_LUZ 9 // LED amarillo que se enciende de "noche"
#define LED_INCLINACION 8 // LED rojo que indica inclinación crítica
#define BUZZER 10 // Zumbador para alerta sonora (temperatura crítica)
#define SERVOPIN 6 // Pin digital para señal de control del servo-
// representación físca de la inclinación.
// Declaración de objetos de sensores y actuadores
DHT dht(DHTPIN, DHTTYPE); // Objeto del sensor DHT
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Objeto de la pantalla LCD 1602
Servo servo; // Objeto para controlar el servomotor
MPU6050 mpu; // Objeto para el sensor de inclinación MPU6050
// Variables de estado del sistema
float tempDHT, humDHT, tempNTC; // Variables para temperaturas y humedad
int valorLDR, servoAngle; // LDR y ángulo calculado del servo.
String luzAmbiente; // Estado de luminosidad: "DIA" o "NOCHE"
unsigned long humedad100Timer = 0; // Temporizador para detección de boya hundida
// Constantes de umbral para activar alertas
const int UMBRAL_TEMP = 70; // Temperatura crítica (°C) para incendio
const int UMBRAL_INCLINACION = 80; // Ángulo crítico de inclinación (°)
void setup() {
// Inicialización de la comunicación serie para debugear el codigo
Serial.begin(9600);
// Inicialización de sensores
dht.begin(); // DHT22 (digital)
Wire.begin(); // Comunicación I2C
mpu.initialize(); // Sensor MPU6050
// Inicialización de pantalla LCD 1602 (16 columnas, 2 filas)
lcd.begin(16, 2);
// Configuración del servomotor
servo.attach(SERVOPIN);
// Configuración de pines de salida
pinMode(LED_LUZ, OUTPUT); // LED para indicar noche
pinMode(LED_INCLINACION, OUTPUT); // LED de alerta de inclinación
pinMode(BUZZER, OUTPUT); // Alarma sonora
// Mensaje de inicio
lcd.print("Sistema Activo");
delay(2000);
lcd.clear();
}
void loop() {
// LECTURA DE LUZ AMBIENTE CON LDR
valorLDR = analogRead(LDRPIN); // Conversión ADC de la luminosidad
luzAmbiente = (valorLDR < 500) ? "DIA" : "NOCHE"; // Umbral arbitrario para luz/noche
digitalWrite(LED_LUZ, luzAmbiente == "NOCHE"); // LED solo se enciende de noche
// SENSOR DHT22: TEMPERATURA DIGITAL Y HUMEDAD
tempDHT = dht.readTemperature(); // Temperatura en grados Celsius
humDHT = dht.readHumidity(); // Humedad relativa en %
// DETECCIÓN DE BOYA HUNDIDA
bool alertaHumedad = false;
if (humDHT >= 100.0) {
if (humedad100Timer == 0) humedad100Timer = millis();
if (millis() - humedad100Timer >= 20000) {
alertaHumedad = true;
}
} else {
humedad100Timer = 0; // Reset del temporizador si baja del 100% humedo
}
// SENSOR NTC: TEMPERATURA ANALÓGICA
int ntcRaw = analogRead(NTCPIN);
float Vout = ntcRaw * (5.0 / 1023.0); // Convertir valor ADC a voltaje
float R1 = 10000.0; // Resistencia fija del divisor (10kΩ)
// Protección: evitar Vout = 0 que causaría división por cero
if (Vout < 0.1) Vout = 0.1; // Límite mínimo seguro
// Cálculo de resistencia del NTC a partir del divisor de tensión
float Rntc = (5.0 * R1 / Vout) - R1; // Fórmula invertida del divisor
// Parámetros del NTC (según hoja técnica)
float B = 3950.0; // Constante Beta típica del material
float T0 = 298.15; // T0 = 25°C en Kelvin
float R0 = 10000.0; // Resistencia del NTC a 25°C
// Aplicación de la Ley de Beta (sacada del dara-sheet)
float invT = (1.0 / T0) + (1.0 / B) * log(Rntc / R0);
float tempK = 1.0 / invT;
tempNTC = tempK - 273.15; // Conversión a grados Celsius
//DETECCIÓN DE INCENDIO
bool alertaIncendio = (tempDHT >= UMBRAL_TEMP || tempNTC >= UMBRAL_TEMP);
digitalWrite(BUZZER, alertaIncendio); // Se activa si hay incendio
// SENSOR MPU6050: INCLINACIÓN Y ACTUACIÓN DEL SERVO
int16_t ax, ay, az, gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // Lectura de los seis ejes
servoAngle = map(ay, -17000, 17000, 0, 180); // Conversión a grados del servo
servoAngle = constrain(servoAngle, 0, 180); // Limitación de valores
servo.write(servoAngle); // Aplicación del ángulo al servo
// DETECCIÓN DE INCLINACIÓN CRÍTICA
bool alertaInclinacion = (servoAngle > UMBRAL_INCLINACION);
digitalWrite(LED_INCLINACION, alertaInclinacion); // LED rojo activo si pasa de 70°
// VISUALIZACIÓN DE ALERTAS EN EL LCD
lcd.clear();
if (alertaIncendio) {
lcd.setCursor(0, 0);
lcd.print("ALERTA: INCENDIO");
lcd.setCursor(0, 1);
lcd.print("T >= ");
lcd.print(UMBRAL_TEMP);
lcd.print("C");
} else if (alertaHumedad) {
lcd.setCursor(0, 0);
lcd.print("BOYA HUNDIDA");
lcd.setCursor(0, 1);
lcd.print("ENVIANDO AVISO");
} else if (alertaInclinacion) {
lcd.setCursor(0, 0);
lcd.print("ALERTA INCLIN.");
lcd.setCursor(0, 1);
lcd.print("Angulo: ");
lcd.print(servoAngle);
lcd.print((char)223); // Símbolo de grado
} else {
// Visualización normal si no hay ninguna alerta activa
lcd.setCursor(0, 0);
lcd.print("T1:");
lcd.print(tempDHT, 0);
lcd.print("C H:");
lcd.print(humDHT, 0);
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("T2:");
lcd.print(tempNTC, 0);
lcd.print(" S:");
lcd.print(servoAngle);
lcd.print(" ");
lcd.print(luzAmbiente == "DIA" ? "D" : "N");
}
// Pequeña pausa para estabilizar lectura y evitar parpadeo en LCD
delay(500);
}
Fotoresistor.
Detecta si es de día o de noche
LED.
Encendido: Es de noche, se enciende una luz de posición.
Apagado: Es de día, no es necesario tener luz.
Sensor de posición e inclinación, determina la inclinación.
Se le dan valores aleatorios con el tiempo y se representa la inclinación sobre el servo.
Representa la inclinación de la boya.
Sensor digital de humedad y temperatura.
Se pone una resistencia cercana para darle un valor nominal de 25º.
Se va a comparar con los resultados de un sensor de temperatura analógico.
Sensor de temperatura analógico.
Pantalla LCD representa:
T1: Temperatura del sensor digital en ºC
H: Humedad relativa en %.
T2: Temperatura del sensor analógico en ºC.
Inc: Indica el ángulo de inclinación de la bolla en º.
DIA/NOCHE: Indica si es de día o de noche.
220 Ohm
10 Kohm
10 Kohm
Trabajo realizado por:
Noelia de la Plaza Lafuente
para la asignatura de Equipos e Instrumentación Electrónica del Máster en Ingeniería de Telecomunicaciones de UNIR en el curso 2024/2025