Spisu treści:

Wakeup Light: 7 kroków (ze zdjęciami)
Wakeup Light: 7 kroków (ze zdjęciami)

Wideo: Wakeup Light: 7 kroków (ze zdjęciami)

Wideo: Wakeup Light: 7 kroków (ze zdjęciami)
Wideo: Cleo - DOM 2024, Listopad
Anonim
Światło budzenia
Światło budzenia

Kiedy piszę tę instrukcję, jest środek zimy na półkuli północnej, a to oznacza krótkie dni i długie noce. Jestem przyzwyczajony do wstawania o 06:00, a latem do tego czasu będzie świecić słońce. Zimą jednak robi się jasno o godzinie 09:00, jeśli mamy szczęście, że mamy dzień, w którym nie jest pochmurno (co… nieczęsto).

Jakiś czas temu czytałem o „oświetleniu budzenia” firmy Philips, które zostało użyte w Norwegii do symulacji słonecznego poranka. Nigdy go nie kupiłem, ale ciągle myślałem o zrobieniu takiego, ponieważ zrobienie go samemu jest fajniejsze niż samo kupowanie.

Kieszonkowe dzieci:

Ramka na zdjęcia "Ribba" 50 x 40 cm z IKEA

perforowana płyta pilśniowa ze sklepu ze sprzętem

Płytka rozwojowa STM8S103 za pośrednictwem serwisu Ebay lub innych

DS1307 Zegar czasu rzeczywistego (Mouser, Farnell, Conrad itp.)

Kryształ zegarka 32768 Hz (Mouser, Farnell, Conrad itp.)

Coincell litowy 3 V + uchwyt na coincell

N-kanałowe MOSFETy BUZ11 lub IRLZ34N (3x)

BC549 (lub dowolny inny tranzystor NPN)

tyle białych, czerwonych, niebieskich, zielonych diod led, ile chcesz;

niektóre rezystory i kondensatory (patrz schemat)

Powerbrick, 12V do 20V, 3A lub więcej (np. stary zasilacz laptopa)

Krok 1: Ułatwienie (trochę) wstawania

Ułatwienie (trochę) wstawania
Ułatwienie (trochę) wstawania

Chodzi o to, że trudno wstać z łóżka rano, kiedy jest jeszcze ciemno. A jeśli mieszkasz blisko lub nawet nad kołem podbiegunowym, będzie ciemno bardzo długo. W miejscach takich jak Tromsö w Norwegii wcale nie będzie jasno, bo tam słońce zachodzi w połowie listopada, by ponownie pojawić się w połowie stycznia.

Więc to, co zrobił Philips, to symulacja wschodu słońca.

Philips powoli zwiększa jasność lampy, która prawdopodobnie składa się z kilku diod, ale jest ukryta za jednym dyfuzorem. Ich czas od wyłączenia do pełnej jasności zajmuje 30 minut.

Lampy budzące Philips nie są tak drogie, ale mają tylko jeden kolor i wyglądają na trochę małe. Myślę, że mogę zrobić lepiej.

Krok 2: Więcej kolorów

Więcej kolorów
Więcej kolorów

Moje światło budzenia używa czterech kolorów: białego, czerwonego, niebieskiego i zielonego. Najpierw białe diody, potem czerwone, a na końcu kilka niebieskich i zielonych diod. Pomysł polegał na tym, że mógłbym zasymulować nie tylko wzrost jasności, ale także przesunięcie barwy porannego światła, zaczynając od odrobiny bieli, dodając nieco później czerwony i mieszając na końcu niebieski i zielony. Nie jestem pewien, czy rzeczywiście przypomina poranne światło, ale podoba mi się kolorowy wyświetlacz taki, jaki jest teraz.

Mój jest również szybszy niż światło budzące Philipsa, zamiast 30 minut światła Philipsa, mój rozjaśnia się od 0% do 100% w mniej niż 5 minut. Więc moje słońce wschodzi znacznie szybciej.

NOTATKA:

BARDZO trudno jest zrobić zdjęcia mojego światła budzenia, próbowałem z kilkoma aparatami i smartfonami, ale wszystkie zdjęcia, które zrobiłem, nie oddają prawdziwej sprawiedliwości.

Krok 3: Krzywa sigmoidalna, migotanie i „rozdzielczość”

Krzywa sigmoidalna, migotanie i
Krzywa sigmoidalna, migotanie i

Oczywiście chciałem, aby rozjaśnienie było jak najbardziej płynne. Ludzkie oczy mają wrażliwość logarytmiczną, co oznacza, że w całkowitej ciemności są bardziej wrażliwe niż w pełnym świetle dziennym. Bardzo mały wzrost jasności, gdy poziomy są niskie, „odczuwa” to samo, co znacznie większy krok, gdy światło ma jasność 40%. Aby to osiągnąć, użyłem specjalnej krzywej zwanej Sigmoid (lub krzywej S). Ta krzywa zaczyna się jako krzywa wykładnicza, która w połowie ponownie się wyrównuje. Odkryłem, że jest to bardzo fajny sposób na zwiększenie (i zmniejszenie) intensywności.

Częstotliwość taktowania mikrokontrolera (i timerów) wynosi 16 MHz i używam maksymalnej rozdzielczości TIMER2 (65536) do tworzenia trzech sygnałów szerokości impulsu (PWM). Dlatego impulsy przychodzą 16000000 / 65536 = 244 razy na sekundę. To znacznie powyżej granicy oczu, aby zobaczyć jakiekolwiek migotanie.

Diody są więc zasilane sygnałem PWM, który jest wytwarzany za pomocą 16-bitowego timera mikrokontrolera STM8S103. Jako minimum, ten sygnał PWM może być WŁĄCZONY, ma długość 1 impulsu, a pozostałe 65535 długości impulsu są wyłączone.

Więc diody podłączone do tego sygnału PM będą wtedy włączone 1/65536-tego czasu: 0,0015%

Maksymalnie są WŁĄCZONE 65536/65536-ty czas: 100%.

Krok 4: Elektronika

Elektronika
Elektronika
Elektronika
Elektronika
Elektronika
Elektronika
Elektronika
Elektronika

Mikrokontroler

Mózgiem światła budzącego jest mikrokontroler STM8S103 firmy STMicroelectronics. Lubię używać części, które mają wystarczające możliwości do pracy. Do prostego zadania nie jest konieczne używanie mikrokontrolerów STM32 (moje inne ulubione), ale Arduino UNO nie wystarczyło, ponieważ chciałem trzy sygnały PWM o rozdzielczości 16 bitów i nie ma timera z trzema kanałami wyjściowymi na UNO.

Zegar czasu rzeczywistego

Czas jest odczytywany z zegara czasu rzeczywistego DS1307, który pracuje z kryształem 32768 Hz i ma baterię zapasową 3V.

Ustawienie aktualnej godziny, dnia i godziny budzenia odbywa się za pomocą dwóch przycisków i jest pokazywane na wyświetlaczu LCD 16x2 znaków. Aby w mojej sypialni było naprawdę ciemno w nocy, podświetlenie wyświetlacza LCD włącza się tylko wtedy, gdy diody led są jaśniejsze niż podświetlenie i gdy ustawiasz godzinę, dzień i godzinę pobudki.

Moc

Zasilanie pochodzi ze starego zasilacza laptopa, mój wytwarza 12V i może dostarczyć 3A. Jeśli masz inny zasilacz, może być konieczne dostosowanie rezystorów szeregowo za pomocą ciągów led. (Patrz poniżej)

Diody

Diody są podłączone do zasilania 12V, reszta elektroniki pracuje na 5V z regulatorem liniowym 7805. Na schemacie jest napisane, że używam regulatora TO220, który nie jest potrzebny, ponieważ mikrokontroler, wyświetlacz i zegar czasu rzeczywistego pobierają tylko kilka miliamperów. Mój zegar wykorzystuje mniejszą wersję TO92 7805, która może dostarczać 150mA.

Przełączanie ciągów led odbywa się za pomocą N-kanałowych tranzystorów MOSFET. Ponownie na schemacie pokazuje inne urządzenia niż użyłem. Zdarzyło mi się mieć dokładnie trzy bardzo stare MOSFET-y BUZ11 zamiast nowszych MOSFET-ów IRLZ34N. Działają dobrze

Oczywiście możesz włożyć tyle diod, ile chcesz, o ile MOSFET i zasilacz wytrzymają prąd. Na schemacie narysowałem tylko jeden sznurek dowolnego koloru, w rzeczywistości jest ich kilka w każdym kolorze równoległych do innych sznurków tego koloru.

Krok 5: Rezystory (dla diod)

Rezystory (dla diod)
Rezystory (dla diod)

O rezystorach w smyczkach led. Białe i niebieskie diody led zwykle mają nad sobą napięcie 2,8 V, gdy są w pełnej jasności.

Czerwone diody mają tylko 1,8V, moje zielone diody mają 2V nad sobą przy pełnej jasności.

Inną rzeczą jest to, że ich pełna jasność nie jest taka sama. Trzeba było więc trochę poeksperymentować, aby były równie jasne (w moich oczach). Dzięki temu, że diody led są równie jasne przy pełnej jasności, będą również wyglądały równie jasno na niższych poziomach, sygnał szerokości impulsu zawsze włącza je z pełną jasnością, ale w dłuższych i krótszych czasach Twoje oczy dbają o uśrednianie.

Zacznij od takiego obliczenia. Zasilacz dostarcza (w moim przypadku) 12V.

Cztery białe diody połączone szeregowo wymagają 4 x 2,8 V = 11,2 V, co pozostawia 0,8 V dla rezystora.

Odkryłem, że były wystarczająco jasne przy 30mA, więc rezystor musi być:

0,8 / 0,03 = 26,6 oma. Na schemacie widać, że umieściłem rezystor 22 ohm, dzięki czemu diody led są tylko trochę jaśniejsze.

Niebieskie diody były zbyt jasne przy 30mA, ale w porównaniu z białymi diodami przy 15 mA, miały nad sobą około 2,8V przy 15mA, więc obliczenia były 4 x 2,8V = 11,2V ponownie pozostawiając 0,8V

0,8 / 0,015 = 53,3 omów więc wybrałem rezystor 47 omów.

Moje czerwone diody również potrzebują około 15 mA, aby były równie jasne jak inne, ale przy tym prądzie mają nad sobą tylko 1,8 V. Mogłem więc postawić więcej szeregowo i mieć jeszcze trochę „miejsca” na rezystor.

Sześć czerwonych diod dało mi 6 x 1,8 = 10,8V, więc na rezystorze było 12 – 10,8 = 1,2V

1,2 / 0,015 = 80 omów, zrobiłem 68 omów. Podobnie jak inne, odrobinę jaśniejsze.

Zielone diody, których użyłem, są tak samo jasne jak inne przy około 20mA. Potrzebowałem tylko kilku (tak jak niebieskich) i zdecydowałem się ustawić cztery w szeregu. Przy 20mA mają nad sobą 2,1V, co daje 3 x 2,1 = 8,4V

12 – 8,4 = 3,6V dla rezystora. A 3,6 / 0,02 = 180 omów.

Jeśli zbudujesz to światło budzenia, jest mało prawdopodobne, że masz takie samo zasilanie, będziesz musiał dostosować liczbę diod LED połączonych szeregowo i potrzebne rezystory.

Mały przykład. Powiedzmy, że masz zasilacz, który daje 20V. Wybrałbym szeregowo 6 niebieskich (i białych) diod LED, 6 x 3V = 18V czyli 2V dla rezystora. I powiedzmy, że lubisz jasność przy 40mA. Rezystor musi wtedy wynosić 2 V / 0,04 = 50 omów, rezystor 47 omów będzie w porządku.

Ze zwykłymi diodami (5mm) radzę nie przekraczać 50mA. Niektórzy mogą znieść więcej, ale ja lubię być po bezpiecznej stronie.

Krok 6: Oprogramowanie

Cały kod można pobrać z:

gitlab.com/WilkoL/wakeup_light_stm8s103

pozostaw otwarty kod źródłowy, obok reszty instrukcji, jeśli chcesz postępować zgodnie z wyjaśnieniem.

Main.c

Main.c najpierw konfiguruje zegar, timery i inne urządzenia peryferyjne. Większość „sterowników”, które napisałem, korzystając ze standardowej biblioteki od STMicroelectronics, a jeśli masz jakieś pytania na ich temat, napisz to w komentarzu poniżej instrukcji.

eeprom

Zostawiłem kod „tekst do wyświetlenia”, którego użyłem do umieszczania tekstów w eepromie STM8S103 jako komentarze. Nie byłem pewien, czy mam wystarczająco dużo pamięci flash na cały mój kod, więc starałem się umieścić jak najwięcej w eepromie, aby mieć całą pamięć flash dla programu. W końcu okazało się to niepotrzebne i przeniosłem tekst do flashowania. Ale zostawiłem to jako wykomentowany tekst w pliku main.c. Fajnie jest go mieć, gdy muszę zrobić coś podobnego później (w innym projekcie)

eeprom jest nadal używany, ale tylko do przechowywania czasu budzenia.

Raz na sekundę

Po skonfigurowaniu urządzeń peryferyjnych kod sprawdza, czy minęła sekunda (zrobione z timerem).

Menu

Jeśli tak, to sprawdza, czy został naciśnięty przycisk, jeśli tak, to wchodzi do menu, w którym można ustawić aktualną godzinę, dzień tygodnia i godzinę budzenia. Pamiętaj, że przejście od wyłączenia do pełnej jasności zajmuje około 5 minut, więc ustaw czas budzenia nieco wcześniej.

Czas budzenia jest przechowywany w eepromie, dzięki czemu nawet po zaniku zasilania będzie „wiedzieć”, kiedy Cię obudzić. Aktualny czas jest oczywiście przechowywany w zegarze czasu rzeczywistego.

Porównanie prądu i czasu budzenia

Gdy nie został naciśnięty żaden przycisk, sprawdza aktualną godzinę i porównuje ją z godziną budzenia i dniem tygodnia. Nie chcę, żeby mnie to obudziło w weekend:-)

W większości przypadków nie trzeba nic robić, więc ustawia zmienną „ledy” na OFF, w przeciwnym razie na ON. Zmienna ta jest sprawdzana razem z sygnałem „change_intensity”, który również pochodzi z timera i jest aktywny 244 razy na sekundę. Tak więc, gdy zmienna „ledy” jest włączona, intensywność wzrasta 244 razy na sekundę, a gdy jest wyłączona, zmniejsza się 244 razy na sekundę. Ale wzrost następuje w pojedynczych krokach, gdzie spadek jest w krokach co 16, co oznacza, że gdy światło wybudzania, miejmy nadzieję, wykonało swoje zadanie, wyłącza się 16 razy szybciej, ale nadal płynnie.

Gładkość i BRAK PAMIĘCI

Gładkość pochodzi z obliczenia krzywej sigmoidalnej. Obliczenia są dość proste, ale muszą być wykonane w zmiennych zmiennoprzecinkowych (podwójnych) ze względu na funkcję exp(), patrz plik sigmoid.c.

W standardowej sytuacji kompilator / linker Cosmic nie obsługuje zmiennych zmiennoprzecinkowych. Włączenie go jest łatwe (po znalezieniu), ale wiąże się ze zwiększeniem rozmiaru kodu. Ten wzrost był zbyt duży, aby kod zmieścił się w pamięci flash w połączeniu z funkcją sprintf(). A ta funkcja jest potrzebna do konwersji liczb na tekst na wyświetlaczu.

Itoa()

Aby rozwiązać ten problem, stworzyłem funkcję itoa(). Jest to funkcja Integer To Ascii, która jest dość powszechna, ale nie jest zawarta w standardowej bibliotece STMicroelectronics ani w bibliotekach Cosmic.

Krok 7: IKEA (co byśmy bez nich zrobili)

IKEA (co byśmy bez nich zrobili)
IKEA (co byśmy bez nich zrobili)
IKEA (co byśmy bez nich zrobili)
IKEA (co byśmy bez nich zrobili)
IKEA (co byśmy bez nich zrobili)
IKEA (co byśmy bez nich zrobili)

Zdjęcie z zostało kupione w IKEA. Jest to rama Ribba o wymiarach 50 x 40 cm. Rama ta jest dość gruba, przez co świetnie nadaje się do ukrywania za nią elektroniki. Zamiast plakatu lub obrazu włożyłem kawałek perforowanej płyty pilśniowej. Możesz go kupić w sklepie z narzędziami, gdzie czasami nazywa się go „deską do łóżka”. Ma małe dziurki, dzięki czemu idealnie nadaje się do wkładania diod. Niestety otwory w mojej płytce były nieco większe niż 5 mm, więc musiałem użyć kleju na gorąco, aby „zamontować” diody.

Wykonałem prostokątny otwór w środku płyty twardej na wyświetlacz 16x2 i wcisnąłem. Płytka z całą elektroniką wisi na tym wyświetlaczu, nie jest zamontowana do niczego innego.

Perforowana płyta pilśniowa została pomalowana natryskowo na czarno, ale za matą. Wywierciłem w ramce dwa otwory na przyciski, aby ustawić godzinę i datę, ponieważ ramka jest dość gruba, musiałem poszerzyć otwory po wewnętrznej stronie ramki, aby przyciski wystarczająco wystawały.

Zalecana: