Termostato inteligente y control de iluminación con Bluetooth
Componentes y suministros
| Arduino Nano R3 | 1 |
| Módulo Bluetooth HC-05 | 1 |
| Termómetro digital DS18B20 (1-Wire, resolución programable) | 1 |
| Pantalla OLED bicolor I2C 1306 (128x64) | 1 |
| Controlador de 4 relés I2C (ControlEverything.com) | 1 |
Aplicaciones y servicios en línea
- Morich Serial Bluetooth Terminal para Android
- Arduino Bluetooth Control Device para Android
Sobre el proyecto
Introducción
Proyecto DIY simple pero útil de termostato Arduino con Bluetooth.
Una rutina inteligente de termostato controla la caldera de gas, y el sistema conmuta las luces de la cocina y el ventilador de aireación del baño mediante relés – controlables por botones y dispositivo Android u ordenador vía Bluetooth. Disponible en versiones Celsius y Fahrenheit ¡Todos los componentes son artesanales!

Desarrollado en Arduino Nano (o superior), usa sensor de temperatura Dallas DS18B20, adaptador Bluetooth HC-05/06, pantalla OLED bicolor I2C 128x64 – puedes elegir otras pantallas LCD/OLED, la librería u8glib soporta muchos tipos.

Vídeo
El vídeo muestra todas las formas de funcionamiento importantes y da ideas para construir el proyecto desde el principio.
Modos de funcionamiento de la calefacción
- Calefacción única temporizada (15 min), útil en tardes de primavera/otoño
- Modo termostato (prioridad alta), la temperatura objetivo ajustada se almacena en memoria EEPROM
Algoritmo de protección de la caldera
El encendido y apagado frecuente y de corta duración acortaría la vida útil de la caldera de gas. Para evitarlo, el programa usa valores de corrección que declaran el grado de sobrecalentamiento y enfriamiento posterior. Una temperatura objetivo más baja exige valores de corrección mayores, porque las paredes están más frías y absorben mejor el calor del aire recién calentado, intensificando el efecto descrito.

Detección de ventana abierta
El programa detecta si hay una ventana abierta: si la temperatura cae al menos -0,2 °C (-0,36 °F) en un minuto, la calefacción se detiene o no arranca, y el ventilador de aireación se enciende para renovar el aire. Cuando el aire se calienta al menos +0,12 °C (+0,216 °F) gracias a la capacidad térmica del entorno, el sistema vuelve al modo normal y se cancela la "Alerta de ventana".
Detección de errores
Temperaturas medidas bajo 0 °C (32 °F) o sobre 40 °C (104 °F) se evalúan como fallo u otro problema (error, ventana rota, incendio, etc.), y todos los dispositivos se apagan.
Comunicación Bluetooth
La app GUI para Android tiene 8 botones, envía letras mayúsculas y minúsculas para encender ('A') o apagar ('a') la calefacción temporizada, 'B' y 'b' el ventilador, 'C' y 'c' las luces…

Otra fortaleza es el uso de terminal serie Bluetooth "geek-friendly". Solo chatea con el sistema vía Bluetooth usando un terminal serie – puede ser una app Android, pero también un PC normal, como el Monitor Serie del IDE Arduino.
El controlador envía informes de temperatura cada minuto automáticamente, e informes instantáneos sobre todos los eventos: dispositivo encendido/apagado, rutina termostato activada, etc.

Códigos de control
Acepta códigos de control y envía mensajes de confirmación. Mi estructura de comandos se basa en números de dos dígitos 'XY' donde:
- 'X' es el código de dispositivo, 'Y' el código de operación
- 30, 31, 32: iluminación Apagado / Encendido / Invertir estado lógico
- 40, 41, 42: ventilación Apagado / Encendido / Invertir estado lógico
- 50, 51, 52: programa de calefacción única (15 min) Apagado / Encendido / Invertir estado lógico
- 10 – 24: valores aceptados como temperatura objetivo para la función termostato
- 'r' – informe sobre estado de dispositivos controlados
- 'w' – desactiva manualmente el evento "alerta ventana"
- 'A, a… H, h' – letras aceptadas como las enviaría la app GUI
Versión Fahrenheit
Convertí todas las variables de corrección, referencias y ratios, manteniendo los cálculos y particularidades de funcionamiento.

Solo unas pocas modificaciones. Los nuevos códigos de dispositivo en la versión Fahrenheit:
- 1 – Iluminación (10: off, 11: on, 12: invertir estado)
- 2 – Ventilación
- 3 – Calefacción
- 50 – 76: valores de temperatura objetivo
La secuela
ACTUALIZACIÓN: ¡Sistema completo de domótica con enlace Bluetooth interno y control por voz!
Librerías y enlaces
DallasTemperature, elapsedMillis, OneWire, SoftwareSerial, olikraus/u8glib
Si usas resistencias de botón distintas o necesitas comprobar lecturas en A0, te sugiero consultar:
https://blog.codebender.cc/2015/07/20/tutorial-multiple-buttons-on-1-analog-pin/
Código
- Thermostat v11 - Versión Celsius.ino
- Thermostat v11 - Versión Fahrenheit.ino
Thermostat v11 - Versión Celsius.ino Arduino
El código se explica solo, útil para principiantes. Bien comentado, describe cada paso importante: qué, por qué y cómo. Dividido en módulos por funciones, fácil de revisar.
// Versión Celsius v1.1 // Código de programa de un termostato inteligente Arduino para smarthome,
// basado en Arduino Nano (o superior), sensor termo DS18B20, adaptador Bluetooth HC-05, pantalla OLED bicolor I2C 128x64.
// El sistema se controla por botones y smartphone Android vía bluetooth.
// Maneja la CALDERA de gas, el VENTILADOR de baño y la ILUMINACIÓN de cocina - conmutados con relés.
// La calefacción tiene dos modos. 1: Calefacción única temporizada (15 min), 2: Modo termostato (prioridad alta). La temp. objetivo ajustada se guarda en EEPROM.
// El programa detecta errores de hardware y apertura de ventana - en estos casos la calefacción se detiene y/o no arranca.
// Diseñado y programado por Gyula Osi. Todos los derechos reservados.
// ------------------------------------------------------------------------------------------------------------------------------------
// ---- Display I2C Bus, SDA(TX) -> A4, SCL(RX) -> A5
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // constructor display
byte frame = 0; // puntero logo inicio
// ---- Puertos y declaraciones relacionadas
const byte buzzer = 9; // buzzer a D9
int btnVal; // almacena valores analógicos de botones
const byte relayA = 11; // ventilación
bool aState = 0;
bool aStateByCmd; // si "alerta ventana" desaparece, control ventilación vuelve al estado original
const byte relayL = 13; // iluminación
bool lState = 0;
const byte relayH = 10; // calefacción
const byte ledH = 6; // puertos PWM permiten ajuste de nivel de salida para cambiar brillo
const byte ledA = 5;
const byte ledL = 3;
const byte bright[3] = {0, 10, 100};
byte brightHeat = bright[2];
#define ledInterval 1000 // intervalo parpadeo led calefacción
unsigned long prev = 0;
// ---- Cadenas para Display e Informes Serie
#define STATE_ITEMS 3 // cadenas indicadoras de estado de dispositivos para salidas
// i -> 0 1 2
const String state_str[STATE_ITEMS] = {"on.", "off.", "auto."};
String heaterState;
String airingState;
String lightingState;
#define FUNCT_ITEMS 11 // i -> 0 1 2 3 4 5 6 7 8 9 10
String funct_str[FUNCT_ITEMS] = {"Heater is ", "Airing is ", "Lighting is ", "Window Alert!", "Hardware Error!", "Hit a Key >>", "or send a Code!", "Target tempr = ", "Temperature = ", " * ", " -"};
// ---- Medición de Temperatura y Características Relacionadas con Calefacción
#include
elapsedMillis timer0; // temporizador PWM 8-bit, usado por función elapsedMillis()
#define sftyTmrInterval 15 * 60000 // intervalo modo calefacción única (15 min) [ms]
bool sftyTmrEnded; // booleano inicio, timer0 ha terminado
#include
byte tTarget; // temp. objetivo ajustada
const int addr = 0; // dirección actual de variable tTarget en memoria EEPROM
bool hState = 0; // estado booleano calefacción
bool hThermostat = 0; // estado booleano termostato
#include "OneWire.h"
#include "DallasTemperature.h"
#define DS18B20 2 // configura bus OneWire en D2
OneWire temprWire(DS18B20); // configura DS18B20 para trabajar en bus OneWire
DallasTemperature sensors(&temprWire);
float tempr; // valor medido
float temprPrev; // copia valor medido para análisis de tendencia
bool windowAlrt = 0; // grado especificado de caída temp.
bool measError = 0; // valor temp. medido fuera de rango normal
const long temprInterval = 60000; // intervalo medición cíclica temp. [ms]
unsigned long temprTmrPrev = 0; // elapsed será previo cuando se llame temprMeas()
float heatCorrVal; // declara grado de sobrecalentamiento y enfriamiento, ver tempMeas()
// ---- Configuración Comunicación Serie en RXD/TXD virtuales
#include
// pines SW serial RX & TX para HC-05
const int RX1 = 8;
const int TX1 = 4;
SoftwareSerial sUART(RX1,TX1);
char RX[2]; // almacena datos serie recibidos
bool errMsgSentBySys = 0;
bool startup = 1; // evita informe BT duplicado al inicio
const uint8_t frame1[] U8G_PROGMEM = { /* mapa XBM omitido por brevedad */ };
void setup() {
sUART.begin(9600);
pinMode(relayH, OUTPUT);
relayHandlerH(4); // obtener estado funcionamiento
pinMode(ledH, OUTPUT);
pinMode(relayA, OUTPUT);
relayHandlerA(4);
pinMode(ledA, OUTPUT);
pinMode(relayL, OUTPUT);
relayHandlerL(4);
pinMode(ledL, OUTPUT);
pinMode(buzzer, OUTPUT);
sensors.begin(); // inicia DS18B20
temprMeas(); // no esperar timer medición, llamar función una vez al inicio
tTarget = EEPROM.read(addr); // leer tTarget guardado previamente en EEPROM al inicio
startup = 0;
if (!measError) { sTX(8); } else { sTX(2); }
}
void loop() {
temprTimer();
ledHandler();
btnReadings();
sRX();
safetyTmr();
u8g.firstPage(); // bucle pantalla
do { draw(); } while( u8g.nextPage() );
if (frame == 0) { delay(3000); frame = 1; clrScr(); }
}
// ... (resto del código omitido por brevedad, disponible en repositorio)
Thermostat v11 - Versión Fahrenheit.ino Arduino
Funciona en Fahrenheit, solo cambié valores de temperatura objetivo (50-76) y códigos de dispositivo (1, 2, 3).
// Versión Fahrenheit v1.1 // Código de programa de un termostato inteligente Arduino para smarthome,
// basado en Arduino Nano (o superior), sensor termo DS18B20, adaptador Bluetooth HC-05, pantalla OLED bicolor I2C 128x64.
// El sistema se controla por botones y smartphone Android vía bluetooth.
// Maneja la CALDERA de gas, el VENTILADOR de baño y la ILUMINACIÓN de cocina - conmutados con relés.
// La calefacción tiene dos modos. 1: Calefacción única temporizada (15 min), 2: Modo termostato (prioridad alta). La temp. objetivo ajustada se guarda en EEPROM.
// El programa detecta errores de hardware y apertura de ventana - en estos casos la calefacción se detiene y/o no arranca.
// Diseñado y programado por Gyula Osi. Todos los derechos reservados.
// ------------------------------------------------------------------------------------------------------------------------------------
// (Código similar a versión Celsius con adaptaciones para °F)
Esquemáticos
Para prueba con cables jumper...
Hay que soldarlo
Proceso de manufactura
- Sistema de control de acceso integrado con QR, RFID y verificación de temperatura
- Mando universal Android con Arduino, 1Sheeld y control IR
- Alcancía Inteligente: Controla un Aceptador de Monedas con Arduino Nano
- Sistema automático de riego para plantas con Arduino
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Zapatillas Inteligentes Autoajustables con Cosecha de Energía Integrada
- Controla Dos Motores Paso a Paso con Arduino Nano y Joystick - Tutorial Sencillo
- Control Preciso de Servo con Arduino y MPU6050 (SG90 / MG996R)
- Electrodomésticos activados por voz: Control Bluetooth con Google Assistant
- Control remoto de coche con Arduino Uno y Bluetooth: Guía paso a paso
- Cargador inteligente de baterías avanzado con multiplexación y display digital