Los humanos están programados naturalmente para despertarse con el amanecer; lamentablemente la vida moderna está dictada por un reloj arbitrario, que a menudo nos obliga a despertar cuando no hay luz natural. Hoy, haremos un despertador de amanecer, que te despertará suave y lentamente sin recurrir a una máquina ofensiva para hacer ruido.
Si hacer una alarma de amanecer es un poco demasiado para ti, mira estas aplicaciones de iPhone y Android. Usa estas aplicaciones para ayudarte a dormir mejor [Android y iOS]. Usa estas aplicaciones para ayudarte a dormir mejor [Android y iOS] después de un agitado día, lo mejor que puede hacer es obtener una cantidad beneficiosa de sueño. Siempre aparecen nuevos estudios que demuestran lo importante que es realmente el sueño para una persona, mejorando ... Leer más que detecta cuándo es el mejor momento para despertarlo con movimientos corporales. ¿Puede una aplicación realmente ayudarlo a dormir mejor? ¿Puede una aplicación realmente ayudarte a dormir mejor? Siempre he sido un poco experimentador del sueño, durante gran parte de mi vida he tenido un diario de sueños meticuloso y he estudiado tanto como pude sobre dormir en el proceso. Hay un ... Leer más, asegurándote de que no te alejen de ese sueño increíble, sino que te despiertes sintiéndote brillante y refrescado, realmente funcionan.
Perfil del proyecto
La parte principal del proyecto será una luz de tira LED de 5 metros colocada alrededor de la cama. Los alimentaremos con un suministro externo de 12 voltios, conmutados usando algunos transistores MOSFET N. La configuración para esta parte será idéntica al sistema de iluminación dinámica. Diseñe su propia iluminación ambiental dinámica para un centro de medios. Cree su propia iluminación ambiental dinámica para un centro de medios. Si ve muchas películas en su PC o centro de medios, estoy Seguro que has enfrentado el dilema de iluminación. ¿Apagas completamente todas las luces? ¿Los mantienes en pleno funcionamiento? O ... Leer más He construido antes.
El tiempo será un problema, ya que este es un prototipo, voy a configurar el Arduino para contar desde cada vez que se restablece. En teoría, solo deberíamos perder un segundo o dos cada día, pero idealmente incluiríamos un chip de "reloj de tiempo real" para hacer esto de manera más confiable. La alarma de amanecer comenzará 30 minutos antes de la hora de despertarse, y aumentará lentamente el nivel de salida hasta que esté al 100% de brillo; esto debería ser suficiente para despertarnos, aunque es una buena idea seguir usando su reloj de alarma hasta que su cuerpo acostumbrado.
También incorporaré una luz nocturna en este proyecto, que detecta el movimiento y activa una discreta luz de bajo nivel debajo de la cama con un tiempo de espera de 3 minutos, separado de las luces LED, ya que eso provocaría que mi esposa y yo nos despertáramos. . La iluminación debajo de la cama será una unidad comercial principal, así que hackearé un relevador dentro de un enchufe para encenderlo y apagarlo. Si no se siente cómodo trabajando con corriente de CA de 110-240v bajo ninguna circunstancia (y generalmente es una buena regla), conecte un transmisor inalámbrico de 433 MHz con enchufes de conmutación, como se describe en el proyecto de domótica Raspberry Pi Arduino Guía de automatización del hogar con Raspberry Pi y Arduino Guía de automatización del hogar con Raspberry Pi y Arduino El mercado de la automatización del hogar está inundado con costosos sistemas de consumo, incompatibles entre sí y costosos de instalar. Si tienes un Raspberry Pi y un Arduino, básicamente puedes lograr lo mismo en ... Leer más.
Lista de piezas y esquema
- Arduino
- Conjunto de luces de LED RGB
- Fuente de alimentación de 12 voltios
- 3 x transistores MOSFET N (uso el tipo STP16NF06FP)
- Enchufe de relé y alimentación, o enchufes inalámbricos controlados y transmisor adecuado
- Su elección de luz nocturna (la red regular alimentada con enchufe está bien)
- Sensor de movimiento PIR (HC-SR501) o un sonar SC-04 (no tan efectivo)
- Sensor de luz
- Código de proyecto, pero sigue leyendo para asegurarte de que entiendes cómo personalizar todo.
Aquí está el esquema completo.
Cableado de un relé
Nota : Omita esta sección si desea usar las luces RGB como una luz nocturna también, esto es específicamente para encender una luz de alimentación eléctrica separada.
Para cambiar la alimentación de la red, su relé necesitará una tensión de 110V o 240V AC, dependiendo de dónde viva, y más del amperaje total que va a cambiar. El que he usado de este paquete de sensores (descargo de responsabilidad: esa es mi tienda) es 250VAC / 10A, por lo que deberíamos estar a salvo. Los relés tienen un puerto com, generalmente en el centro, que debe conectarse al cable vivo que entra al enchufe; luego conecte el terminal en vivo del socket al NO (normalmente abierto). No debería tener que decirte que no hagas esto si está enchufado a una toma de corriente o si vas a morir. Si tiene miedo de meterse con la alimentación de la red eléctrica, utilice enchufes inalámbricos conmutados en su lugar.
Los cables de tierra y neutro deben ir directamente al zócalo y no tocarán el relevador. Puede que no tenga una línea de tierra en los Estados Unidos. Es su responsabilidad conocer el código de colores de los cables en su área local ; si no pudiera cablear un enchufe normal en su hogar o volver a conectar un enchufe, ¡no intente insertar un relé en uno!
Para probar, conecte el pin de la señal de relé a 12, luego ejecute un programa de parpadeo simple modificado para trabajar en el pin 12, no en 13 como es predeterminado. Su toma debe encenderse y apagarse cada pocos segundos. La razón por la que no estoy usando el pin 13 es porque durante el proceso de carga, el LED integrado se dispara en sucesión rápida para indicar actividad en serie, lo que provocaría que el relé se active también.
Obtener el tiempo correcto
Las funciones de temporización y reloj son difíciles sin acceso a una conexión de red o reloj en tiempo real dedicado (estos incluyen sus propias baterías para mantener el reloj incluso cuando el Arduino principal no tiene energía). Para mantener los costos bajos, voy a hacer trampa. Voy a estar codificando una hora de inicio para que el Arduino comience su cuenta atrás; los tiempos serán por lo tanto relativos a este tiempo de inicio. Cada 24 horas, el reloj se reiniciará. El siguiente código de función del reloj se asegura de que las variables globales currentMillis y currentMinutes sean correctas cada día. El Arduino no debería perder más de unos pocos segundos cada 45 días; sin embargo, este estilo de temporización codificado es bastante limitado, ya que un corte de energía o un reinicio accidental lo romperán todo, por lo que este es ciertamente un área que podría mejorarse. Si el tiempo no se sincroniza, simplemente reinicia el Arduino a la hora de inicio establecida.
El código debería ser fácil de entender.
void clock(){ if(millis()>= previousMillis+86400000){ // a full day has elapsed, reset the clock; previousMillis +=86400000; } currentMillis = millis() - previousMillis; // this keeps our currentMillis the same each day currentMinutes = (currentMillis/1000)/60; }
Función de luz nocturna
He separado los bucles principales en distintas funciones, por lo que es más fácil de leer y eliminar o ajustar. La función nightLight () solo funciona entre las horas en que se reinició el Arduino (supongo que probablemente lo haga a la hora de acostarse, cuando está oscuro), y hasta que comience la alarma del amanecer. Inicialmente había intentado usar una resistencia dependiente de la luz, pero no son muy sensibles a la luz azul (que es el color que uso para la luz nocturna) y son difíciles de calibrar correctamente. Usar el reloj tiene más sentido, de todos modos. Utilizaremos la variable global currentMinutes, que se restablece cada día.
El sensor PIR puede ser un poco raro si nunca lo ha usado antes, aunque el cableado no es difícil; encontrará VCC, GND y OUT claramente etiquetados en la parte posterior. También hay dos resistencias variables; el etiquetado RX determina el rango (hasta aproximadamente 7 m), y otro TX etiquetado determina el retraso. La demora es de 5 segundos en su ajuste más bajo (totalmente en sentido antihorario), y significa que cualquier movimiento momentáneo activará al menos 5 segundos el estado "encendido" del sensor. Sin embargo, también determina la demora entre los estados activos, por lo que si transcurren 5 segundos y no se detecta movimiento, el sensor enviará una señal baja durante al menos 5 segundos, incluso si hay movimiento durante ese período. Si tienes la demora establecida muy alta en alrededor de 30 segundos, puede parecer que el sensor está roto.
Si duerme solo y no le importa utilizar las mismas luces de tira RGB para la alarma de amanecer y la luz de noche, debería poder ajustar el código con la suficiente facilidad.
void nightlight(){ // Only work between the hours of reset ->sunrise. if(currentMinutes< minutesUntilSunrise){ if(digitalRead(trigger) == 1){ nightLightTimeOff = millis()+nightLightTimeOut; // activate, or extend the time until turning off the light Serial.println("Activating nightlight"); } } //Turn light on if needed if(millis()< nightLightTimeOff){ digitalWrite(nightLight, HIGH); } else{ digitalWrite(nightLight, LOW); } }
Alarma de amanecer
Para simplificar, usaré el valor de color RGB 255, 255.0 para un amanecer amarillo intenso; de esta forma, el incremento en ambos canales de color será el mismo. Si nota que lo está despertando demasiado temprano, considere comenzar con un rojo intenso y desvaneciéndose hacia amarillo o blanco. La aceleración que he usado es solo lineal: es posible que desee investigar usando una curva más natural para los valores de brillo.
La función es simple: determina la cantidad de luz que se debe incrementar por cada segundo, por lo que está en pleno brillo después de un período de 30 minutos; luego lo multiplica por cuantos segundos esté actualmente en la salida del sol. Si ya está en pleno brillo, permanece encendida durante 10 minutos más para asegurarse de que está levantado (y si aún no está levantado, probablemente debería tener una alarma de respaldo en su lugar).
void sunrisealarm(){ //each second during the 30 minite period should increase the colour value by: float increment = (float) 255/(30*60); //red 255, green 255 gives us full brightness yellow if(currentMinutes>= minutesUntilSunrise){ //sunrise begins! float currentVal = (float)((currentMillis/1000) - (minutesUntilSunrise*60)) * increment; Serial.print("Current value for sunrise:"); Serial.println(currentVal); //during ramp up, write the current value of minutes X brightness increment if(currentVal< 255){ analogWrite(RED, currentVal); analogWrite(GREEN, currentVal); } else if(currentMinutes - minutesUntilSunrise< 40){ // once we're at full brightness, keep the lights on for 10 minutes longer analogWrite(RED, 255); analogWrite(GREEN, 255); } else{ //after that, we're nuking them back to off state analogWrite(RED, 0); analogWrite(GREEN, 0); } } }
Errores y mejoras futuras
He estado usando esto durante las últimas semanas y realmente está ayudando a despertar sintiéndome más fresco y en un momento decente; la luz nocturna también funciona muy bien. Aunque no es perfecto, aquí hay algunas cosas que necesitan trabajo y lecciones aprendidas durante la construcción.
Al hacer este proyecto, encontré muchos problemas al tratar con números grandes, por lo que si planea modificar el código, tenga esto en cuenta. En el lenguaje C, el tipado de tus variables es muy importante ; un número no siempre es solo un número. Por ejemplo, las variables largas sin signo se deben usar para almacenar números supergrandes como los que manejamos cuando hablamos de milisegundos, pero incluso un número tan pequeño como 60, 000 no se puede almacenar como un entero regular (una int sin firmar habría sido aceptable para hasta 68, 000 ) El punto es, lee tus tipos de variables cuando usas números grandes, y si estás encontrando errores extraños, ¡probablemente sea porque una de tus variables no tiene suficientes bits!
También encontré un problema con las pérdidas de voltaje de muy bajo brillo, lo que hace que se emita la menor cantidad de luz incluso cuando se emite una señal digitalWRite (ROJO, 0) . No creo que sea un problema de hardware con las tiras ya que funcionan bien con los controladores oficiales. Si alguien puede resolver este problema, que se muestra a continuación, estaría muy agradecido. He intentado con resistencias desplegables y limitando el voltaje de salida de los pines Arduino. Puede que necesite agregar un circuito de conmutación de potencia simple para suministrar solo voltaje a la tira de LED cuando realmente lo necesite; o podrían ser MOSFET defectuosos.
Para el trabajo futuro, espero agregar un receptor IR y duplicar algunas de las características del controlador original, al menos la capacidad de cambiar los colores como una luz de uso general, ya que ahora este proyecto convierte la tira en una noche dedicada ligero. Incluso puedo agregar una función automática de tiempo de espera de 30 minutos.
¿Has probado esto, has realizado mejoras o tienes alguna otra idea? ¡Házmelo saber en los comentarios!