Arduino Night Light e Sunrise Alarm Project

Oggi prepareremo una sveglia all'alba, che ti farà svegliare dolcemente e lentamente senza ricorrere a una macchina offensiva.

Oggi prepareremo una sveglia all'alba, che ti farà svegliare dolcemente e lentamente senza ricorrere a una macchina offensiva.
Annuncio pubblicitario

Gli esseri umani sono naturalmente programmati per svegliarsi all'alba; la vita tristemente moderna è dettata da un orologio arbitrario, che spesso ci costringe a svegliarsi quando non c'è luce naturale. Oggi prepareremo una sveglia all'alba, che ti farà svegliare dolcemente e lentamente senza ricorrere a una macchina offensiva.

Se fare una sveglia all'alba è un po 'troppo per te, dai un'occhiata a queste app per iPhone e Android Usa queste app per aiutarti a dormire meglio [Android e iOS] Usa queste app per farti dormire meglio [Android e iOS] Dopo un frenetico giorno, la cosa migliore che puoi fare è ottenere una buona quantità di sonno. Ci sono sempre nuovi studi che dimostrano quanto sia importante il sonno per una persona, migliorando ... Leggi altro che rileva quando è meglio svegliarti con i movimenti del corpo. Un'app può davvero aiutarti a dormire meglio? Un'app può davvero aiutarti a dormire meglio? Sono sempre stato un po 'uno sperimentatore del sonno, avendo conservato per gran parte della mia vita un diario del sogno meticoloso e studiato il più possibile per dormire nel processo. Ci sono ... Leggi di più, assicurandoti di non essere trascinato via da quel fantastico sogno, ma invece, svegliati sentendoti luminoso e riposato - funzionano davvero.

Profilo del progetto

La parte principale del progetto sarà una striscia di luce a LED di 5 metri posizionata attorno al letto. Li alimenteremo con un'alimentazione esterna a 12 volt, commutata utilizzando alcuni transistor MOSFET N. L'installazione per questa parte sarà identica al sistema di illuminazione dinamico Costruisci la tua illuminazione d'ambiente dinamica per un centro multimediale Costruisci la tua illuminazione d'ambiente dinamica per un centro multimediale Se guardi un sacco di film sul tuo PC o sul tuo centro multimediale, sono certo che hai affrontato il dilemma dell'illuminazione; spegni completamente tutte le luci? Li tieni in piena esplosione? O ... Per saperne di più Ho costruito prima.

Il tempismo sarà un problema - dal momento che questo è un prototipo, imposterò l'Arduino per il conto alla rovescia da quando viene resettato. In teoria, dovremmo perdere solo un secondo o due al giorno, ma idealmente includiamo un chip "orologio in tempo reale" per farlo in modo più affidabile. L'allarme alba inizierà 30 minuti prima del risveglio e aumenterà lentamente il livello di uscita fino al 100% di luminosità - questo dovrebbe essere sufficiente per svegliarci, sebbene sia una buona idea continuare a usare la normale sveglia fino a quando il tuo corpo non è abituato.

Inserirò anche una luce notturna in questo progetto, che rileva il movimento e attiva una luce discreta a basso livello sotto il letto con un intervallo di 3 minuti, separato dalle luci a LED, poiché ciò potrebbe causare il risveglio sia di mia moglie che di me . L'illuminazione sotto il letto sarà un'unità di rete commerciale, quindi inserirò un relè all'interno di una presa per accenderlo e spegnerlo. Se non ti senti a tuo agio a lavorare con 110-240 V CA in qualsiasi circostanza (e generalmente è una buona regola), quindi cablare un trasmettitore wireless 433 MHz con prese di commutazione, come indicato nel progetto di domotica Raspberry Pi Arduino Guida di automazione domestica con Raspberry Pi e Arduino Home Automation Guide Con Raspberry Pi e Arduino Il mercato domotico è invaso da costosi sistemi di consumo, incompatibili tra loro e costosi da installare. Se hai un Raspberry Pi e un Arduino, puoi sostanzialmente ottenere la stessa cosa a ... Leggi altro.

Elenco delle parti e schema

  • Arduino
  • Set di luci strip LED RGB
  • Alimentazione a 12 volt
  • 3 transistor MOSFET N (utilizzo il tipo STP16NF06FP)
  • Relè e presa di corrente, o prese controllate wireless e trasmettitore adatto
  • La tua scelta di luce notturna (la normale alimentazione alimentata con spina va bene)
  • Sensore di movimento PIR (HC-SR501) o un sonar SC-04 (non altrettanto efficace)
  • Sensore di luce
  • Codice del progetto - ma continua a leggere per assicurarti di capire come personalizzare tutto.

Ecco lo schema completo.

alba-allarme-circuito

Cablaggio di un relè

Nota : saltare questa sezione se si desidera utilizzare le luci RGB anche come luce notturna - questo è specifico per l'accensione di una luce di rete separata.

Per commutare l'alimentazione di rete, il tuo relè dovrà valutare la tensione - 110 V o 240 V CA a seconda di dove vivi - e più dell'amperaggio totale che cambierai. Quello che ho usato da questo pacchetto di sensori (disclaimer: quello è il mio negozio) è 250VAC / 10A, quindi dovremmo essere al sicuro. I relè hanno una porta di comunicazione, solitamente al centro, che deve essere collegata al cavo in tensione che entra nella spina; quindi collegare il terminale live socket al NO (normalmente aperto). Non dovrei dirti di non farlo, che è collegato a una presa o che morirai. Se hai paura di incasinare con l'alimentazione di rete, utilizzare invece prese wireless commutate.

relè cablaggio

I cavi di messa a terra e neutri devono essere collegati direttamente alla presa e non toccano il relè. Non si può avere una linea di terra negli Stati Uniti. È tua responsabilità conoscere la codifica a colori dei fili nella tua area locale - se non puoi altrimenti collegare una presa normale nella tua casa o ricablare una spina, non provare a incorporare un relè in uno!

Per testare, collegare il pin del segnale del relè a 12, quindi eseguire un semplice programma di lampeggio modificato per funzionare sul pin 12, non 13 come impostazione predefinita. La presa dovrebbe accendersi e spegnersi ogni pochi secondi. Il motivo per cui non sto usando il pin 13 è perché durante il processo di caricamento, il LED di bordo si accende in rapida successione per indicare attività seriale, che potrebbe causare l'attivazione del relè.

Ottenere il giusto tempo

Le funzioni di cronometraggio e orologio sono difficili senza accesso ad una connessione di rete o ad un orologio in tempo reale dedicato (queste includono le proprie batterie per mantenere l'orologio in funzione anche quando l'Arduino principale non ha alimentazione). Per mantenere bassi i costi, ho intenzione di imbrogliare. Sto programmando un orario di inizio per Arduino per iniziare il suo conto alla rovescia; i tempi saranno quindi relativi a questo orario di inizio. Ogni 24 ore, l'orologio si resetterà. Il codice della funzione di orologio seguente assicura che le variabili globali currentMillis e currentMinutes siano corrette ogni giorno. L'Arduino non dovrebbe perdere più di qualche secondo ogni 45 giorni; tuttavia, questo tempismo di codifica hard-coded è piuttosto limitato in quanto una interruzione di corrente o un reset accidentale interromperà tutto, quindi questa è certamente un'area che potrebbe essere migliorata. Se la sincronizzazione non è sincronizzata, resetta semplicemente Arduino all'orario di inizio impostato.

Il codice dovrebbe essere facile da capire.

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

Funzione di luce notturna

Ho separato i loop principali in funzioni distinte, quindi è più facile da leggere, rimuovere o regolare. La funzione NightLight () funziona solo tra le ore in cui è stato ripristinato Arduino (suppongo che probabilmente lo farai su o intorno all'ora di andare a dormire, quando è buio) e fino a quando l'allarme dell'alba non inizierà. Inizialmente avevo provato a utilizzare un resistore dipendente dalla luce, ma non sono molto sensibili alla luce blu (che è il colore che utilizzo per la luce notturna) e difficili da calibrare correttamente. Usare l'orologio ha più senso, comunque. Useremo la variabile currentMinutes globale, che viene ripristinata ogni giorno.

Il sensore PIR può essere un po 'eccentrico se non ne hai mai usato uno prima, anche se il cablaggio non è difficile - troverai VCC, GND e OUT chiaramente etichettati sul retro. Ci sono anche due resistori variabili; quello con l'etichetta RX determina l'intervallo (fino a circa 7 m), e un altro con l'etichetta TX determina il ritardo. Il ritardo è di 5 secondi alla sua impostazione più bassa (completamente in senso antiorario) e significa che qualsiasi movimento momentaneo si innesca per almeno 5 secondi di stato "on" dal sensore. Tuttavia, determina anche il ritardo tra gli stati attivi, quindi se trascorrono 5 secondi e non viene rilevato alcun movimento, il sensore invierà un segnale basso per almeno 5 secondi, anche se vi è movimento durante quel periodo. Se il ritardo impostato è veramente alto a circa 30 secondi, può sembrare che il sensore sia rotto.

pir sensore

Se stai dormendo da solo e non ti dispiace usare le stesse luci strip RGB per l'allarme alba e la luce notturna, dovresti essere in grado di regolare il codice abbastanza facilmente.

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

Allarme alba

Per semplicità, userò il valore di colore RGB 255.255, 0 per un'alba giallo intenso: in questo modo l'incremento su entrambi i canali di colore sarà lo stesso. Se trovi che ti sveglia troppo presto, considera di iniziare con un rosso intenso e sfumare verso il giallo o il bianco. Il ramp up che ho usato in modo lineare - potresti voler indagare usando una curva più naturale per i valori di luminosità.

La funzione è semplice: determina la quantità di luce che deve essere incrementata ogni secondo, in modo che sia a piena luminosità dopo un periodo di 30 minuti; quindi moltiplica per il numero di secondi che al momento è all'alba. Se è già a piena luminosità, rimane acceso per altri 10 minuti per essere sicuro che tu sia attivo (e se non sei ancora sveglio, probabilmente dovresti avere un allarme di backup in posizione).

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

Insidie ​​e aggiornamenti futuri

L'ho usato nelle ultime settimane e mi sta davvero aiutando a svegliarmi sentendomi più aggiornato e in un tempo decente; la luce notturna funziona davvero bene. Non è perfetto, quindi ecco alcune cose che hanno bisogno di lavoro e lezioni apprese durante la costruzione.

alba-allarme

Durante la realizzazione di questo progetto, ho riscontrato molti problemi con i grandi numeri, quindi se hai intenzione di modificare il codice ti preghiamo di tenerlo a mente. Nel linguaggio C, la digitazione delle variabili è molto importante - un numero non è sempre solo un numero. Ad esempio, le variabili lunghe non firmate dovrebbero essere utilizzate per memorizzare numeri molto grandi come quelli che trattiamo quando si parla di millisecondi, ma anche un numero piccolo come 60.000 non può essere memorizzato come un numero intero regolare (un int non firmato sarebbe stato accettabile per un massimo di 68.000 ) . Il punto è, leggete i vostri tipi di variabili quando usate grandi numeri, e se state trovando bug strani, è probabilmente perché una delle vostre variabili non ha abbastanza bit!

Ho riscontrato anche un problema con perdite di tensione a luminosità molto bassa, che portano alla massima emissione di luce anche quando viene emesso un segnale DigitalWrite (RED, 0) - Non penso che sia un problema hardware con le strisce dal momento che funzionano bene con i controller ufficiali. Se qualcuno può risolvere questo problema, nella foto qui sotto, sarei molto grato. Ho provato a tirare giù resistori e limitando la tensione di uscita dai pin Arduino. Potrei aver bisogno di aggiungere un semplice circuito di commutazione per alimentare solo la tensione alla striscia LED quando effettivamente necessario; o potrebbe essere MOSFET difettosi.

light-perdita

Per il lavoro futuro, spero di aggiungere un ricevitore IR e duplicare alcune delle funzionalità del controller originale, almeno la possibilità di cambiare i colori come una luce generale, poiché in questo momento il progetto trasforma la striscia in una notte dedicata leggero. Potrei anche aggiungere una funzione di timeout automatica di 30 minuti.

Hai provato questo, fatto miglioramenti o hai altre idee? Fatemi sapere nei commenti!

In this article