Alarma Amanecer Inteligente: Despierta con Luz Suave Gradual
Componentes y materiales
| Arduino Nano R3 | 1 | |
| Módulo RTC DS3231 Maxim Integrated | Reloj en tiempo real preciso, mantiene hora sin alimentación | 1 |
Sobre el proyecto
El invierno llega, las noches son más largas que los días, y despertar a las 6am en una habitación fría y oscura es una pesadilla. ¿Y si pudiéramos crear un "amanecer artificial" para que la habitación se sienta cálida y agradable?
Crearé una bombilla inteligente que encaje en mi lámpara de techo actual. Simulará el amanecer encendiendo la luz gradualmente. Si funciona, la conectaré al móvil para hacer un despertador completo.
La bombilla
Para crear una bombilla inteligente necesitas una bombilla "tonta" por su casquillo que se enrosca en la lámpara y da alimentación. La rompí con un martillo. Este delicioso procedimiento quitó el vidrio del casquillo de aluminio y, tras soldar cables al casquillo y al contacto inferior, la base de la bombilla inteligente quedó lista.
Luego necesitas soporte para la electrónica. Usé una placa perforada cortada a medida para Arduino Nano, fuente 5V y componentes.

Circuito de alta tensión
⚠ ADVERTENCIA: Trabajas con voltajes >50V. Contacto con alta tensión puede causar lesiones graves o muerte.
Como uso bombilla normal alimentada por red AC, no puedo controlar directamente la potencia con el microcontrolador. Necesito un TRIAC: actúa como relé de conmutación rápida. El microcontrolador enciende/apaga el TRIAC para alterar la onda senoidal AC, atenuando o aumentando la luz.
Pero el voltaje AC se controla distinto que DC. La onda senoidal debe cortarse en momentos precisos: el TRIAC debe encenderse/apagarse en instantes exactos para lograrlo (ver imagen). El microcontrolador debe detectar el cruce por cero de la tensión de red para cortar cada semi-onda al mismo tamaño; si no, la luz parpadea.

Para detectar cruce por cero uso un optoacoplador 4N35 (U1) con transistor que se activa al cruzar la onda por cero. El microcontrolador lo ve como señal HIGH. El optoacoplador también aísla baja tensión del circuito de red.
Segundo optoacoplador MOC3063 (U2) con TRIAC en salida aísla el microcontrolador del TRIAC de potencia (Q2). Importante: No use optoacoplador con cruce por cero incorporado, porque solo conmuta al cruzar la onda por cero.

Circuito de baja tensión
Microcontrolador: Arduino Nano. Controla el TRIAC y enciende la luz a la hora programada. Para reloj en tiempo real uso módulo DS3231 preciso que mantiene hora sin alimentación.
Para alimentar chips a 5V uso fuente conmutada 5V 700mA conectada a la tensión de red del casquillo. ¡Solución compacta y práctica!

Código
El programa es simple. Al encender la lámpara por el interruptor, ilumina la habitación y la atenúa lentamente a oscuridad como verificación. Durante la noche comprueba el RTC DS3231 y a las 6am ilumina gradualmente hasta "luz diurna" completa hasta que se apaga por el interruptor.
Revise el código adjunto, creo que es autoexplicativo. ¡Si no lo es, soy mal desarrollador!
¿Qué sigue?
Experimentaré días/semanas y si me despierta por las mañanas, evolucionaré el proyecto a algo más inteligente y menos rudimentario.

¡Buenas noches!
Código
/* Bombilla inteligente que enciende cuando es hora de levantarse.
Funcionamiento:
1) Al encender, la luz se enciende como prueba y se atenúa lentamente
2) A las 6am la luz se enciende gradualmente hasta que se apaga por la tarde
3) No enciende si la habitación ya no está oscura (fotorresistencia)
Uso: Encienda al acostarse, se encenderá al amanecer. Apague al salir.
La hora se preserva gracias al módulo DS3231
@author Jiri Praus (https://twitter.com/jipraus)
Control luz AC inspirado en https://arduinotehniq.blogspot.com/2014/10/ac-light-dimmer-with-arduino.html */
#include <TimerOne.h>
#include "RTClib.h"
#define TRIAC_PIN 2
#define ZERO_CROSS_PIN 3
#define LIGHT_SENSOR_PIN A6
#define FREQUENCY_STEP 75 // 50Hz (cambiar a 65 para 60Hz)
#define CHANGE_DIM_LEVEL_EVERY 1
#define MAX_DIM_LEVEL 128 // apagado
#define MIN_DIM_LEVEL 0 // encendido
#define DARK_THRESHOLD 300
volatile byte triacCounter = 0;
volatile boolean zeroCrossed = false;
byte dimLevel = MIN_DIM_LEVEL;
boolean lightOn = false;
RTC_DS3231 rtc;
void setup() {
Serial.begin(115200);
digitalWrite(TRIAC_PIN, LOW);
pinMode(TRIAC_PIN, OUTPUT);
pinMode(ZERO_CROSS_PIN, INPUT);
pinMode(LIGHT_SENSOR_PIN, INPUT);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while(1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, setting time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
noInterrupts();
attachInterrupt(digitalPinToInterrupt(ZERO_CROSS_PIN), zeroCrossDetected, RISING);
interrupts();
Timer1.initialize(FREQUENCY_STEP);
Timer1.attachInterrupt(triacTimerInterrupt, FREQUENCY_STEP);
}
void loop() {
delay(CHANGE_DIM_LEVEL_EVERY * 1000);
checkAlarmClock();
adjustDimLevel();
debugPrint();
}
void zeroCrossDetected() {
zeroCrossed = true;
triacCounter = 0;
digitalWrite(TRIAC_PIN, LOW);
}
void triacTimerInterrupt() {
if (dimLevel >= MAX_DIM_LEVEL) {
digitalWrite(TRIAC_PIN, LOW);
} else if (dimLevel <= MIN_DIM_LEVEL) {
digitalWrite(TRIAC_PIN, HIGH);
} else if (zeroCrossed) {
if (triacCounter >= dimLevel) {
digitalWrite(TRIAC_PIN, HIGH);
zeroCrossed = false;
} else {
triacCounter++;
}
}
}
void adjustDimLevel() {
if (lightOn && dimLevel > MIN_DIM_LEVEL) dimLevel--;
else if (!lightOn && dimLevel < MAX_DIM_LEVEL) dimLevel++;
}
void checkAlarmClock() {
if (!lightOn && isRoomDark()) {
DateTime now = rtc.now();
if (now.hour() == 6 && now.minute() == 0) {
lightOn = true;
}
}
}
boolean isRoomDark() {
return analogRead(LIGHT_SENSOR_PIN) < DARK_THRESHOLD;
}
void debugPrint() {
Serial.print("lightOn="); Serial.println(lightOn);
Serial.print("dimLevel="); Serial.println(dimLevel);
DateTime now = rtc.now();
Serial.print("datetime=");
Serial.print(now.year(), DEC); Serial.print('/');
Serial.print(now.month(), DEC); Serial.print('/');
Serial.print(now.day(), DEC); Serial.print(' ');
Serial.print(now.hour(), DEC); Serial.print(':');
Serial.print(now.minute(), DEC); Serial.print(':');
Serial.println(now.second(), DEC);
Serial.print("lightLevel="); Serial.println(analogRead(LIGHT_SENSOR_PIN));
}
Esquemáticos
Proceso de manufactura
- Explorando la suma de voltajes con conexiones de baterías en serie
- Laboratorio de divisor de voltaje: diseño, medición y verificación de la ley de voltaje de Kirchhoff
- Termoelectricidad: entendiendo termopares y el efecto Seebeck
- Voltímetro Potenciométrico: Medición Precisa de Voltaje con Carga Mínima
- Construye una Batería de Patata: Guía Paso a Paso para Energía Electroquímica Casera
- Fuente de Alimentación CA de Bajo Voltaje: Componentes y Mejores Prácticas para Circuito de Desfase de Fase
- Experimento Regulador de Voltaje con Diodo Zener de 12 Voltios
- Amplificador Seguidor de Voltaje: Diseño, Construcción y Guía de Medición
- Diseño de Amplificador Emisor Común Multi-Etapa de Alta Ganancia con Realimentación Negativa
- Diseño de Amplificador Diferencial de Alta Ganancia con Transistores NPN
- Diodos de Propósito Especial: Schottky, Tunel, LED, Láser, Fotodiodo y Innovaciones en Celdas Solares