Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Potrzebowałem zegara, który pomógłby moim czteroletnim bliźniakom nauczyć się spać trochę dłużej (mam dość wstawania o 5:30 rano w soboty), ale nie potrafią jeszcze odczytać godziny. Po przejrzeniu kilku przedmiotów na bardzo popularnej stronie z zakupami pomyślałem: „Jak trudno byłoby po prostu zrobić jeden?!”
Oto, czego chciałem w tym projekcie. Wykorzystałby kilka diod LED RGB (głównie dlatego, że mam ich około pięćdziesięciu z innego projektu), aby wyświetlić trzy różne kolory. Czerwony oznaczałby powrót do snu, jest za wcześnie, by się obudzić. Żółty oznaczałby, że mogą wstać i cicho bawić się w swoim pokoju. Zielony oczywiście oznacza, że możesz wstać. Chciałem też mieć możliwość dostosowania czasu, ponieważ chciałbym spać dłużej w niektóre dni (weekendy/święta vs. dni powszednie itp.).
Kieszonkowe dzieci
Raspberry Pi Zero W
Dwie diody LED RGB
Sześć rezystorów 220 Ohm
Pliki (.stl, python, html) znalezione tutaj
Różne małe śrubki, druty i małe części w razie potrzeby.
Krok 1: Drukowanie 3D
Moja córka naprawdę lubi jednorożce, więc w tym projekcie zremiksowałem Unicorn Nightlight Riven02, który jest remiksem Unicorn Trophy Apachcreation, który można znaleźć na Thingiverse.com i używać na licencji Creative Commons Non-Commercial. Zmodyfikowałem podstawę jednorożca, aby pasował do kabla zasilającego do raspberry pi zero. Tak się złożyło, że leżało trochę AMZ3D Red PLA, więc podstawa i głowa jednorożca będą czerwone. Do klaksonu użyłem przezroczystego/przezroczystego PLA. Pliki.stl i ustawienia, których użyłem to:
Jednorożec.stl
- Wysokość warstwy: 0,02
- Grubość ścianki: 0,8
- Liczba linii ściany: 2
- Wypełnienie: 15%
- Wzór wypełnienia: siatka
UnicornBase.stl
- Wysokość warstwy: 0,02
- Grubość ścianki: 0,8
- Liczba linii ściany: 2
- Wypełnienie: 15%
- Wzór wypełnienia: siatka
Horn.stl
- Wysokość warstwy: 0,02
- Grubość ścianki: 0,8
- Liczba linii ściany: 3
- Wypełnienie: 0
Krok 2: Obwód
Obwód jest dość łatwy. Wybrałem sześć różnych pinów GPIO do sterowania włączaniem/wyłączaniem różnych kolorów RGB. Te piny i odpowiadające im kolory LED to:
- Pin 11 do RGB 1 CZERWONY
- Pin 13 do RGB 1 ZIELONY
- Pin 15 do RGB 1 NIEBIESKI
- Pin 16 do RGB 2 CZERWONY
- Pin 18 do RGB 2 ZIELONY
- Pin 36 do RGB 2 NIEBIESKI
- Pin 39 do uziemienia
Każdy pin jest podłączony do rezystora przez rezystor ograniczający prąd 220 omów (oczywiście z wyjątkiem masy). Rezystor wlutowałem w linię i pokryłem rurką termokurczliwą.
Krok 3: Przygotowanie Raspberry Pi
Chciałem mieć możliwość ustawienia czasu zegara trenera snu za pomocą interfejsu internetowego. Musiałem więc skonfigurować serwer Apache i PHP na Raspberry Pi. Pierwszą rzeczą, którą powinieneś zawsze zrobić podczas instalowania nowego oprogramowania na Raspberry Pi, jest upewnienie się, że jest ono aktualne, wpisując:
aktualizacja sudo apt-get
Po tym możemy naprawdę zabrać się do pracy. Zrobimy to, instalując Apache2:
sudo apt-get zainstaluj apache2 -y
powinno to zainstalować serwer WWW Apache. Możesz to przetestować za pomocą przeglądarki na Raspberry pi i przechodząc do:
hostlokalny/
lub przechodząc z przeglądarki innego komputera na adres IP Raspberry Pi. Aby znaleźć swój adres IP, wpisz:
nazwa hosta -I
Wykonanie tych czynności doprowadzi do domyślnej strony serwera WWW Apache. Można to zmienić zastępując index.html znajdujący się w katalogu /var/www/html/. Można go zastąpić moim własnym plikiem index.html.
Następnie skonfigurujemy serwer WWW Apache, aby móc uruchamiać pliki PHP. Zacznij od wpisania:
sudo apt-get zainstaluj php libapache2-mod-php -y
powinieneś być teraz w stanie umieścić plik sleepset.php w /var/www/html razem z plikiem index.html.
Aby przejść do tej strony we własnej sieci, musisz skonfigurować Raspberry Pi ze statycznym adresem IP (lub możesz po prostu spróbować ustalić nowy adres IP, gdy twoja sieć odnawia się od czasu do czasu). Aby to zadziałało, musisz edytować kilka plików. Musisz edytować plik /etc/dhcpcd.conf w następujący sposób:
interfejs wlan0
statyczny adres_ip=192.168.1.routery statyczne=192.168.1.1 statyczny serwer_nazw_domeny=192.168.1.1
Zastąp informacjami o swojej sieci. Jedyne, co musisz teraz zrobić, to zrestartować komputer.
ponowne uruchomienie sudo
Umieszczenie plików z linku do Dysku Google powinno wyglądać następująco:
- index.html i sleepset.php należy umieścić w katalogu /var/www/html
- sleepset.txt i sleeptrainer1_1.py należy umieścić w katalogu /home/pi/pythoncode (wskazówka: będziesz musiał utworzyć ten katalog)
Po umieszczeniu tych plików we właściwym katalogu, plik rc.local musi zostać zmodyfikowany, aby uruchomić program sleeptrainer1_1.py podczas uruchamiania. Aby zmodyfikować plik rc.local, będziesz potrzebować dostępu na poziomie root, więc wpisz:
sudo nano /etc/rc.local
W edytorze przewiń w dół i tuż przed linią wyjścia 0 dodaj:
python /home/pi/pythoncode/sleeptrainer1_1.py &
Należy tutaj pamiętać o dwóch rzeczach:
- Użyj bezwzględnej ścieżki do pliku, aby LINUX nie myślał, że plik sleeptraner1_1.py znajduje się w tym samym katalogu co rc.local.
- Nie zapomnij o znaku & (&) na końcu. pozwoli to LINUXowi na uruchomienie tego pliku w tle i kontynuowanie uruchamiania.
Teraz zapisz plik, wpisując ctrl-x, a następnie y, gdy pojawi się monit o zapisanie, a następnie ENTER.
Następnie wpisz sudo reboot.
W tym miejscu należy wspomnieć, że (co najmniej) należy zmienić hasło do Raspberry Pi za pomocą polecenia passwd. Jeśli jeszcze tego nie zrobiłeś, teraz byłby dobry moment.
Krok 4: Kodeks
Poniżej znajduje się kod z pliku sleeptrainer1_1.py. Użyłem obiektu datetime do porównania czasów z odczytanymi w pliku sleepset.txt. Plik tekstowy to po prostu dwie linie, pierwsza godzina, druga minuta. sleeptrainer1_1.py śpi przez jedną minutę między iteracjami pętli, aby nie blokować procesora. Zielone światło początkowo wychodziło zbyt jasno, więc użyłem modulacji szerokości impulsu, aby je przyciemnić, gdy użyłem czerwonego, aby uzyskać żółty.
Kod w Pythonie:
importuj RPi. GPIO jako GPIO
from datetime import datetime as dt import time GPIO.setmode(GPIO. BOARD) GPIO.setwarnings(False) red1 = 11 red2 = 16 green1 = 13 green2 = 18 blue1 = 15 blue2 = 36 GPIO.setup(red1, GPIO. OUT) GPIO.setup(red2, GPIO. OUT) GPIO.setup(green1, GPIO. OUT) GPIO.setup(green2, GPIO. OUT) GPIO.setup(blue1, GPIO. OUT) GPIO.setup(blue2, GPIO. OUT) p1 = GPIO. PWM(zielony1, 100) p2 = GPIO. PWM(zielony2, 100) def readset(): setfile = open("/home/pi/pythoncode/sleepset.txt", 'r') a = setfile. readline() b = setfile.readline() a = int(a) b = int(b) return a, b def ledlight(color): if (color == "red"): GPIO.output(red1, GPIO. HIGH) GPIO.output(red2, GPIO. HIGH) p1.stop() p2.stop() GPIO.output(blue1, GPIO. LOW) GPIO.output(blue2, GPIO. LOW) elif (kolor == "niebieski"): GPIO.output(czerwony1, GPIO. LOW) GPIO.output(czerwony2, GPIO. LOW) p1.stop() p2.stop() GPIO.output(niebieski1, GPIO. HIGH) GPIO.output(niebieski2, GPIO. HIGH) elif (kolor == "zielony"): GPIO.output(red1, GPIO. LOW) GPIO.output(red2, GPIO. LOW) p1.start(100) p2.start(100) GPIO.output(blue1, GPIO. LOW) GPIO.output(niebieski2, GPIO. LOW) elif (kolor == "żółty"): p1.start(60) p2.start(60) GPIO.output(czerwony1, GPIO. HIGH) GPIO.output (czerwony2, GPIO. HIGH) GPIO.output(niebieski1, GPIO. LOW) GPIO.output(niebieski2, GPIO. LOW) elif (kolor == "off"): GPIO.output(czerwony1, GPIO. LOW) GPIO.output (czerwony2, GPIO. LOW) GPIO.output(niebieski1, GPIO. LOW) GPIO.output(niebieski2, GPIO. LOW) p1.stop() p2.stop() while True: settime = readset() godzina, minuta = settime if minuta == 0: if dt(dt.now().rok, dt.now().miesiąc, dt.now().dzień, godzina-2) < dt.now() < dt(dt.now(.rok, dt.now().miesiąc, dt.now().dzień, godzina-1, minuta+30): ledlight("czerwony") elif dt(dt.now().year, dt.now().miesiąc, dt.now().dzień, godzina-1, minuta+30) < dt.now() < dt(dt.now().rok, dt.now().miesiąc, dt.now().dzień, godzina, minuta): ledlight("żółty") elif dt(dt.now().rok, dt.now().miesiąc, dt.now().dzień, godzina, minuta) < dt.now() < dt(dt.now().rok, dt.now().miesiąc, dt.now().dzień, godzina+1, minuta): ledlight("zielony") else: ledlight("off") elif dt(dt.now().rok, dt.now().miesiąc, dt.now().dzień, ho ur-2) < dt.now() < dt(dt.now().rok, dt.now().miesiąc, dt.now().dzień, godzina, minuta-30): ledlight("czerwony") elif dt(dt.now().rok, dt.now().miesiąc, dt.now().dzień, godzina, minuta-30) < dt.now() < dt(dt.now().rok, dt.now().month, dt.now().day, hour, minute): ledlight("żółty") elif dt(dt.now().year, dt.now().month, dt.now().dzień, godzina, minuta) < dt.now() < dt(dt.now().rok, dt.now().miesiąc, dt.now().dzień, godzina+1, minuta): ledlight("zielony") else: ledlight("off") time.sleep(60)
Plik index.html jest podstawowym formularzem zaprojektowanym w HTML. Pobiera zawartość dwóch pól tekstowych i przekazuje je do pliku sleepset.php w celu obsługi formularzy. Plik PHP po prostu nadpisuje plik sleepset.txt zaktualizowanymi danymi.
Krok 5: Składanie wszystkiego razem
Po zakończeniu kodowania i wydrukowaniu wszystkich części nadszedł czas na montaż. Postępowałem zgodnie z następującymi krokami, aby złożyć to wszystko razem:
- Wywierć dwa małe otwory wielkości diod LED RGB w dolnej części tuby i umieść diody LED w tych otworach.
- Włóż róg do otworu w głowie jednorożca i przeciągnij go, aż będzie szczelny. Użyj kleju od wewnątrz, aby zabezpieczyć klakson.
- Przymocuj Raspberry Pi Zero W do wnętrza głowy jednorożca. (przy użyciu pistoletu do klejenia na gorąco Maybe)
- Przymocuj głowę jednorożca do podstawy jednorożca.
- Podłącz przewód zasilający i przymocuj cały zestaw do ściany.
- Podłącz zegar.
W tym momencie mam działający Zegar Trenera Snu Dzieci.
Krok 6: Rok później…
Rok później:
Moje dziewczynki śpią trochę dłużej. Przyzwyczailiśmy się, że małe dzieci w naszym pokoju budzą się i mówią: „Tato, światło jest zielone”. i to jest świetne. Krótko mówiąc, budzimy się dopiero o 5:30 w sobotę, kiedy już to planujemy.
Rzeczy, które planuję poprawić w przyszłości:
- Może dodanie czujników lub innych elementów, takich jak mikrofon i głośniki.
- Może zmodyfikuj kod, aby działał z głośnikiem, który będzie używany jako budzik, ponieważ moje dzieci niedługo zaczną chodzić do szkoły.