Arduino Light Night și Sunrise Project Alarm
Oamenii sunt programați în mod natural să se trezească cu răsăritul soarelui; Din păcate, viața modernă este dictată de un ceas arbitrar, adesea forțându-ne să ne trezim când nu există lumină naturală. Astăzi, vom face un ceas deșteptător cu răsărit de soare, care vă va trezi încet și încet fără a recurge la o mașină ofensatoare de zgomot.
Dacă faceți un ceas deșteptător cu răsărit de soare este puțin prea mult pentru dvs., verificați aceste aplicații iPhone și Android Utilizați aceste aplicații pentru a vă ajuta să dormiți mai bine [Android & iOS] Utilizați aceste aplicații pentru a vă ajuta să dormiți mai bine [Android & iOS] zi, cel mai bun lucru pe care îl puteți face este să obțineți o cantitate benefică de somn. Există întotdeauna noi studii care arată că dovedește cât de important este somnul într-adevăr pentru o persoană, îmbunătățind ... Citește mai mult care detectează când este mai bine să te trezești prin mișcări corporale Poate o aplicație să te ajute să dormi mai bine? O aplicație poate ajuta într-adevăr să dormi mai bine? Întotdeauna am fost un experimentator de somn, care a avut pentru o mare parte din viața mea un jurnal de vis meticulos și a studiat cât puteam să dorm în acest proces. Există o ... Citește mai mult, asigurându-vă că nu sunteți retrași de visul minunat, dar, în schimb, treziți-vă senzația de lumină și răcoritoare - ei chiar fac treabă.
Descrierea proiectului
Partea principală a proiectului va fi o lumină cu bandă cu LED-uri de 5 metri așezată în jurul patului. Le vom alimenta cu o sursă externă de 12 volți, schimbată cu ajutorul unor tranzistoare MOSFET N. Setarea pentru această parte va fi identică cu sistemul de iluminare dinamică Construiți-vă propria dvs. iluminare dinamică dinamică pentru un centru media Construiți-vă propriul iluminat ambiental dinamic pentru un centru media Dacă vizionați o mulțime de filme pe PC-ul dvs. sau în centrul media, sigur că te-ai confruntat cu dilema de iluminare; opriți complet toate luminile? Îi păstrezi în plină explozie? Sau ... Citește mai mult Am construit înainte.
Timpul va fi o problemă - din moment ce acesta este un prototip, voi stabili Arduino să contorizeze de câte ori este resetat. În teorie, ar trebui să pierdem doar o secundă sau două în fiecare zi, dar, în mod ideal, vom include un “ceas în timp real” cip pentru a face acest lucru mai fiabil. Alarma de răsărit va începe cu 30 de minute înainte de trezire și va crește încet nivelul de ieșire până când este la 100% luminozitate - aceasta ar trebui să fie suficientă pentru a ne trezi, deși este o idee bună să continuați să utilizați ceasul deșteptător obișnuit până când corpul dvs. este obisnuit.
De asemenea, încorporez o lumină de noapte în acest proiect, care detectează mișcarea și activează o lumină discretă de nivel scăzut sub pat cu o perioadă de 3 minute, separată de lumina LED-urilor, deoarece acestea ar face atât soția mea cât și pe mine să ne trezim . Iluminatul sub pat va fi o unitate de alimentare comercială, așa că voi rupe un releu în interiorul unei prize pentru a porni și opri acest lucru. Dacă nu sunteți confortabil să lucrați cu o sursă de alimentare de 110-240 V AC în orice circumstanțe (și în general o regulă bună de a avea), trageți un emițător wireless de 433 MHz cu prize de comutare, așa cum sa subliniat în proiectul de automatizare acasă Raspberry Pi Arduino Ghid de automatizare acasă cu Raspberry Pi și Arduino Ghidul de automatizare acasă cu Raspberry Pi și Arduino Piața de automatizare a locuințelor este inundată de sisteme scumpe de consum, incompatibile una cu cealaltă și costisitoare de instalat. Dacă aveți o Zmeură Pi și un Arduino, puteți realiza practic același lucru la ... Read More .
Listă de componente și schematică
- Arduino
- Set de lămpi cu LED-uri RGB LED
- 12 volți de alimentare
- 3 x tranzistoare MOSFET N (utilizez tipul STP16NF06FP)
- Releu și priză de alimentare, sau prize controlate fără fir și transmițător adecvat
- Alegerea dvs. de lumină de noapte (rețea normală alimentat cu ștecher este bine)
- Senzorul de mișcare PIR (HC-SR501) sau un sonar SC-04 (nu este la fel de eficient)
- Senzor de lumina
- Codul proiectului - dar citiți mai departe pentru a vă asigura că înțelegeți cum să personalizați totul.
Iată schema completă.
Cablarea unui releu
Notă: Săriți această secțiune dacă doriți să utilizați luminile RGB și ca lumină de noapte - aceasta se referă în mod special la pornirea unei lămpi separate alimentate de la rețea.
Pentru comutarea alimentării cu energie electrică, releul va trebui să fie evaluat pentru tensiune - 110V sau 240V AC în funcție de locul în care trăiți - și mai mult decât amperajul total pe care îl veți schimba. Cel pe care l-am folosit de la acest pachet de senzori (avertisment: asta e magazinul meu) este 250VAC / 10A, așa că ar trebui să fim în siguranță. Releele au a com port, de obicei în centru, care ar trebui să fie conectat la cablul de alimentare care intră în fișă; apoi conectați terminalul socket live la NU (în mod normal deschis). Nu ar trebui să-ți spun să nu faci asta, e conectat la o priză sau vei muri. Dacă vă este frică să vă confruntați cu alimentarea cu energie electrică, utilizați în schimb locașurile wireless.
Pământul și cablurile neutre ar trebui să treacă direct în priză și nu vor atinge releul. Este posibil să nu aveți o linie de pământ în SUA. Este responsabilitatea dvs. să cunoașteți codificarea culorilor cablurilor din zona dvs. locală - dacă altfel nu ați putea să efectuați o conexiune obișnuită în casa dvs. sau să reintroduceți un conector, nu încercați să încorporați un releu într-un singur!
Pentru a testa, conectați pinul semnalului releului la 12, apoi executați un program simplu de clipire modificat pentru a lucra la pinul 12, nu la 13, așa cum este implicit. Soclul dvs. ar trebui să fie pornit și oprit la fiecare câteva secunde. Motivul pentru care nu folosesc pinul 13 este că, în timpul procesului de încărcare, LED-ul de la bord se declanșează în succesiune rapidă pentru a indica activitatea în serie, ceea ce ar determina activarea releului.
Noțiuni de bază Timing dreapta
Funcțiile temporizării și ceasului sunt dificile fără acces la o conexiune la rețea sau dedicate Ceas în timp real (acestea includ bateriile proprii pentru a păstra ceasul merge chiar și atunci când principalul Arduino nu are putere). Pentru a menține costurile scăzute, o să trișez. Voi fi un hardcode pentru un timp de start pentru ca Arduino să înceapă numărătoarea inversă; timpul va fi, prin urmare, relativ la acest timp de start. La fiecare 24 de ore, ceasul se va reseta. Codul funcției de ceas de mai jos asigură variabilele globale currentMillis și currentMinutes sunt corecte în fiecare zi. Arduino nu ar trebui să piardă mai mult de câteva secunde la fiecare 45 de zile; cu toate acestea, acest stil greu de codificare a sincronizării este destul de limitat prin faptul că o întrerupere a alimentării sau o resetare accidentală va sparge totul, deci este cu siguranță o zonă care ar putea fi îmbunătățită. Dacă temporizarea nu se sincronizează, trebuie doar să resetați Arduino la ora de pornire stabilită.
Codul trebuie să fie ușor de înțeles.
void ceas () if (millis ()> = previousMillis + 86400000) // a trecut o zi întreagă, resetați ceasul; anteriorMillis + = 86400000; currentMillis = millis () - previousMillis; // aceasta pastreaza currentMillis la fel in fiecare zi currentMinutes = (currentMillis / 1000) / 60;
Funcția de noapte a luminii
Am separat principalele bucle în funcții distincte, astfel încât să fie mai ușor de citit și eliminat sau ajustat. lumina de noapte() funcția funcționează numai între orele când a fost resetat Arduino (presupun că probabil veți face acest lucru la ora de culcare sau în jurul valorii de culcare, când este întunecată) și până când va începe să apară alarma de răsărit. Am încercat inițial să folosesc un rezistor dependent de lumină, dar nu sunt foarte sensibili la lumina albastră (care se întâmplă să fie culoarea pe care o folosesc pentru lumina de noapte) și este dificil de calibrat corect. Folosirea ceasului are sens mai mult, oricum. Vom folosi globale currentMinutes variabilă, care se resetează zilnic.
Senzorul PIR poate fi puțin ciudat dacă nu l-ați folosit niciodată înainte, deși cablarea acestuia nu este dificilă - veți găsi VCC, GND, și OUT clar marcate pe spate. Există și două rezistoare variabile; cel numit RX determină intervalul (până la aproximativ 7 m), iar altul etichetat TX determină întârzierea. Întârzierea este de 5 secunde la cea mai mică setare (complet anti-sensul acelor de ceasornic) și înseamnă că orice mișcare instantanee va declanșa cel puțin 5 secunde “pe” de la senzor. Cu toate acestea, determină și întârzierea dintre stările active - deci dacă scade 5 secunde și nu se detectează nici o mișcare, senzorul va trimite un semnal scăzut timp de cel puțin 5 secunde, chiar dacă există o mișcare în acea perioadă. Dacă aveți întârzierea setată într-adevăr la aproximativ 30 de secunde, se pare că senzorul este spart.
Dacă dormiți singuri și nu vă deranjează utilizarea acelorași lumini de bandă RGB atât pentru alarma de răsărit, cât și pentru lumina de noapte, ar trebui să puteți regla suficient de ușor codul.
void nightlight () // Funcționați numai între orele de resetare -> răsărit. în cazul în care (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
Pentru simplitate, voi folosi valoarea de culoare RGB 255,255,0 pentru un răsărit însorit de culoare galbenă - în acest fel incrementarea pe ambele canale de culoare va fi aceeași. Dacă descoperiți că te trezește prea devreme, gândește-te să începi cu un roșu adânc și să fade spre galben sau alb. Rampa de până am folosit în doar liniar - poate doriți să investiga folosind o curbă mai naturală pentru valorile de luminozitate.
Funcția este simplă - funcționează cât de mult trebuie să se crească luminozitatea cu fiecare secundă, așa că este la luminozitate completă după o perioadă de 30 de minute; apoi se înmulțește cu atâtea secunde, în prezent, în răsărit. Dacă este deja la o luminozitate completă, acesta rămâne în continuare timp de 10 minute pentru a vă asigura că sunteți sus (și dacă nu sunteți în continuare, ar trebui să aveți probabil o alarmă de rezervă în loc).
void sunrisealarm () // fiecare secundă în timpul perioadei de 30 minite trebuie să mărească valoarea culorii prin: float increment = (float) 255 / (30 * 60); // roșu 255, verde 255 ne dă lumină galbenă plină dacă (curentMinute> = minuteUntilSunrise) // răsărit începe! float curentVal = (float) ((curentMillis / 1000) - (minuteUntilSunrise * 60)) * increment; Serial.print ("Valoarea curentă pentru răsăritul soarelui:"); Serial.println (currentVal); // în timpul rampării, scrieți valoarea curentă a minutelor incrementarea luminozității X dacă (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);
Capcane și upgrade-uri viitoare
Am folosit acest lucru în ultimele săptămâni și mă ajută într-adevăr să mă trezesc și să mă simt mai înviorat și într-un timp decent; lumina de noapte funcționează chiar foarte bine. Dar nu este perfect, deci iată câteva lucruri care au nevoie de muncă și lecții învățate în timpul construcției.
În timp ce făceam acest proiect, am întâmpinat o mulțime de probleme de a trata numerele mari, deci dacă intenționați să modificați codul, vă rugăm să aveți în vedere acest lucru. În limba C, introducerea variabilelor dvs. este foarte importantă - un număr nu este întotdeauna doar un număr. De exemplu, nesemnate lungi variabilele ar trebui folosite pentru a stoca numerele superbe pe care le facem când vorbim despre milisecunde, dar chiar și un număr cât mai mic de 60.000 nu poate fi stocat ca număr întreg (un int unsigned ar fi fost acceptabil pentru până la 68.000). Ideea este să citești tipurile de variabile atunci când folosești numere mari și dacă găsești bug-uri ciudate, probabil că una dintre variabilele tale nu are suficiente biți!
Am gasit, de asemenea, o problema cu scurgeri de tensiune foarte scazute de luminozitate - ceea ce duce la cea mai mica cantitate de lumina emisa chiar si atunci cand digitalWrite (RED, 0) semnalul este emis - nu cred că este o problemă hardware cu benzi, deoarece acestea funcționează bine cu controlorii oficiale. Dacă cineva poate rezolva această problemă, imaginat mai jos, aș fi foarte recunoscător. Am încercat să trageți în jos rezistențe, și de a limita tensiunea de ieșire de la pinii Arduino. S-ar putea să fiu nevoit să adaug un circuit simplu de comutare a puterii doar la tensiunea de alimentare a benzii LED atunci când este de fapt nevoie; sau ar putea fi defecte MOSFETs.
Pentru munca viitoare, sper să adaug un receptor IR și să duplic unele dintre caracteristicile controlerului original - cel puțin abilitatea de a schimba culorile ca o lumină generală de utilizare, deoarece chiar acum acest proiect transformă banda într-o noapte dedicată ușoară. S-ar putea chiar să adaug o funcție de expirare automată de 30 de minute.
Ați încercat acest lucru, ați făcut îmbunătățiri sau ați primit alte idei? Anunță-mă în comentariile!
Explorați mai multe despre: Arduino.