Arduino Night Light et Sunrise Alarm Project

Aujourd'hui, nous allons faire un réveil au lever du soleil, qui vous réveillera doucement et lentement sans recourir à une machine à bruit offensif.

Aujourd'hui, nous allons faire un réveil au lever du soleil, qui vous réveillera doucement et lentement sans recourir à une machine à bruit offensif.
Publicité

Les humains sont naturellement programmés pour se réveiller avec le lever du soleil; Malheureusement, la vie moderne est dictée par une horloge arbitraire, nous forçant souvent à nous réveiller quand il n'y a pas de lumière naturelle. Aujourd'hui, nous allons faire un réveil au lever du soleil, qui vous réveillera doucement et lentement sans recourir à une machine à bruit offensif.

Si faire un réveil sunrise est un peu trop pour vous, consultez ces applications iPhone et Android Utilisez ces applications pour vous aider à mieux dormir [Android & iOS] Utilisez ces applications pour vous aider à mieux dormir [Android & iOS] Après une agitation jour, la meilleure chose que vous pouvez faire est d'obtenir une quantité bénéfique de sommeil. Il y a toujours de nouvelles études qui prouvent combien le sommeil est vraiment important pour une personne, s'améliorant ... Lire la suite qui détecte quand mieux vous réveiller par les mouvements du corps Une application peut-elle vraiment vous aider à mieux dormir? Une application peut-elle vraiment vous aider à mieux dormir? J'ai toujours été un peu expérimentateur du sommeil, ayant pendant une grande partie de ma vie gardé un journal de rêve méticuleux et étudié autant que possible sur le fait de dormir dans le processus. Il y a un ... Lire la suite, en veillant à ne pas vous éloigner de ce rêve génial, mais plutôt à vous réveiller en vous sentant lumineux et rafraîchi - ils fonctionnent vraiment.

Grandes lignes du projet

La partie principale du projet sera une bande LED de 5 mètres posée autour du lit. Nous les alimentons avec une alimentation externe de 12 volts, commutée à l'aide de certains transistors MOSFET N. La configuration de cette partie sera identique au système d'éclairage dynamique Construisez votre propre éclairage ambiant dynamique pour un centre de médias Construisez votre propre éclairage ambiant dynamique pour un centre de médias Si vous regardez beaucoup de films sur votre PC ou centre de médias, je suis sûr que vous avez fait face au dilemme de l'éclairage; éteignez-vous complètement toutes les lumières? Les gardez-vous à fond? Ou ... Lire la suite J'ai construit avant.

Le timing sera un problème - puisqu'il s'agit d'un prototype, je vais paramétrer l'Arduino à compter à partir du moment où il est réinitialisé. En théorie, nous devrions seulement perdre une seconde ou deux chaque jour, mais idéalement, nous inclurions une puce «horloge temps réel» pour le faire de manière plus fiable. L'alarme de lever du soleil commencera 30 minutes avant l'heure de réveil, et augmentera lentement le niveau de sortie jusqu'à 100% de luminosité - cela devrait suffire à nous réveiller, bien que ce soit une bonne idée de continuer à utiliser votre réveil normal jusqu'à ce que votre corps habitué.

Je vais également incorporer une veilleuse dans ce projet, qui détecte le mouvement et active une lumière discrète de niveau bas sous le lit avec un délai d'attente de 3 minutes, séparé des lumières LED car celles-ci causeraient à ma femme et à moi de se réveiller . L'éclairage sous le lit sera un bloc d'alimentation commercial, donc je vais pirater un relais à l'intérieur d'une prise de courant pour l'allumer et l'éteindre. Si vous n'êtes pas à l'aise avec une alimentation secteur 110-240v en toutes circonstances (ce qui est généralement une bonne règle), branchez un émetteur sans fil 433 MHz avec des prises de commutation, comme indiqué dans le projet domotique Raspberry Pi Arduino Guide de domotique avec Raspberry Pi et Arduino Guide de domotique avec Raspberry Pi et Arduino Le marché de la domotique est inondé de systèmes de consommation coûteux, incompatibles entre eux et coûteux à installer. Si vous avez un Raspberry Pi et un Arduino, vous pouvez essentiellement réaliser la même chose à ... Lire la suite.

Liste des pièces et schéma

  • Arduino
  • Ensemble de feux de bande LED RGB
  • Alimentation 12 volts
  • 3 transistors MOSFET N (j'utilise le type STP16NF06FP)
  • Prise de relais et d'alimentation, ou prises contrôlées sans fil et émetteur approprié
  • Votre choix de veilleuse (alimentation secteur normale avec prise est bien)
  • Capteur de mouvement PIR (HC-SR501), ou un sonar SC-04 (pas aussi efficace)
  • Capteur de lumière
  • Code du projet - mais lisez attentivement pour vous assurer de bien comprendre comment personnaliser tout.

Voici le schéma complet.

sunrise-alarme-circuit

Câblage d'un relais

Remarque : Sautez cette section si vous souhaitez également utiliser les lumières RVB comme veilleuse - ceci est spécifiquement pour allumer une lumière séparée alimentée par le secteur.

Pour la commutation d'alimentation secteur, votre relais devra être dimensionné pour une tension de 110 V ou 240 V CA selon l'endroit où vous vivez - et plus que l'intensité totale que vous allez changer. Celui que j'ai utilisé de ce pack de capteurs (avertissement: c'est ma boutique) est 250VAC / 10A, donc nous devrions être en sécurité. Les relais ont un port de communication, généralement au centre, qui doit être connecté au fil sous tension entrant dans la prise; puis connectez la borne live du socket au NO (normalement ouvert). Je ne devrais pas avoir à vous dire de ne pas faire ce wile il est branché dans une prise, ou vous allez mourir. Si vous avez peur de vous brancher sur le secteur, utilisez plutôt des prises commutées sans fil.

relais-câblage

Les câbles de terre et neutre doivent aller directement à la prise et ne pas toucher le relais. Vous ne pouvez pas avoir une ligne de terre aux États-Unis. Il est de votre responsabilité de connaître le code de couleur des fils dans votre région - si vous ne pouviez pas autrement câbler une prise ordinaire dans votre maison ou rebrancher une prise, n'essayez pas d'intégrer un relais dans un seul!

Pour tester, câbler la broche de signal du relais à 12, puis exécuter un simple programme de clignotement modifié pour fonctionner sur la broche 12, pas 13 comme c'est le cas par défaut. Votre prise devrait s'allumer et s'éteindre toutes les quelques secondes. La raison pour laquelle je n'utilise pas la broche 13 est que pendant le processus de téléchargement, la LED embarquée se déclenche rapidement pour indiquer une activité en série, ce qui provoquerait également l'activation du relais.

Obtenir le bon moment

Les fonctions de minuterie et d'horloge sont difficiles sans accès à une connexion réseau ou à une horloge temps réel dédiée (elles comprennent leurs propres piles pour maintenir l'horloge même lorsque l'Arduino principal n'a pas de puissance). Pour garder les coûts bas, je vais tricher. Je vais coder en dur une heure de début pour que l'Arduino commence son compte à rebours; les horaires seront donc relatifs à cette heure de début. Toutes les 24 heures, l'horloge se réinitialisera. Le code de fonction d'horloge ci-dessous s'assure que les variables globales currentMillis et currentMinutes sont correctes chaque jour. L'Arduino ne devrait pas perdre plus de quelques secondes tous les 45 jours; Cependant, ce style de timing codé en dur est assez limité en ce sens qu'une coupure de courant ou une réinitialisation accidentelle va tout casser, donc c'est certainement un domaine qui pourrait être amélioré. Si la synchronisation est désynchronisée, réinitialisez simplement l'Arduino à l'heure de démarrage définie.

Le code devrait être facile à comprendre.

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; } 

Fonction de lumière de nuit

J'ai séparé les boucles principales en fonctions distinctes afin qu'il soit plus facile à lire et à supprimer ou à ajuster. La fonction nightLight () fonctionne uniquement entre les heures de réinitialisation de l'Arduino (je présume que vous le ferez probablement le soir ou à l'heure du coucher, quand il fait noir) et jusqu'à ce que l'alarme sunrise commence. J'avais d'abord essayé d'utiliser une résistance dépendant de la lumière, mais ils ne sont pas très sensibles à la lumière bleue (qui est la couleur que j'utilise pour la veilleuse), et difficile à calibrer correctement. Utiliser l'horloge a plus de sens, de toute façon. Nous utiliserons la variable currentMinutes globale, qui est réinitialisée chaque jour.

Le capteur PIR peut être un peu bizarre si vous n'en avez jamais utilisé auparavant, bien que le câblage ne soit pas difficile - vous trouverez VCC, GND et OUT clairement étiquetés au dos. Il y a aussi deux résistances variables; celui marqué RX détermine la plage (jusqu'à environ 7 m), et un autre TX marqué détermine le retard. Le retard est de 5 secondes à son réglage le plus bas (complètement dans le sens inverse des aiguilles d'une montre), et signifie que tout mouvement momentané déclenchera au moins 5 secondes d'état "on" du capteur. Cependant, il détermine également le délai entre les états actifs - donc si 5 secondes s'écoulent et qu'aucun mouvement n'est détecté, le capteur enverra un signal faible pendant au moins 5 secondes même s'il y a un mouvement pendant cette période. Si le délai est très élevé à environ 30 secondes, il peut sembler que le capteur est cassé.

pir-sensor

Si vous dormez seul et que cela ne vous dérange pas d'utiliser les mêmes bandes lumineuses RVB pour l'alarme sunrise et la veilleuse, vous devriez pouvoir régler le code assez facilement.

 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); } } 

Sunrise Alarm

Pour plus de simplicité, j'utiliserai la valeur de couleur RVB 255, 255, 0 pour un lever de soleil jaune profond - de cette façon, l'incrément sur les deux canaux de couleur sera le même. Si vous trouvez qu'il vous réveille trop tôt, pensez à commencer avec un rouge profond et à disparaître vers le jaune ou le blanc. La rampe que j'ai utilisée en linéaire - vous pouvez vouloir étudier en utilisant une courbe plus naturelle pour les valeurs de luminosité.

La fonction est simple: elle détermine la quantité de lumière à incrémenter chaque seconde, c'est-à-dire à pleine luminosité après une période de 30 minutes; puis multiplie cela par autant de secondes qu'il est actuellement dans le lever du soleil. S'il est déjà à pleine luminosité, il reste allumé pendant 10 minutes supplémentaires pour s'assurer que vous êtes en haut (et si vous n'êtes toujours pas en place, vous devriez probablement avoir une alarme de sauvegarde en place).

 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); } } } 

Pièges et améliorations futures

J'utilise cela depuis quelques semaines maintenant et ça aide vraiment à me réveiller en me sentant plus reposé et à un moment décent; la veilleuse fonctionne très bien aussi. Ce n'est pas parfait cependant, donc voici quelques choses qui ont besoin de travail et les leçons apprises pendant la construction.

lever du soleil

Lors de la réalisation de ce projet, j'ai rencontré beaucoup de problèmes de traitement de grands nombres, donc si vous envisagez de modifier le code, gardez cela à l'esprit. En langage C, le typage de vos variables est très important - un nombre n'est pas toujours juste un nombre. Par exemple, des variables longues non signées devraient être utilisées pour stocker des super-grands nombres comme nous traitons en parlant de millisecondes, mais même un nombre aussi petit que 60 000 ne peut pas être stocké comme entier normal (un int non signé aurait été acceptable jusqu'à 68 000 ) . Le point est, lire sur vos types de variables lors de l'utilisation de grands nombres, et si vous trouvez des bogues étranges, c'est probablement parce que l'une de vos variables n'a pas assez de bits!

J'ai également trouvé un problème avec des fuites de tension de très faible luminosité - conduisant à la plus petite quantité de lumière émise même lorsqu'un signal digitalWrite (RED, 0) est émis - Je ne pense pas que ce soit un problème matériel avec les bandes bien avec les contrôleurs officiels. Si quelqu'un peut résoudre ce problème, illustré ci-dessous, je serais très reconnaissant. J'ai essayé d'abaisser les résistances et de limiter la tension de sortie des broches Arduino. J'ai peut-être besoin d'ajouter un simple circuit de commutation de puissance pour alimenter uniquement la bande de LED lorsque cela est réellement nécessaire; ou il pourrait être des MOSFET défectueux.

fuite de lumière

Pour les travaux futurs, j'espère ajouter un récepteur IR et dupliquer certaines des fonctionnalités du contrôleur d'origine - au moins la possibilité de changer les couleurs en tant que lumière d'usage général, car en ce moment ce projet transforme la bande en une nuit dédiée lumière. Je peux même ajouter une fonction de temporisation automatique de 30 minutes.

Avez-vous essayé, apporté des améliorations ou avez-vous d'autres idées? Faites-moi savoir dans les commentaires!

In this article