Arduino Night Light e Sunrise Alarm Project
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 ogni giorno, ma idealmente dovremmo includere un “orologio in tempo reale” chip 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, anche se è una buona idea continuare a usare la normale sveglia finché il tuo corpo non è abituato.
Inserirò anche una luce notturna in questo progetto, che rileva il movimento e attiva una luce discreta di basso livello sotto il letto con un intervallo di 3 minuti, separato dalle luci a LED, in quanto 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.
Cablaggio di un relè
Nota: Saltare questa sezione se si desidera utilizzare anche le luci RGB come luce notturna - questo è specifico per l'accensione di una luce separata alimentata dalla rete elettrica.
Per la commutazione dell'alimentazione di rete, il relè dovrà valutare la tensione - 110V o 240 V CA. a seconda di dove vivi e più dell'amperaggio totale cambierai. Quello che ho usato da questo pacchetto di sensori (disclaimer: questo è il mio negozio) è 250 V CA / 10 A, quindi dovremmo essere al sicuro. I relè hanno un com porta, solitamente al centro, che deve essere collegata al cavo in tensione che entra nella presa; 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.
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 zona - se non si è in grado di collegare una presa normale nella propria abitazione o di 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, il che farebbe attivare anche il relè.
Ottenere il giusto tempo
Le funzioni di cronometraggio e orologio sono difficili senza accesso a una connessione di rete o dedicate Orologio in tempo reale (questi includono le proprie batterie per mantenere l'orologio in funzione anche quando l'Arduino principale non ha potenza). 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 di funzione dell'orologio sottostante assicura le variabili globali currentMillis e currentMinutes sono corretti ogni giorno L'Arduino non dovrebbe perdere più di qualche secondo ogni 45 giorni; tuttavia, questo tempismo di codifica hard-coded è abbastanza limitato in quanto una interruzione di corrente o un reset accidentale interromperà tutto, quindi questa è certamente una zona 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) // è trascorso un intero giorno, reimpostare l'orologio; previousMillis + = 86400000; currentMillis = millis () - previousMillis; // questo mantiene il nostro currentMillis lo stesso ogni giorno currentMinutes = (currentMillis / 1000) / 60;
Funzione di luce notturna
Ho separato i loop principali in funzioni distinte, quindi è più facile da leggere, rimuovere o regolare. Il luce notturna() la funzione 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 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 il globale currentMinutes variabile, 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 - lo troverai VCC, GND, e SU chiaramente etichettato sul retro. Ci sono anche due resistori variabili; quello con l'etichetta RX determina l'intervallo (fino a circa 7 m), mentre un altro con l'etichetta TX determina il ritardo. Il ritardo è di 5 secondi all'impostazione più bassa (completamente in senso antiorario) e significa che qualsiasi movimento momentaneo si innesca per almeno 5 secondi di “sopra” stato 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.
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.
nightlight void () // Funziona solo tra le ore di reset -> sunrise. se (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 assicurarti di essere attivo (e se non sei ancora sveglio, probabilmente dovresti avere un allarme di backup in posizione).
void sunrisealarm () // ogni secondo durante il periodo di 30 minuti dovrebbe aumentare il valore del colore di: float increment = (float) 255 / (30 * 60); // rosso 255, verde 255 ci dà la piena luminosità gialla se (currentMinutes> = minutesUntilSunrise) // sunrise inizia! float currentVal = (float) ((currentMillis / 1000) - (minutesUntilSunrise * 60)) * incremento; Serial.print ("Valore corrente per sunrise:"); Serial.println (currentVal); // durante l'accelerazione, scrivere il valore corrente dei minuti X incremento della luminosità se (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.
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. In linguaggio C, il la digitazione delle tue variabili è molto importante - un numero non è sempre solo un numero. Per esempio, lungo senza firma le variabili 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 normale intero (un int unsigned sarebbe stato accettabile fino a 68.000). Il punto è, leggi i tuoi tipi di variabili quando usi numeri grandi, e se stai trovando bug strani, è probabilmente perché una delle tue variabili non ha abbastanza bit!
Ho anche riscontrato un problema con perdite di tensione a luminosità molto bassa, che hanno portato alla massima emissione di luce anche quando a digitalWrite (RED, 0) segnale emesso - Non penso che sia un problema hardware con le strisce dato 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.
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 luce. Potrei anche aggiungere una funzione di timeout automatica di 30 minuti.
Hai provato questo, fatto miglioramenti o hai altre idee? Fatemi sapere nei commenti!
Scopri di più su: Arduino.