Cuprins:
Video: Lumină de trezire: 7 pași (cu imagini)
2025 Autor: John Day | [email protected]. Modificat ultima dată: 2025-01-13 06:58
În timp ce scriu acest lucru instructiv, este la mijlocul iernii în emisfera nordică și asta înseamnă zile scurte și nopți lungi. Sunt obișnuit să mă trezesc la 06:00 și vara soarele va străluci până atunci. În timpul iernii, însă, devine lumină la ora 09:00, dacă avem norocul să avem o zi în care nu este tulbure (ceea ce este … nu de multe ori).
Cu ceva timp în urmă am citit despre o „lumină de trezire” făcută de Philips care a fost folosită în Norvegia pentru a simula o dimineață însorită. Nu am cumpărat niciodată unul, dar m-am tot gândit să fac unul, pentru că a face unul singur este mai distractiv decât să îl cumpăr.
Provizii:
Rama foto "Ribba" 50 x 40 cm de la IKEA
panou dur perforat din magazinul de hardware
Placă de dezvoltare STM8S103 prin Ebay sau altele
DS1307 Ceas în timp real (Mouser, Farnell, Conrad etc.)
Cristal de ceas de 32768 Hz (Mouser, Farnell, Conrad etc.)
3V litiu coincell + suport coincell
MOSFET-uri cu canal N BUZ11 sau IRLZ34N (3x)
BC549 (sau orice alt tranzistor NPN)
câte leduri albe, roșii, albastre, verzi etc. doriți
unele rezistențe și condensatori (vezi schema)
Powerbrick, 12V la 20V, 3A sau mai mult (de exemplu, sursă de alimentare pentru laptop vechi)
Pasul 1: Este mai ușor să te ridici
Ideea este că este greu să te ridici din pat dimineața când este încă întuneric. Și dacă locuiți aproape sau chiar deasupra cercului arctic, va fi întuneric foarte mult. În locuri precum Tromsö, în Norvegia, nu va fi deloc lumină, deoarece acolo soarele apune la jumătatea lunii noiembrie doar pentru a reapărea la jumătatea lunii Ianuari.
Deci, ceea ce a făcut Philips a fost să simuleze răsăritul soarelui.
Philips crește încet luminozitatea unei lămpi, care este realizată probabil cu mai multe leduri, dar ascunsă în spatele unui singur difuzor. Timpul lor de la oprire la luminozitate maximă durează 30 de minute.
Luminile de trezire Philips nu sunt atât de scumpe, dar au o singură culoare și arată puțin mic. Cred că mă pot descurca mai bine.
Pasul 2: Mai multă culoare
Lumina mea de trezire folosește patru culori, alb, roșu, albastru și verde. Întâi apar ledurile albe, apoi vin cele roșii și ultimele câteva led-uri albastre și verzi. Ideea mea a fost că puteam simula nu numai creșterea luminozității, ci și schimbarea culorii luminii dimineții, începând cu un pic de alb, adăugând roșu puțin mai târziu și amestecând în albastru și verde la final. Nu sunt sigur că de fapt seamănă cu lumina reală a dimineții, dar îmi place afișajul colorat așa cum este acum.
Al meu este, de asemenea, mai rapid decât lumina de trezire Philips, în loc de cele 30 de minute ale luminii Philips, a mea trece de la 0% la 100% luminozitate în mai puțin de 5 minute. Așa că soarele meu răsare mult mai repede.
NOTĂ:
Este FOARTE greu să îmi fac poze cu lumina mea de trezire, am încercat cu mai multe aparate foto și smartphone-uri, dar toate imaginile pe care le-am făcut nu fac dreptate adevăratul lucru.
Pasul 3: curbă sigmoidă, pâlpâire și „rezoluție”
Desigur, am vrut să fac strălucirea cât mai lină posibil. Ochii umani sunt logaritmici în sensibilitate, ceea ce înseamnă că în întunericul total sunt mai sensibili decât sunt în plină zi. O creștere foarte mică a luminozității atunci când nivelurile sunt scăzute „se simte” la fel ca un pas mult mai mare atunci când lumina are o luminozitate de 40%. Pentru a realiza acest lucru, am folosit o curbă specială numită Sigmoid (sau curbă S), această curbă începe ca o curbă exponențială care se nivelează la jumătate din nou. Am constatat că este un mod foarte frumos de a crește (și de a scădea) intensitatea.
Frecvența de ceas a microcontrolerului (și a temporizatoarelor) este de 16 MHz și folosesc rezoluția maximă a TIMER2 (65536) pentru a crea trei semnale de lățime de impuls (PWM). Prin urmare, impulsurile vin 16000000/65536 = 244 de ori pe secundă. Aceasta este cu mult peste limita ochilor pentru a vedea orice pâlpâire.
Deci ledurile sunt alimentate cu un semnal PWM care este realizat cu acest 16 bittimer al microcontrolerului STM8S103. Cel puțin acest semnal PWM poate fi pornit cu o lungime de 1 impuls și restul de 65535 lungimi de impuls oprit.
Deci ledurile conectate la acel semnal PM vor fi apoi ON 1/65536-th din timp: 0,0015%
La maxim, acestea sunt ON 65536/65536-a timpului: 100%.
Pasul 4: Electronică
Microcontroler
Creierul luminii de trezire este un microcontroler STM8S103 de la STMicroelectronics. Îmi place să folosesc piese care au doar capacități suficiente pentru un loc de muncă. Pentru o sarcină simplă, nu este necesar să folosesc microcontrolerele STM32 (celelalte preferate ale mele), dar un Arduino UNO nu a fost suficient, deoarece am vrut trei semnale PWM cu rezoluție de 16 biți și nu există un temporizator cu trei canale de ieșire pe un UNO.
Ceas în timp real
Ora este citită de pe un ceas DS1307 în timp real care funcționează cu un cristal de 32768 Hz și are o baterie de rezervă de 3V.
Setarea orei curente, a zilei și a timpului de trezire se face cu două butoane și se afișează pe un ecran LCD de 16 x 2 caractere. Pentru a-mi menține dormitorul foarte întunecat noaptea, lumina de fundal a afișajului LCD este pornită numai atunci când ledurile sunt mai luminoase decât lumina de fundal și când setați ora, ziua și ora de trezire.
Putere
Puterea vine de la o sursă de alimentare veche pentru laptop, a mea produce 12V și poate livra 3A. Când aveți o altă sursă de alimentare, poate fi necesar să reglați rezistențele în serie cu șirurile de leduri. (Vezi mai jos)
Leds
Ledurile sunt conectate la sursa de 12V, restul electronicelor funcționând pe 5V realizate cu un regulator liniar 7805. În schemă se spune că folosesc un regulator TO220, care nu este necesar, deoarece microcontrolerul, afișajul și ceasul în timp real folosesc doar câțiva miliamperi. Ceasul meu folosește o versiune TO92 mai mică a 7805 capabilă să furnizeze 150mA.
Comutarea șirurilor de leduri se face cu MOSFET-uri cu canal N. Din nou, în schemă arată alte dispozitive decât am folosit. Am întâmplat să am exact trei MOSFET-uri BUZ11 foarte vechi în locul celor mai noi MOSFET-uri IRLZ34N. Funcționează bine
Desigur, puteți introduce oricâte leduri doriți, atâta timp cât MOSFET-urile și alimentarea cu energie pot rezista curentului. În schemă am desenat doar un șir din orice culoare, în realitate există mai multe culori paralele cu celelalte șiruri ale acelei culori.
Pasul 5: Rezistențe (pentru Leds)
Despre rezistențele din șirurile led. Ledurile albe și albastre au de obicei o tensiune de 2,8V peste ele atunci când sunt la luminozitate maximă.
Ledurile roșii au doar 1,8V, ledurile mele verzi au 2V peste ele la luminozitate maximă.
Un alt lucru este că luminozitatea lor completă nu este aceeași. Așa că a fost nevoie de câteva experimente pentru a le face la fel de strălucitoare (pentru ochii mei). Făcând ledurile la fel de luminoase la luminozitate maximă, acestea vor arăta la fel de luminoase la niveluri inferioare, semnalul lățimii pulsului le aprinde întotdeauna la luminozitate maximă, dar în perioadele mai lungi și mai scurte, ochii tăi au grijă de mediere.
Începeți cu un calcul ca acesta. Sursa de alimentare furnizează (în cazul meu) 12V.
Patru leduri albe din serie au nevoie de 4 x 2,8 V = 11,2 V, acest lucru lasând 0,8 V pentru rezistență.
Am constatat că erau suficient de luminoase la 30mA, astfel încât rezistența trebuie să fie:
0,8 / 0,03 = 26,6 ohm. În schemă vedeți că am introdus un rezistor de 22 ohmi, făcând ledurile puțin mai luminoase.
Ledurile albastre erau prea strălucitoare la 30mA, dar comparativ cu ledurile albe la 15 mA, aveau și aproximativ 2.8V peste ele la 15mA, deci calculul a fost de 4 x 2.8V = 11.2V lăsând din nou 0.8V
0,8 / 0,015 = 53,3 ohm, așa că am ales un rezistor de 47 ohmi.
Ledurile mele roșii au nevoie, de asemenea, de aproximativ 15 mA pentru a fi la fel de luminoase ca și celelalte, dar au doar 1,8V peste ele la acel curent. Aș putea așeza mai multe în serie și să mai am încă o „cameră” pentru rezistor.
Șase led-uri roșii mi-au dat 6 x 1,8 = 10,8V, deci peste rezistor a fost 12 - 10,8 = 1,2V
1,2 / 0,015 = 80 ohm, l-am transformat în 68 ohmi. La fel ca ceilalți, un pic mai strălucitor.
Ledurile verzi pe care le-am folosit sunt la fel de strălucitoare ca celelalte la aproximativ 20mA. Am avut nevoie doar de câteva (la fel ca cele albastre) și am ales să pun patru în serie. La 20mA au 2, 1V peste ele, dând 3 x 2,1 = 8,4V
12 - 8,4 = 3,6V pentru rezistor. Și 3,6 / 0,02 = 180 ohm.
Dacă construiți această lumină de trezire, este puțin probabil să aveți aceeași sursă de alimentare, va trebui să reglați numărul de leduri din serie și rezistențele necesare.
Un mic exemplu. Spuneți că aveți o sursă de energie care dă 20V. Aș alege să setez 6 led-uri albastre (și albe) în serie, 6 x 3V = 18V deci 2V pentru rezistor. Și să spunem că vă place luminozitatea la 40mA. Rezistorul trebuie apoi să fie de 2V / 0,04 = 50 ohm, un rezistor de 47 ohm va fi bine.
Vă sfătuiesc să nu mergeți mai mult de 50mA cu ledurile obișnuite (5mm). Unii se pot descurca mai mult, dar îmi place să fiu sigur.
Pasul 6: Software
Tot codul poate fi descărcat de pe:
gitlab.com/WilkoL/wakeup_light_stm8s103
păstrați codul sursă deschis, lângă restul acestei instrucțiuni, dacă doriți să urmați explicația.
Main.c
Main.c setează mai întâi ceasul, temporizatoarele și alte periferice. Majoritatea „driverelor” pe care le-am scris folosind Biblioteca standard de la STMicroelectronics și dacă aveți întrebări despre ele, scrieți-le într-un comentariu sub instructiv.
Eeprom
Am lăsat codul „text to display” pe care l-am folosit pentru a pune texte în eeprom-ul STM8S103 ca comentarii. Nu eram sigur că aveam suficientă memorie flash pentru tot codul meu, așa că am încercat să pun cât mai mult posibil în eeprom pentru a avea toate blițele pentru program. În cele din urmă, s-a dovedit că nu este necesar și am mutat textul să clipească. Dar l-am lăsat ca text comentat în fișierul main.c. Este plăcut să-l am, când trebuie să fac ceva similar mai târziu (într-un alt proiect)
Eeprom este încă utilizat, dar numai pentru stocarea timpului de trezire.
O dată pe secundă
După configurarea perifericelor, codul verifică dacă a trecut o secundă (făcut cu un cronometru).
Meniul
Dacă acesta este cazul, verifică dacă a fost apăsat un buton, dacă da, intră în meniu, unde puteți seta ora curentă, ziua săptămânii și ora de trezire. Amintiți-vă că durează aproximativ 5 minute pentru a trece de la oprire la luminozitate maximă, așa că setați ora de trezire puțin mai devreme.
Timpul de trezire este stocat în eeprom, astfel încât, chiar și după o întrerupere a curentului, să „știe” când să te trezească. Ora curentă este stocată în ceasul în timp real, desigur.
Comparație curentă și ora de trezire
Când nu a fost apăsat niciun buton, acesta verifică ora curentă și îl compară cu ora de trezire și ziua săptămânii. Nu vreau să mă trezească în weekend:-)
De cele mai multe ori nu trebuie făcut nimic, deci setează variabila „led-uri” la OFF altfel la ON. Această variabilă este verificată împreună cu semnalul „change_intensity”, care provine și de la un temporizator și este activ de 244 de ori pe secundă. Deci, atunci când variabila „leduri” este PORNITĂ intensitatea crește de 244 de ori pe secundă și când este OPRIT scade de 244 de ori pe secundă. Dar creșterea se face în pași simpli, în care scăderea este în pași de 16, ceea ce înseamnă că, atunci când lumina de trezire și-a făcut treaba, sperăm că se stinge de 16 ori mai repede, dar totuși fără probleme.
Netezime și FĂRĂ MEMORIE
Netezimea provine din calculul curbei Sigmoid. Calculul este destul de simplu, dar trebuie făcut în variabile în virgulă mobilă (duble) datorită funcției exp (), consultați fișierul sigmoid.c.
În situația standard, compilatorul / linkerul cosmic nu are suport pentru variabilele în virgulă mobilă. Activarea acestuia este ușoară (după ce ați găsit-o), dar vine cu o creștere a dimensiunii codului. Această creștere a fost prea mare pentru a face codul să se potrivească în memoria flash atunci când este combinat cu funcția sprintf (). Și această funcție este necesară pentru conversia numerelor în text pentru afișaj.
Itoa ()
Pentru a remedia această problemă, am creat funcția itoa (). Aceasta este o funcție Integer To Ascii care este destul de comună, dar nu este inclusă în biblioteca standard STMicroelectronics și nici în bibliotecile cosmice.
Pasul 7: IKEA (ce am face fără ele)
Imaginea de la a fost cumpărată de la IKEA. Este un cadru Ribba de 50 x 40cm. Acest cadru este destul de gros și asta îl face grozav pentru a ascunde electronice în spatele acestuia. În loc de afiș sau imagine am pus o bucată de panou dur perforat. Îl puteți cumpăra de la magazinul de feronerie, unde uneori se numește „scândură de pat”. Are găuri mici în el, care l-au făcut ideal pentru introducerea ledurilor. Din păcate, găurile din placa mea erau puțin mai mari de 5 mm, așa că a trebuit să folosesc lipici fierbinte pentru a „monta” ledurile.
Am făcut o gaură dreptunghiulară în centrul plăcii dure pentru afișajul de 16x2 și l-am apăsat. PCB-ul cu toate componentele electronice atârnă pe acest afișaj, nu este montat pe nimic altceva.
Panoul dur perforat a fost vopsit cu spray negru, dar în spatele covorului. Am forat două găuri în cadru pentru ca butoanele să stabilească ora și data, deoarece cadrul este destul de gros, a trebuit să lărgesc găurile din interiorul cadrului pentru a face butoanele să iasă suficient.