Reklama
Ludzie są naturalnie zaprogramowani, aby obudzić się wraz ze wschodem słońca; niestety współczesne życie podyktowane jest arbitralnym zegarem, często zmuszającym nas do przebudzenia, gdy nie ma naturalnego światła. Dzisiaj przygotujemy budzik o wschodzie słońca, który delikatnie i powoli obudzi Cię bez uciekania się do obraźliwej maszyny hałasującej.
Jeśli zrobienie budzika o wschodzie słońca jest dla Ciebie trochę za dużo, sprawdź te iPhone'y i aplikacje Android Użyj tych aplikacji, aby pomóc Ci lepiej spać [Android i iOS]Po ciężkim dniu najlepiej jest zasnąć. Zawsze pojawiają się nowe badania, które dowodzą, jak ważny jest sen dla osoby, poprawiając ... Czytaj więcej które wykrywają kiedy najlepiej obudzić cię ruchami ciała Czy aplikacja może naprawdę pomóc ci lepiej spać?Zawsze byłem trochę eksperymentatorem snu, przez większą część mojego życia prowadziłem skrupulatny pamiętnik snów i studiowałem jak najwięcej na temat snu. Istnieją... Czytaj więcej , upewniając się, że nie oderwałeś się od tego niesamowitego snu, ale zamiast tego obudziłeś się jasny i odświeżony - naprawdę działają.
Zarys projektu
Główną częścią projektu będzie około 5-metrowa lampka LED ułożona wokół łóżka. Zasilamy je zewnętrznym zasilaniem 12 V, przełączanym za pomocą niektórych tranzystorów MOSFET N. Konfiguracja dla tej części będzie identyczna z dynamiczny system oświetlenia Zbuduj własne dynamiczne oświetlenie otoczenia dla centrum multimedialnegoJeśli oglądasz dużo filmów na swoim komputerze lub centrum multimedialnym, jestem pewien, że stanąłeś przed dylematem dotyczącym oświetlenia; czy całkowicie wyłączasz wszystkie światła? Czy utrzymujesz je w pełnej krasie? Lub... Czytaj więcej Zbudowałem wcześniej.
Problemem będzie czas - ponieważ jest to prototyp, ustawię Arduino tak, aby odliczał czas po każdym zresetowaniu. Teoretycznie powinniśmy tracić tylko sekundę lub dwie każdego dnia, ale idealnie byłoby, gdybyśmy zawarli układ „zegara czasu rzeczywistego”, aby zrobić to bardziej niezawodnie. Alarm wschodu słońca uruchomi się 30 minut przed czasem budzenia i powoli zwiększa poziom wyjściowy, aż osiągnie 100% jasności - powinno to wystarczyć, aby nas obudzić, chociaż dobrym pomysłem jest używanie zwykłego budzika, dopóki twoje ciało nie przyzwyczai się to.
Będę również włączać lampkę nocną do tego projektu, który wykrywa ruch i aktywuje dyskretny niski poziom światło pod łóżkiem z 3-minutowym czasem oczekiwania, oddzielne od świateł LED, ponieważ spowoduje to obudzenie mojej żony i mnie w górę. Oświetlenie pod łóżkiem będzie komercyjnym urządzeniem sieciowym, więc zhakuję przekaźnik wewnątrz gniazdka, aby go włączyć i wyłączyć. Jeśli pod żadnym pozorem nie czujesz się komfortowo pracując z zasilaniem sieciowym 110-240 V AC (i to na ogół dobra zasada), a następnie podłącz bezprzewodowy nadajnik 433 MHz z gniazdami przełączającymi, zgodnie z opisem na Projekt automatyki domowej Raspberry Pi Arduino Podręcznik automatyki domowej z Raspberry Pi i ArduinoRynek automatyki domowej jest zalany drogimi systemami konsumenckimi, niekompatybilnymi ze sobą i kosztownymi w instalacji. Jeśli masz Raspberry Pi i Arduino, możesz w zasadzie osiągnąć to samo w ... Czytaj więcej .
Lista części i schemat
- Arduino
- Zestaw świateł LED RGB
- Zasilacz 12 woltów
- 3 x tranzystory MOSFET N (używam typu STP16NF06FP)
- Gniazdo przekaźnika i zasilania lub gniazda sterowane bezprzewodowo i odpowiedni nadajnik
- Twój wybór lampki nocnej (zwykłe zasilanie sieciowe z wtyczką jest w porządku)
- Czujnik ruchu PIR (HC-SR501) lub sonar SC-04 (nie tak skuteczny)
- Czujnik światła
- Kod projektu - ale czytaj dalej, aby upewnić się, że wiesz, jak wszystko dostosować.
Oto kompletny schemat.

Podłączanie przekaźnika
Uwaga: Pomiń ten rozdział, jeśli chcesz używać lamp RGB również jako lampki nocnej - jest to specjalnie przeznaczone do włączania osobnych lamp zasilanych z sieci.
Aby przełączyć zasilanie sieciowe, przekaźnik będzie musiał uzyskać napięcie znamionowe - 110 V. lub 240 V AC w zależności od tego, gdzie mieszkasz - i więcej niż całkowity prąd, który zmienisz. Ten, którego użyłem z tego zestawu czujników (zrzeczenie się: to mój sklep) jest 250 VAC / 10 A., więc powinniśmy być bezpieczni. Przekaźniki mają com port, zwykle w środku, który powinien być podłączony do przewodu pod napięciem wchodzącego do wtyczki; następnie podłącz terminal pod napięciem do gniazda NIE (normalnie otwarte). Nie powinienem ci mówić, żebyś nie robił tego podstępu, bo jest podłączony do gniazdka, bo inaczej umrzesz. Jeśli boisz się zepsuć z sieci, użyj zamiast tego bezprzewodowych gniazd przełączanych.

Kable uziemiające i neutralne powinny iść prosto do gniazdka i nie dotykać przekaźnika. W Stanach Zjednoczonych możesz nie mieć linii uziemienia. Twoim obowiązkiem jest znać kodowanie kolorami przewodów w swoim regionie - jeśli nie możesz w inny sposób podłączyć zwykłego gniazdka w domu lub podłączyć wtyczki, nie próbuj osadzać przekaźnika w jednym!
Aby przetestować, podłącz pin sygnału przekaźnika do 12, a następnie uruchom prosty program mrugania zmodyfikowany do pracy na pinie 12, a nie 13, jak domyślnie. Twoje gniazdo powinno włączać się i wyłączać co kilka sekund. Powodem, dla którego nie używam pinu 13, jest to, że podczas procesu przesyłania wbudowana dioda LED strzela szybko po sobie, aby wskazać szeregową aktywność, co również spowodowałoby aktywację przekaźnika.
Właściwe wyczucie czasu
Funkcje zegara i zegara są trudne bez dostępu do połączenia sieciowego lub dedykowanego Zegar czasu rzeczywistego (obejmują one własne baterie, dzięki którym zegar działa nawet wtedy, gdy główne Arduino nie ma zasilania). Aby utrzymać niskie koszty, będę oszukiwać. Będę ustalać czas rozpoczęcia Arduino, aby rozpocząć odliczanie; czasy będą zatem względne w stosunku do tego czasu rozpoczęcia. Co 24 godziny zegar będzie resetowany. Poniższy kod funkcji zegara zapewnia, że zmienne globalne currentMillis i currentMinutes są poprawne każdego dnia. Arduino nie powinno tracić więcej niż kilka sekund co 45 dni; jednak ten mocno zakodowany styl taktowania jest dość ograniczony, ponieważ przerwa w zasilaniu lub przypadkowe resetowanie zniszczy wszystko, więc z pewnością jest to jeden obszar, który można poprawić. Jeśli synchronizacja nie jest zsynchronizowana, po prostu zresetuj Arduino o ustawionej godzinie rozpoczęcia.
Kod powinien być łatwy do zrozumienia.
void clock () {if (millis ()> = previousMillis + 86400000) {// upłynął cały dzień, zresetuj zegar; previousMillis + = 86400000; } currentMillis = millis () - previousMillis; // dzięki temu nasz bieżący Millill jest taki sam każdego dnia currentMinutes = (currentMillis / 1000) / 60; }
Funkcja nocnego światła
Pętle główne podzielę na odrębne funkcje, aby łatwiej było je czytać, usuwać lub dostosowywać. The nocne światło() funkcja działa tylko między godzinami, w których Arduino został zresetowany (zakładam, że prawdopodobnie zrobisz to przed snem lub w jego pobliżu, gdy jest ciemno), a do uruchomienia alarmu wschodu słońca. Początkowo próbowałem użyć rezystora zależnego od światła, ale nie są one bardzo wrażliwe na światło niebieskie (który akurat jest kolorem, którego używam do światła nocnego) i trudno jest je właściwie skalibrować. W każdym razie korzystanie z zegara jest bardziej sensowne. Użyjemy globalnego currentMinutes zmienna, która jest resetowana każdego dnia.
Czujnik PIR może być nieco dziwaczny, jeśli nigdy wcześniej go nie używałeś, chociaż podłączenie go nie jest trudne - przekonasz się VCC, GND, i NA ZEWNĄTRZ wyraźnie oznaczone na plecach. Istnieją również dwa zmienne oporniki; jeden oznaczony RX określa zasięg (do około 7 m), a drugi oznaczony TX określa opóźnienie. Opóźnienie wynosi 5 sekund przy najniższym ustawieniu (całkowicie przeciwnie do ruchu wskazówek zegara) i oznacza, że każdy chwilowy ruch wyzwoli co najmniej 5 sekund stanu włączenia z czujnika. Określa jednak również opóźnienie między stanami aktywnymi - więc jeśli upłynie 5 sekund, a ruch nie nastąpi wykryty, czujnik wyśle niski sygnał przez co najmniej 5 sekund, nawet jeśli podczas tego nastąpi ruch Kropka. Jeśli opóźnienie jest ustawione naprawdę na około 30 sekund, może się wydawać, że czujnik jest uszkodzony.

Jeśli śpisz sam i nie masz nic przeciwko użyciu tych samych świateł paskowych RGB zarówno do alarmu wschodu, jak i światła nocnego, powinieneś być w stanie łatwo dostosować kod.
void nightlight () {// Działa tylko między godzinami resetu -> wschód słońca. if (currentMinutes
Alarm wschodu słońca
Dla uproszczenia użyję wartości koloru RGB 255,255,0 dla ciemnożółtego wschodu słońca - w ten sposób przyrost na obu kanałach kolorów będzie taki sam. Jeśli okaże się, że budzi cię zbyt wcześnie, rozważ rozpoczęcie od głębokiej czerwieni i zanikanie w kierunku żółtego lub białego. Przyspieszenie zastosowałem tylko liniowo - możesz chcieć zbadać, używając bardziej naturalnej krzywej dla wartości jasności.
Ta funkcja jest prosta - sprawdza, ile światła należy zwiększać o każdą sekundę, aby po 30 minutach była w pełni jasna; następnie mnoży to przez tyle sekund, ile wynosi obecnie do wschodu słońca. Jeśli jest już w pełnej jasności, pozostaje włączony przez kolejne 10 minut, aby upewnić się, że wszystko jest w porządku (a jeśli nadal nie jesteś, prawdopodobnie powinieneś mieć włączony alarm rezerwowy).
void sunrisealarm () {// każda sekunda w okresie 30 minite powinna zwiększyć wartość koloru o: float increment = (float) 255 / (30 * 60); // czerwony 255, zielony 255 daje nam pełną jasność żółty, jeśli (currentMinutes> = minutesUntilSunrise) {// zaczyna się wschód słońca! float currentVal = (float) ((currentMillis / 1000) - (minutesUntilSunrise * 60)) * przyrost; Serial.print („Aktualna wartość dla wschodu słońca:”); Serial.println (currentVal); // podczas przyspieszania, zapisz bieżącą wartość przyrostu jasności w minutach X, jeśli (currentVal <255) {analogWrite (RED, currentVal); analogWrite (ZIELONY, currentVal); } else if (currentMinutes - minutesUntilSunrise <40) {// gdy osiągniemy pełną jasność, nie wyłączaj światła przez 10 minut dłużej analogWrite (RED, 255); analogWrite (ZIELONY, 255); } else {// po tym, nukujemy je z powrotem do stanu wyłączonego analogWrite (RED, 0); analogWrite (ZIELONY, 0); } } }
Pułapki i przyszłe aktualizacje
Używam tego od kilku tygodni i naprawdę pomaga obudzić się bardziej odświeżony i przyzwoity; światło nocne również działa naprawdę dobrze. Nie jest to jednak idealne, więc oto kilka rzeczy, które wymagają pracy i lekcji zdobytych podczas budowy.

Podczas tworzenia tego projektu napotkałem wiele problemów z radzeniem sobie z dużymi liczbami, więc jeśli planujesz zmodyfikować kod, pamiętaj o tym. W języku C wpisywanie zmiennych jest bardzo ważne - liczba nie zawsze jest tylko liczbą. Na przykład, bez znaku długo zmienne powinny być używane do przechowywania bardzo dużych liczb, takich jak mamy do czynienia w przypadku milisekund, ale nawet liczby tak małej jak 60 000 nie można zapisać jako zwykłej liczby całkowitej (bez znaku int byłby do przyjęcia dla 68 000). Chodzi o to, przeczytaj o swoich typach zmiennych gdy używasz dużych liczb, a jeśli znajdziesz dziwne błędy, to prawdopodobnie dlatego, że jedna ze zmiennych nie ma wystarczającej liczby bitów!
Znalazłem również problem z wyciekiem napięcia o bardzo niskiej jasności - co prowadzi do najmniejszej ilości emitowanego światła, nawet gdy digitalWrite (RED, 0) sygnał jest emitowany - nie sądzę, że jest to problem sprzętowy z paskami, ponieważ działają one dobrze z oficjalnymi kontrolerami. Jeśli ktoś mógłby rozwiązać ten problem, na zdjęciu poniżej, byłbym bardzo wdzięczny. Próbowałem ściągnąć rezystory i ograniczać napięcie wyjściowe z pinów Arduino. Być może będę musiał dodać prosty obwód przełączający zasilanie, aby dostarczać napięcie do paska LED tylko wtedy, gdy jest to rzeczywiście potrzebne; lub mogą to być wadliwe tranzystory MOSFET.

Do przyszłych prac mam nadzieję dodać odbiornik podczerwieni i zduplikować niektóre funkcje oryginalnego kontrolera - w przynajmniej możliwość zmiany kolorów jako światła ogólnego zastosowania, ponieważ teraz ten projekt zamienia pasek w dedykowaną noc lekki. Mogę nawet dodać automatyczną funkcję 30-minutowego limitu czasu.
Próbowałeś tego, wprowadziłeś ulepszenia lub masz inne pomysły? Daj mi znać w komentarzach!
James ma licencjat z zakresu sztucznej inteligencji i jest certyfikowany przez CompTIA A + i Network +. Jest głównym programistą MakeUseOf i spędza wolny czas grając w paintball VR i gry planszowe. Buduje komputery od dziecka.