Projekt Arduino Night Light i Sunrise Alarm

  • Joseph Goodman
  • 0
  • 714
  • 72
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. Dziś wykonamy 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 wykonanie budzika o wschodzie słońca jest dla Ciebie trochę za dużo, sprawdź te aplikacje na iPhone'a i Androida. Użyj tych aplikacji, aby pomóc Ci lepiej spać [Android i iOS]. Użyj tych aplikacji, aby pomóc Ci lepiej spać [Android i iOS]. dzień, najlepszą rzeczą, jaką możesz zrobić, to uzyskać korzystną ilość snu. Zawsze pojawiają się nowe badania, które dowodzą, jak ważny jest sen dla osoby, poprawiając… które wykrywają, kiedy najlepiej obudzić cię ruchami ciała. Czy aplikacja naprawdę może pomóc ci lepiej spać? 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ą… zapewniające, że nie zostaniesz oderwany od tego niesamowitego snu, ale zamiast tego obudź się, czując się jasny i wypoczęty - 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ą tranzystorów MOSFET N. Konfiguracja tej części będzie identyczna z dynamicznym systemem oświetlenia Zbuduj własne dynamiczne oświetlenie otoczenia dla centrum multimedialnego Zbuduj własne dynamiczne oświetlenie otoczenia dla centrum multimedialnego Jeśli oglądasz dużo filmów na komputerze lub centrum multimedialnym, jestem na pewno napotkałeś dylemat oświetlenia; czy całkowicie wyłączasz wszystkie światła? Czy utrzymujesz je w pełnej krasie? Lub… budował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 to zrobili “zegar czasu rzeczywistego” chip, aby zrobić to bardziej niezawodnie. Alarm wschodu słońca uruchomi się 30 minut przed czasem budzenia i będzie powoli zwiększać poziom wyjściowy, aż osiągnie 100% jasności - to powinno wystarczyć, aby nas obudzić, chociaż dobrym pomysłem jest używanie zwykłego budzika, dopóki ciało nie osiągnie przyzwyczajony do tego.

Będę również włączać lampkę nocną do tego projektu, który wykrywa ruch i aktywuje dyskretne światło niskiego poziomu pod łóżkiem z 3-minutowym czasem oczekiwania, oddzielnie od lamp LED, ponieważ spowodowałyby to, że moja żona i ja obudzilibyśmy się . 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 prądem zmiennym o napięciu 110-240 V (i jest to ogólnie dobrą zasadą), podłącz bezprzewodowy nadajnik 433 MHz z gniazdami przełączającymi, jak opisano w projekcie automatyki domowej Raspberry Pi Arduino Przewodnik automatyki domowej z Raspberry Pi i Arduino Przewodnik automatyki domowej z Raspberry Pi i Arduino Rynek 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… .

Lista części i schemat

  • Arduino
  • Zestaw lamp 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ł zostać oceniony na napięcie - 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, który 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 przełą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 styku 13, jest to, że podczas procesu wysyłania wbudowana dioda LED odpala szybko po kolei, sygnalizując aktywność szeregową, co spowodowałoby również aktywację przekaźnika.

Właściwy czas

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, zamierzam 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 z obszarów, 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 nasze bieżąceMillis są takie same każdego dnia currentMinutes = (currentMillis / 1000) / 60;  

Funkcja nocnego światła

Pętle główne podzieliłem 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ło zresetowane (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 zbyt wrażliwe na światło niebieskie (który akurat jest kolorem, którego używam do światła nocnego) i trudne do właściwej kalibracji. 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ś, ale podłączenie go nie jest trudne - znajdziesz 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 spowoduje co najmniej 5 sekund “na” stan z czujnika. Określa jednak również opóźnienie między stanami aktywnymi - więc jeśli upłynie 5 sekund i nie zostanie wykryty żaden ruch, czujnik wyśle ​​niski sygnał przez co najmniej 5 sekund, nawet jeśli w tym okresie wystąpi ruch. 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 dla 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 < 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);   

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 powinno być zwiększane o każdą sekundę, dzięki czemu jest w pełni jasna po 30 minutach; następnie zwielokrotnia to przez tyle sekund, ile wynosi obecnie wschód słońca. Jeśli jest już na pełnej jasności, pozostaje włączony przez kolejne 10 minut, aby upewnić się, że nie śpisz (a jeśli nadal nie wstaniesz, prawdopodobnie powinieneś mieć włączony alarm zapasowy).

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 zwiększania, zapisz bieżącą wartość przyrostu jasności w minutach X, jeśli (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);    

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 związanych 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, aby przeczytać o 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 bardzo niskimi wyciekami napięcia - prowadzącymi 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 ograniczyć 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łej pracy mam nadzieję dodać odbiornik podczerwieni i zduplikować niektóre funkcje oryginalnego kontrolera - przynajmniej możliwość zmiany kolorów jako światła ogólnego zastosowania, ponieważ teraz ten projekt zamienia pasek w dedykowaną noc światło. 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!




Jeszcze bez komentarzy

O nowoczesnej technologii, prostej i niedrogiej.
Twój przewodnik w świecie nowoczesnych technologii. Dowiedz się, jak korzystać z technologii i gadżetów, które nas otaczają każdego dnia i dowiedz się, jak odkrywać ciekawe rzeczy w Internecie.