Arduino night light et sunrise projet d`alarme

Les humains sont naturellement programmés pour se réveiller avec la vie sunrise- tristement moderne est dictée par une horloge arbitraire, souvent nous forçant à se 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 doucement et lentement vous réveiller sans avoir recours à une machine de bruit faisant offensive.

Si vous faites un réveil au lever du soleil est un peu trop pour vous, vérifier ces iPhone les applications Android qui détectent le meilleur moment pour vous réveiller par les mouvements du corps, assurer que vous n`êtes pas tiré loin de ce rêve génial, mais à la place, réveillez sentiment lumineux et rafraîchie - ils fonctionnent vraiment.

Grandes lignes du projet

La partie principale du projet sera d`environ 5 mètres LED bande de lumière prévue autour du lit. Nous allons pouvoir que ces avec une alimentation externe de 12 volts, changé en utilisant des transistors MOSFET de N. La configuration de cette partie sera identique à la système d`éclairage dynamique J`ai construit auparavant.

Timing sera un problème - puisque c`est un prototype, je vais Réglage de l`Arduino compte à rebours à partir de chaque fois qu`il est remis à zéro. En théorie, nous ne devrions perdre chaque jour ou deux secondes, mais idéalement nous inclure une "horloge temps réel" puce pour ce faire de manière plus fiable. L`alarme du lever du soleil commencera 30 minutes avant l`heure de réveil, et augmenter lentement le niveau de sortie jusqu`à ce qu`il soit à 100% de luminosité - cela devrait être suffisant pour nous réveiller, mais il est une bonne idée de continuer à utiliser votre réveil régulière jusqu`à ce que votre corps est habitué.

J`intégrera également une lumière de nuit dans ce projet, qui détecte le mouvement et active une lumière de faible niveau discret sous le lit avec un temps de 3 minutes sur, séparé pour les lumières LED que celles causerait ma femme et moi pour réveiller . L`éclairage sous le lit sera un bloc secteur commercial, donc je vais pirater un relais à l`intérieur d`une prise de courant pour allumer que sur et en dehors. Si vous n`êtes pas à l`aise avec 110-240v alimentation secteur en aucun cas (et qui est généralement une bonne règle à avoir), puis câbler un émetteur sans fil 433 MHz avec des prises de commutation, comme indiqué sur la projet d`automatisation de la maison Raspberry Pi Arduino.

Liste des pièces et le schéma

  • Arduino
  • Ensemble de bande LED RGB
  • alimentation de 12 volts
  • 3 x transistors MOSFET N (j`utiliser le type STP16NF06FP)
  • Relais et prise de courant, ou prises sans fil contrôlé et émetteur approprié
  • Votre choix de lumière de nuit (secteur régulièrement alimenté avec prise est très bien)
  • capteur PIR de mouvement (HC-SR501), ou d`un SC-04 sonar (pas aussi efficace)
  • Capteur de lumière
  • Code de projet - Mais ne lisez la suite pour vous assurer que vous comprenez comment personnaliser tout.

Voici le schéma complet.

sunrise-alarme-circuit

Câblage d`un relais

Remarque: Passer cette section si vous souhaitez utiliser les lumières RVB comme une lumière de nuit aussi bien - ce qui est spécifiquement pour la commutation sur un réseau séparé alimenté la lumière. 

Pour la commutation de l`alimentation secteur, votre relais devra nominale pour la tension - 110V ou 240V AC selon l`endroit où vous vivez - et plus que l`ampérage total, vous serez commutation. Celui que je l`ai utilisé de cette pack capteur (Disclaimer: qui est ma boutique) est 250VAC / 10A, donc nous devrions être en sécurité. Relais ont un com port, habituellement dans le centre, qui doit être relié au fil direct entrant dans le plug- puis connectez le terminal en direct de prise à la NON (normalement ouvert). Je ne devrais pas vous dire de ne pas le faire wile il est branché dans une prise, ou tu vas mourir. Si vous avez peur de jouer avec alimentation secteur, une utilisation sans fil commutée prises à la place.

relais-câblage

La terre et les câbles neutres devraient aller directement à la prise et ne touchent pas le relais. Vous ne pouvez pas avoir une ligne de terre aux États-Unis. Il est de votre responsabilité de connaître le codage couleur des fils dans votre région - Si vous ne pouviez pas câbler autrement une prise régulière dans votre maison ou recâbler un bouchon, ne pas essayer l`intégration d`un relais en un seul!

Pour tester, fil la broche de signal de relais à 12, puis exécutez un programme de clignotement simple, modifié pour fonctionner sur la broche 12, pas 13 comme cela est par défaut. Votre prise doit allumer et éteindre toutes les quelques secondes. La raison pour laquelle je ne suis pas en utilisant la broche 13 est parce que pendant le processus de téléchargement, les incendies à bord LED en succession rapide pour indiquer l`activité de série, ce qui entraînerait le relais pour activer aussi.

Obtenir Timing droit

fonctions de temporisation et d`horloge sont difficiles sans avoir accès à une connexion réseau ou dédié Horloge en temps réel (Ceux-ci comprennent leurs propres batteries pour garder l`horloge allant même lorsque la principale Arduino n`a pas de pouvoir). Pour maintenir les coûts bas, je vais tricher. Je vais hardcoding une heure de début de l`Arduino pour commencer il est timings countdown- seront donc par rapport à cette heure de début. Chaque 24 heures, l`horloge sera réinitialisée. Le code de fonction d`horloge ci-dessous fait sûr que les variables globales currentMillis et currentMinutes sont corrects chaque jour. L`Arduino ne doit pas perdre plus de quelques secondes toutes les 45 jours- cependant, ce style codé en dur du timing est assez limitée en ce qu`une coupure de courant ou de réinitialisation accidentelle vont tout casser, donc c`est certainement un domaine qui pourrait être amélioré . Si le calendrier ne sortir de la synchronisation, il suffit de réinitialiser le Arduino à votre temps défini.

Le code doit être facile à comprendre.

horloge void () {if (Millis ()> = previousMillis + 86400000) {// une journée complète est écoulé, réinitialiser l`horloge previousMillis + = 86400000-} currentMillis = Millis () - previousMillis- // ceci maintient nos currentMillis les mêmes chaque daycurrentMinutes = (currentMillis / 1000) / 60-}

Fonction Night Light

J`ai séparés les principales boucles dans des fonctions distinctes de sorte qu`il est plus facile à lire et à supprimer ou ajuster. le veilleuse() fonction fonctionne uniquement entre les heures de quand l`Arduino a été réinitialisé (je suppose que vous allez probablement faire ceci sur ou autour de l`heure du coucher, quand il fait sombre), et jusqu`à ce que l`alarme du lever du soleil doit commencer. Je l`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 se trouve être la couleur que je suis en utilisant la lumière de nuit), et difficile à calibrer droite. Utilisation de l`horloge est plus logique, de toute façon. Nous allons utiliser le global currentMinutes variable, qui se réinitialiser chaque jour.

Le capteur PIR peut être être un peu bizarre si vous ne l`avez jamais utilisé un avant, bien que le câblage vers le haut est pas difficile - vous trouverez CCV, GND, et EN DEHORS clairement étiquetés sur le dos. Il y a deux résistances variables thee trop- celui marqué RX détermine gamme (jusqu`à environ 7m), et un autre TX marqué détermine retard. Le délai est de 5 secondes à son réglage le plus bas (à fond à gauche), et signifie que tout mouvement momentané déclenchera au moins 5 secondes de "sur" l`état du capteur. Cependant, il détermine également le délai entre les états actifs - donc si 5 secondes écoulé et aucun mouvement est détecté, le capteur envoie un signal basse pendant au moins 5 secondes, même s`il y a un mouvement au cours de cette période. Si vous avez le retard réglé très élevé à environ 30 secondes, il peut sembler comme le capteur est cassé.

pir-capteur

Si vous êtes dormir seul et ne vous dérange pas avec les mêmes lumières de bande de RVB pour les deux l`alarme du lever du soleil et de la lumière de nuit, vous devriez être en mesure d`ajuster le code assez facilement.

Veilleuse void () {// travailler seulement entre les heures de remise à zéro -> sunrise.if (currentMinutes < minutesUntilSunrise){if(digitalRead(trigger) == 1){nightLightTimeOff = millis()+nightLightTimeOut- // activate, or extend the time until turning off the lightSerial.println("Activating nightlight")-}}//Turn light on if neededif(millis() < nightLightTimeOff){digitalWrite(nightLight,HIGH)-}else{digitalWrite(nightLight,LOW)-}}

Sunrise Alarm

Par souci de simplicité, je vais utiliser 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 est vous réveiller trop tôt, envisager de commencer par un rouge profond et à la décoloration vers le jaune ou blanc. La montée en puissance que je l`ai utilisé en seulement linéaire - vous pouvez étudier en utilisant une courbe plus naturelle pour les valeurs de luminosité.

La fonction est simple - il fonctionne combien la lumière doit être incrémenté de chaque seconde comme il est à pleine luminosité après 30 minutes périodi- multiplie alors qu`en soit le nombre de secondes, il est actuellement dans le lever du soleil. Si elle est déjà à pleine luminosité, il reste allumé pendant 10 minutes supplémentaires pour vous assurer que vous êtes à la hauteur (et si vous êtes toujours pas, vous devriez probablement avoir une alarme de sauvegarde en place).

sunrisealarm void () {// chaque seconde au cours de la 30 période minite devrait augmenter la valeur de couleur par: float incrément = (float) 255 / (30 * 60) - // rouge 255, vert 255 nous donne pleine yellowif luminosité (currentMinutes> = minutesUntilSunrise) {// lever commence flotter currentVal = (float) ((currentMillis / 1000) - (minutesUntilSunrise * 60)) * incrément-Serial.print ( "valeur actuelle pour le lever du soleil:"!) - Serial.println (currentVal) - // lors de montée en puissance, écrire la valeur actuelle de minutes X luminosité incrementif (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 longeranalogWrite(RED,255)-analogWrite(GREEN,255)-}else{//after that, we`re nuking them back to off stateanalogWrite(RED,0)-analogWrite(GREEN,0)-}}}

Pièges et mises à niveau futures

Je me sers de cela pour les quelques dernières semaines maintenant et il est vraiment aider à réveiller le sentiment plus frais et à une bonne Time- la veilleuse fonctionne vraiment bien aussi. Il est pas parfait, donc voici quelques choses qui ont besoin de travail et les leçons apprises lors de la construction.

sunrise-alarme

Tout en faisant ce projet, j`ai rencontré beaucoup de problèmes de traiter avec un grand nombre, donc si vous prévoyez de modifier le code s`il vous plaît garder cela à l`esprit. En langage C, la votre typage est très important - Un certain nombre ne sont pas toujours juste un nombre. Par exemple, unsigned long variables doivent être utilisés pour stocker des super-grands nombres comme nous traitons quand on parle de millisecondes, mais même un nombre aussi petit que 60 000 ne peuvent pas être stockés comme un entier régulier (Un unsigned int aurait été acceptable pour un maximum de 68.000). Le point est, lire sur vos types de variables lors de l`utilisation de grands nombres, et si vous trouvez des bugs bizarres, il est probablement parce que l`un de vos variables n`a pas assez de bits!

Je l`ai aussi trouvé un problème avec de très faibles fuites de tension de luminosité - conduisant à la plus petite quantité de lumière émise même si un digitalWrite (RED, 0) signal est émis - Je ne pense pas que ce problème matériel avec les bandes car ils fonctionnent très 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éroulez résistances, et de limiter la tension de sortie des broches Arduino. Je besoin d`ajouter un circuit de commutation de puissance simple que la tension d`alimentation de la bande de LED lorsqu`il fait besoin- ou il pourrait être MOSFETs défectueux.

-Fuite de lumière

Pour les travaux futurs, je suis l`espoir d`ajouter un récepteur IR et dupliquer certaines des fonctionnalités du contrôleur d`origine - au moins la possibilité de changer les couleurs comme une utilisation de la lumière générale, comme en ce moment ce projet transforme la bande en une nuit dédiée lumière. Je peux même ajouter une fonction automatique de délai d`attente de 30 minutes.

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

» » Arduino night light et sunrise projet d`alarme