Publicitate

Oamenii sunt programați în mod natural pentru a se trezi cu răsăritul; viața modernă trist este dictată de un ceas arbitrar, care ne obligă adesea să ne trezim când nu există lumină naturală. Astăzi, vom crea un ceas cu alarmă pentru răsăritul soarelui, care vă va trezi ușor și încet, fără a apela la o mașină ofensivă de zgomot.

Dacă crearea unui ceas cu alarmă de răsărit este un pic prea mare pentru dvs., consultați aceste iPhone și Aplicații Android Utilizați aceste aplicații pentru a vă ajuta să dormiți mai bine [Android și iOS]După o zi agitată, cel mai bun lucru pe care îl puteți face este să obțineți o cantitate benefică de somn. Întotdeauna apar noi studii care dovedesc cât de important este somnul pentru o persoană, îmbunătățindu-se ... Citeste mai mult care detectează când este cel mai bine să te trezești prin mișcări ale corpului Poate o aplicație să vă ajute să dormiți mai bine?Am fost întotdeauna un pic experimentator de somn, având în mare parte din viața mea a ținut un jurnal de vis meticulos și am studiat cât am putut despre somn în acest proces. Există un ...

instagram viewer
Citeste mai mult , asigurându-vă că nu vă îndepărtați de acest vis minunat, ci, în schimb, treziți-vă simțindu-vă luminos și reîmprospătat - ei chiar funcționează.

Schița proiectului

Partea principală a proiectului va fi o lumină cu bandă LED de 5 metri așezată în jurul patului. Le vom alimenta cu o sursă externă de 12 volți, comutată folosind niște tranzistoare MOSFET N. Configurația pentru această parte va fi identică cu cea sistem de iluminare dinamic Construiți-vă propriul iluminat ambiental dinamic pentru un centru mediaDacă vizionați o mulțime de filme pe computer sau media center, sunt sigur că v-ați confruntat cu dilema de iluminare; stingeți complet toate luminile? Îi țineți în plină explozie? Sau... Citeste mai mult Am construit înainte.

Momentul va fi o problemă - întrucât acesta este un prototip, voi seta Arduino să-i numere înapoi de la fiecare resetare. În teorie, ar trebui să pierdem doar o secundă sau două în fiecare zi, dar ideal ar fi să includem un cip „ceas în timp real” pentru a face acest lucru mai în mod fiabil. Alarma la răsărit va începe cu 30 de minute înainte de ora de trezire și va crește încet nivelul de ieșire până când va fi la 100% luminozitate - acest lucru ar trebui să fie suficient pentru a ne trezi, deși este o idee bună să continuăm să utilizăm ceasul deșteptător obișnuit până când corpul tău este obișnuit să aceasta.

Voi încorpora, de asemenea, o lumină de noapte în acest proiect, care detectează mișcarea și activează un nivel scăzut discret lumină sub pat cu o pauză de 3 minute, separată de luminile LED, deoarece acestea ar provoca atât soția mea cât și eu sus. Iluminatul de sub pat va fi o unitate de alimentare comercială, așa că voi conecta un releu în interiorul unei prize pentru a le activa și dezactiva. Dacă nu sunteți confortabil să lucrați cu rețea de curent alternativ de 110-240v în orice circumstanță (și asta este în general o regulă bună de a avea), apoi conectați un emițător wireless de 433 MHz cu prize de comutare, așa cum este prezentat pe Raspberry Pi Arduino proiect de automatizare a locuinței Ghid de automatizare acasă cu zmeură Pi și ArduinoPiața automatizării casnice este inundată cu sisteme de consum scumpe, incompatibile între ele și costisitoare de instalat. Dacă aveți un Raspberry Pi și un Arduino, puteți obține același lucru la ... Citeste mai mult .

Lista de piese și schema

  • Arduino
  • Set de lumini LED cu bandă RGB
  • Alimentare de 12 volti
  • 3 x tranzistoare MOSFET N (folosesc tipul STP16NF06FP)
  • Priză releu și de alimentare, sau prize cu control wireless și transmițător adecvat
  • Alegerea dvs. de lumină de noapte (alimentarea obișnuită alimentată cu mufă este în regulă)
  • Senzor 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ă.

răsărit de soare-alarmă circuit

Cablarea unei relee

Notă: Treciți de această secțiune dacă doriți să utilizați și luminile RGB ca lumină de noapte - aceasta este specifică pentru pornirea unei lumini de alimentare separate.

Pentru alimentarea cu rețeaua electrică, releul dvs. va trebui să fie nominal pentru tensiune - 110V sau 240V AC în funcție de locul în care locuiți - și mai mult decât amperajul total pe care îl veți comuta. Cel pe care l-am folosit din acest pachet de senzori (disclaimer: acesta este magazinul meu) este 250VAC / 10A, deci ar trebui să fim în siguranță. Releele au o com port, de obicei în centru, care ar trebui să fie conectat la cablul care intră în priză; apoi conectați terminalul sub tensiune la priza NU (normal deschis). Nu ar trebui să vă spun să nu faceți acest lucru, deoarece este conectat la o priză sau veți muri. Dacă îți este teamă să nu te încurci cu rețeaua electrică, folosește în schimb prize cu comutare fără fir.

Releu-cabluri

Cablurile de pământ și neutre ar trebui să meargă direct la priză și nu vor atinge releul. Este posibil să nu aveți o linie a pământului în SUA. Este responsabilitatea dvs. să cunoașteți codarea color a firelor din zona dvs. locală - dacă nu puteți conecta altfel o priză obișnuită în casa dvs. sau nu ați conectat o priză, nu încercați să încorporați un releu într-unul singur!

Pentru a testa, conectați pinul de semnal al releului la 12, apoi rulați un program de clipire simplu modificat pentru a funcționa pe pinul 12, nu 13, cum este implicit. Priza trebuie să se pornească și să se oprească la fiecare câteva secunde. Motivul pentru care nu folosesc pinul 13 se datorează faptului că în timpul procesului de încărcare, LED-ul de bord se aprinde în succesiune rapidă pentru a indica activitatea serială, ceea ce ar provoca activarea releului.

Noțiuni corecte

Funcțiile de cronometrare și de ceas sunt dificile fără acces la o conexiune de rețea sau dedicate Ceas în timp real (acestea includ bateriile proprii pentru a menține ceasul chiar și atunci când Arduino principal nu are putere). Pentru a reduce costurile scăzute, o să trișez. Voi face o înregistrare rapidă pentru ca Arduino să înceapă numărătoarea inversă; prin urmare, calendarul va fi relativ la acest timp de pornire. La fiecare 24 de ore, ceasul se va reseta. Codul funcției de ceas de mai jos asigură că 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 de cronometrare cu coduri dure este destul de limitat prin faptul că o întrerupere a puterii sau o resetare accidentală va rupe totul, deci este cu siguranță o zonă care ar putea fi îmbunătățită. Dacă sincronizarea nu se sincronizează, pur și simplu resetați Arduino la ora de pornire setată.

Codul ar trebui să fie ușor de înțeles.

void clock () {if (millis ()> = precedentMillis + 86400000) {// a trecut o zi întreagă, resetați ceasul; precedentMillis + = 86400000; } currentMillis = millis () - precedentMillis; // acest lucru ne menține curentMillis la fel în fiecare zi currentMinutes = (currentMillis / 1000) / 60; }

Funcția luminii de noapte

Am separat buclele principale în funcții distincte, astfel încât să fie mai ușor de citit, de eliminat sau de ajustat. lumina de noapte() funcția funcționează numai între orele în care Arduino a fost resetat (presupun că veți face acest lucru probabil în jurul sau în jurul orei de culcare, când va fi întuneric) și până când se va începe alarma la răsărit. Am încercat inițial să folosesc un rezistor dependent de lumină, dar nu sunt prea sensibile la lumina albastră (care se întâmplă să fie culoarea pe care o folosesc pentru lumina de noapte) și dificil de calibrat corect. Oricum, folosirea ceasului are mai mult sens. Vom folosi globalul currentMinutes variabilă, care se resetează în fiecare zi.

Senzorul PIR poate fi un pic ciudat dacă nu ați mai folosit unul înainte, deși conectarea acestuia nu este dificilă - veți găsi VCC, GND, și OUT etichetat clar pe spate. De asemenea, există două rezistențe variabile; cel etichetat RX determină intervalul (până la aproximativ 7 m), iar un alt TX etichetat determină întârzierea. Întârzierea este de 5 secunde la cea mai scăzută setare (complet în sensul acelor de ceasornic) și înseamnă că orice mișcare de moment va declanșa cel puțin 5 secunde de stare „pornită” din senzor. Totuși, determină, de asemenea, întârzierea dintre stările active - deci dacă se scursă 5 secunde și nu se produce nicio mișcare detectat, senzorul va trimite un semnal scăzut timp de cel puțin 5 secunde, chiar dacă există mișcare în timpul acestuia perioadă. Dacă aveți întârziere setată foarte mare la aproximativ 30 de secunde, se poate părea că senzorul este rupt.

pir-senzor

Dacă dormiți singur și nu vă gândiți să folosiți aceleași lumini cu bandă RGB atât pentru alarma de soare, cât și pentru lumina de noapte, ar trebui să puteți ajusta codul suficient de ușor.

void nightlight () {// Funcționează numai între orele de resetare -> răsărit. if (currentMinutes 

Alarma de rasarit

Pentru simplitate, voi folosi valoarea de culoare RGB 255.255,0 pentru un răsărit de culoare galbenă profundă - în acest fel creșterea pe ambele canale de culoare va fi aceeași. Dacă găsiți că vă trezește prea devreme, luați în considerare să începeți cu un roșu profund și să pătați spre galben sau alb. Amplasarea pe care am folosit-o doar în linie - poate doriți să investigați folosind o curbă mai naturală pentru valori de luminozitate.

Funcția este simplă - se calculează cât de mult ar trebui să se mărească lumina cu fiecare secundă, astfel încât să fie la luminozitate maximă după o perioadă de 30 de minute; apoi înmulțește acest lucru cu totuși de multe secunde, este în prezent în răsărit. Dacă este deja la luminozitate maximă, rămâne activ pentru încă 10 minute pentru a vă asigura că ați terminat (și dacă nu sunteți încă sus, probabil că ar trebui să aveți o alarmă de rezervă în loc).

void sunrisealarm () {// fiecare secundă în perioada de 30 minite ar trebui să crească valoarea culorii cu: increment float = (float) 255 / (30 * 60); // roșu 255, verde 255 ne oferă o luminozitate completă galbenă dacă (currentMinutes> = minutesUntilSunrise) {// răsăritul soarelui! float currentVal = (float) ((currentMillis / 1000) - (minuteUntilSunrise * 60)) * increment; Serial.print ("Valoarea curentă pentru răsărit:"); Serial.println (currentVal); // în timpul ascensiunii, scrieți valoarea curentă a minutelor X creșterea luminozității if (currentVal <255) {analogWrite (RED, currentVal); analogWrite (GREEN, currentVal); } else if (currentMinutes - minutesUntilSunrise <40) {// odată ce suntem la luminozitate maximă, mențineți luminile aprinse timp de 10 minute mai mult analogWrite (RED, 255); analogWrite (VERDE, 255); } else {// după aceea, îi reîncărcăm pentru a dezactiva analogWrite de stat (RED, 0); analogWrite (VERDE, 0); } } }

Capcanele și upgrade-urile viitoare

Folosesc acest lucru în ultimele săptămâni acum și ajută cu adevărat să mă trezesc simțindu-te mai reîmprospătat și la un moment decent; lumina de noapte funcționează de asemenea foarte bine. Nu este perfect, totuși, iată câteva lucruri care au nevoie de muncă și de lecții învățate în timpul construcției.

răsărit de soare-alarmă

În timp ce făceam acest proiect, am întâmpinat o mulțime de probleme legate de numărul mare, așa că, dacă intenționați să modificați codul, vă rugăm să rețineți acest lucru. În limbajul C, tastarea variabilelor dvs. este foarte importantă - un număr nu este întotdeauna doar un număr. De exemplu, nesemnat de mult variabilele ar trebui să fie utilizate pentru a stoca numere super mari, cum ne ocupăm atunci când vorbim despre milisecunde, dar chiar și un număr de până la 60.000 nu poate fi stocat ca un număr întreg regulat (o intrare nesemnată ar fi fost acceptabilă până la 68.000). Ideea este că, citiți tipurile dvs. variabile când utilizați un număr mare și dacă găsiți erori ciudate, este probabil pentru că una dintre variabilele dvs. nu are destui biți!

De asemenea, am găsit o problemă cu scurgeri de tensiune de luminozitate foarte scăzute - ceea ce duce la cea mai mică cantitate de lumină emisă chiar și atunci când digitalWrite (RED, 0) semnalul este emis - nu cred că este problema hardware cu benzile, deoarece acestea funcționează bine cu controlerele oficiale. Dacă cineva poate rezolva această problemă, ilustrată mai jos, aș fi cel mai recunoscător. Am încercat să scot rezistențe și să limitez tensiunea de ieșire de la pinii Arduino. S-ar putea să fie nevoie să adaug un simplu circuit de comutare pentru a alimenta tensiunea numai la banda LED atunci când este nevoie de fapt; sau ar putea fi MOSFET-uri defecte.

Scurgere de lumină

Pentru lucrările viitoare, sper să adaug într-un receptor IR și să reproduc câteva dintre caracteristicile controlerului inițial - la cel puțin capacitatea de a schimba culorile ca lumină de uz general, deoarece în acest moment acest proiect transformă banda într-o noapte dedicată ușoară. Pot adăuga chiar și o funcție automată de expirare de 30 de minute.

Ați încercat acest lucru, ați făcut îmbunătățiri sau aveți alte idei? Anunță-mă în comentarii!

James are licență în inteligență artificială și este certificat CompTIA A + și Network +. Este dezvoltatorul principal al MakeUseOf și își petrece timpul liber jucând VR paintball și boardgames. Construiește calculatoare de când era mic.