¡Es hora del segundo gran proyecto! Vamos a integrar todo lo aprendido en el parcial para construir un sistema de control de temperatura inteligente y con múltiples niveles de acción. Nuestro dispositivo no solo reaccionará al calor, sino que tomará diferentes medidas dependiendo de la gravedad de la situación, mostrando toda la información en tiempo real.
🧠 La Lógica del Proyecto: Control por Niveles con `if / else if / else`
A veces, no basta con una sola decisión `if/else`. Necesitamos una cadena de decisiones. La estructura `if / else if / else` nos permite evaluar múltiples condiciones en orden. El programa revisa la primera condición `if`. Si no se cumple, revisa la siguiente `else if`. Continúa así hasta que encuentra una que sea verdadera o llega al `else` final, que actúa como la opción por defecto. Esto es perfecto para crear sistemas con diferentes "modos" o "niveles de alerta".
🧠 El Código: Un Sistema de Alerta Multinivel
Construiremos un termostato que lee la temperatura con el LM35, la muestra en la LCD, y toma acciones por niveles: si hace un poco de calor, enciende un ventilador (con transistor); si hace mucho calor, además del ventilador, activa una alarma (con un relé).
/*
* PROYECTO INTEGRADOR 2: Estación de Control Térmico
* Descripción: Controla un ventilador y una alarma de foco según la temperatura.
* Por: Profe Campos
* CECyTEM 05 Guacamayas
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// --- PINES ---
const int pinSensor = A0;
const int pinVentilador = 9; // Controla el transistor
const int pinFoco = 7; // Controla el relé
// --- UMBRALES ---
const float UMBRAL_VENTILADOR = 30.0;
const float UMBRAL_PELIGRO = 38.0;
// --- OBJETOS ---
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(pinVentilador, OUTPUT);
pinMode(pinFoco, OUTPUT);
lcd.init();
lcd.backlight();
lcd.print("Control de Clima");
lcd.setCursor(0, 1);
lcd.print(" V 1.0");
delay(2000);
lcd.clear();
}
void loop() {
// --- LECTURA Y CÁLCULO DE TEMPERATURA (LM35) ---
int valorSensor = analogRead(pinSensor);
float voltaje = (valorSensor / 1023.0) * 5.0;
float temperatura = voltaje * 100;
// --- LÓGICA DE CONTROL POR NIVELES ---
if (temperatura < UMBRAL_VENTILADOR) {
// Nivel 1: Normal
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.print(" C ");
lcd.setCursor(0, 1);
lcd.print("Estado: Normal ");
digitalWrite(pinVentilador, LOW);
digitalWrite(pinFoco, LOW);
} else if (temperatura >= UMBRAL_VENTILADOR && temperatura < UMBRAL_PELIGRO) {
// Nivel 2: Enfriando
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.print(" C ");
lcd.setCursor(0, 1);
lcd.print("Estado: Enfriando");
digitalWrite(pinVentilador, HIGH); // Ventilador ON
digitalWrite(pinFoco, LOW); // Foco OFF
} else {
// Nivel 3: Peligro
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("!!! ALERTA !!!");
lcd.setCursor(0, 1);
lcd.print("Temp: ");
lcd.print(temperatura);
lcd.print(" C");
digitalWrite(pinVentilador, HIGH); // Ventilador ON
digitalWrite(pinFoco, HIGH); // Foco ON (Alarma)
}
delay(1000);
}
🔌 Manos a la Obra: El Circuito
Integraremos el circuito del LM35 + Transistor con el de la LCD + Relé, creando un sistema de control autónomo y con múltiples niveles de acción.
Diagrama del Circuito 10
💡 Conceptos Clave de la Misión
- Lógica `if / else if / else`: Permite crear una cadena de decisiones para manejar múltiples estados o niveles en un sistema.
- Sistemas Embebidos: Un dispositivo con una computadora dedicada a una tarea específica, como nuestro termostato, que es un prototipo de un sistema embebido real.
🚀 ¡Inténtalo Tú Mismo! (Retos)
- Umbrales Ajustables: Añade dos potenciómetros. Uno para ajustar el `UMBRAL_VENTILADOR` y otro para el `UMBRAL_PELIGRO` en tiempo real. ¡Muestra los valores de umbral en la LCD!
- Modo Silencio: Agrega un botón que, al ser presionado, desactive la alarma del relé temporalmente, aunque la temperatura siga en nivel de peligro.
- Registro de Temperatura Máxima: Programa el sistema para que recuerde y muestre en la LCD la temperatura más alta que se ha registrado desde que se encendió.