Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Zegar "wskazówkowy" LED na WS2812B z funkcją "ECO" (PIR)

Frog_Qmak 06 Jan 2016 20:56 12531 13
Optex
  • Zegar "wskazówkowy" LED na WS2812B z funkcją "ECO" (PIR) Zegar "wskazówkowy" LED na WS2812B z funkcją "ECO" (PIR)Zegar "wskazówkowy" LED na WS2812B z funkcją "ECO" (PIR)


    Witam Kolegów Elektrodowiczów.

    Jakiś czas temu, zainspirowany konstrukcją zegarów na diodach WS2812, postanowiłem spróbować zrobić coś takiego samemu. Konstrukcja powstała dla "cieszenia oczu" i własnej satysfakcji z takiego zegara. Sam projekt powstawał może ze 3 wieczory + poprawki ("wyjątki"), o których mowa później. Sama konstrukcja elektroniczna jest prosta, nie ma potrzeby rysowania schematu. Całość napędza klon Arduino nano, moduł zegara to DS1307 podpięty pod I2C. Diody to metrowa taśma WS2812B (60LED/m) z kondensatorem 470uF (w sumie chyba niepotrzebny, ale przylutowałem i został). Do tego czujka PIR HC-SR501, z której sygnał (stan wysoki) kierowany jest na wejście Arduino (równocześnie podpięte do masy przez rezystor 10k, aby przy stanie niskim nie działało jak antena i nie łapało zakłóceń).

    Co do zasady działania całego zegara. Zanim zabrałem się do pracy, miałem ściągnięte jakieś gotowe przykłady, ale sama idea wydawała się na tyle ciekawa, że postanowiłem napisać kod samemu. Pokrótce: diody są numerowane w zakresie 0 (u mnie godzina 12) do 59. Następnie odczytuje aktualny czas, przelicza go na trzy zmienne: godziny (w zakresie 0-12), minuty (0-60) i sekundy (0-60). Program ustala, w jaki sposób ma następować wyświetlanie. Można to rozwiązać na dwa sposoby:

    -(łatwy) "na sztywno" wyświetlać godzinę poprzez zapalenie odpowiednich diod dla danej godziny, przez co "wskazówka" nie porusza się (60:12 = 5, czyli np. dla godziny trzeciej wskazówka "pokazuje" 15-tą z kolei diodę, o numerze w kodzie 14.)
    -(trudniejszy) "ożywiając" wskazówkę godzinową tak, by przesuwała się ona, wraz z postępem danej godziny, podobnie jak ma to miejsce w prawdziwych zegarach.

    W moim przypadku zrealizowałem drugi wariant, całość jest w sumie dość prosta. Największy problem to "zakodowanie wyjątków", jak ja to nazwałem, czyli np. godziny 00.00 - powinny się wyświetlać nie tylko diody o numerach 0-3, ale również te "z drugiego końca", czyli 59 itp. Takich przypadków jest trochę, co zostało ujęte w programie. Bardzo ważna jest kolejność opisywania instrukcji zapalania LED-ów, ponieważ jedna komenda może nadpisać drugą, co czasami jest pożądane. Np. wskazówka godzinowa ma czerwoną barwę i "grubość" 5 led, minutowa i sekundowa odpowiednio 3 i 1. Są one uwzględnione w kodzie również w tej kolejności. Dzięki temu nawet po nałożeniu się wszystkich "wskazówek" (00:00), są one widoczne.

    Zegar po zmontowaniu cieszył oczy, jednak trochę żal było mi tego, że przez cały czas świeci się z maksymalną jasnością, nawet gdy nikogo nie ma w domu. Jako że miałem w zapasie kilka czujek ruchu, wykorzystałem jedną z nich. Przy uruchomieniu zegar wyświetla krótką "animację" (czujka musi się ustabilizować, bo zaraz po włączeniu daje stan wysoki), a następnie sprawdza, czy zostało wywołane świecenie z pełną jasnością. Jeżeli nie, to rozpoczyna pracę przy niskiej intensywności świecenia. Jeżeli czujka wykryje ruch, to zegar przechodzi w tryb maksymalnej jasności i "zapamiętuje", by po upływie godziny się przyciemnić. Jeżeli w czasie pełnego świecenia czujka znowu kogoś wykryje, nadpisuje czas włączenia trybu oszczędnego aktualnym. Dla własnej satysfakcji, zegar wyświetla, kiedy nastąpi przyciemnienie - jedna z diod świeci na biało i wskazuje miejsce, do którego musi dojść minutnik. Wykrycie kogoś sygnalizowane jest szybkim miganiem diody na płytce Arduino.

    Prośba do moderatorów: zegar jest już ukończony pod względem elektronicznym i programowym, nie planuję wprowadzać żadnych zmian, to też proszę o nieprzenoszenie go do działu "niedokończone". Brakuje mi jedynie obudowy i "tła" pod taśmę, co może jeszcze trochę potrwać. Zastanawiam się nad lustrem. Myślałem nad płytą winylową, niestety są one minimalnie zbyt małe. Gdyby ktoś miał jeszcze jakieś pomysły, chętnie wysłucham. :)
    Dodaję również kod, jest sporo komentarzy (pisałem po angielsku), także całość powinna nie sprawiać problemów przy analizie.

    Koszt: taśma LED z przesyłką ok 80 zł, czujka PIR jakieś 5 złotych + przesyłka. Klon Arduino to ok. 10 PLN z darmową wysyłką zza granicy (nie opłaca się w Polsce nawet Atmegi kupić :D ), płytka DS1307 z podtrzymywaniem bateryjnym i baterią ok. 7 zł, również z darmową wysyłką zza kontynentu.

    Zapraszam do komentowania.

    Przepraszam za jakość VIDEO - filmowane komórką. Pod koniec filmu widać, jak biała dioda "przesuwa się" na aktualną minutę w chwili, gdy wykonałem ruch.



    Cool? Ranking DIY
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
    About Author
    Frog_Qmak
    Level 25  
    Offline 
    Has specialization in: arduino, chemia, inżynieria przemysłowa
    Frog_Qmak wrote 1285 posts with rating 256, helped 5 times. Live in city Kraków. Been with us since 2007 year.
  • Optex
  • #2
    japko1024
    Level 18  
    Szkoda, że nie zaprogramowałeś Arduino w języku C - byłoby bardziej profesjonalnie i miałbyś większe możliwości programowania i optymalizacji, poznałbyś też zasady działania mikrokontrolera. Tu jest opisane, jak to zrobić: Link.
  • Optex
  • #3
    Freddy
    Level 43  
    japko1024 wrote:
    Szkoda, że nie zaprogramowałeś Arduino w języku C - byłoby bardziej profesjonalnie
    To w jakim według Ciebie języku napisany jest teraz program?
  • #4
    Olgierd
    Level 15  
    Witam,
    przemyślenia/propozycje
    -kolory wprowadzają zamieszanie, kolor do ustawienia przez użytkownika ze względu na otoczenie, (kolor farby którą pomalowana jest ściana).
    -soczewki, minuty rzut światła na ścianie cienki i długi, godzina rzut światła gruby i krótki, sekundy bez znaczenia prędkość pozwala każdemu domyśleć się o co chodzi.
    -przyznam że pomysł mi się spodobał (nie widziałem wcześniej takiego zegara) i nie mogę stwierdzić która wersja by mi się bardziej leżała ale proszę sprawdzić obie, diody skierowane do środka i diody skierowane na zewnątrz.
    -poprzestał bym tylko na widoku odbicia światła od ściany/podłoża (tj. źródło świata/diodę bym schował).
  • #5
    Frog_Qmak
    Level 25  
    Dzięki za propozycję, faktycznie, widziałem już gdzieś taki projekt, w którym widoczna była tylko tarcza i światło "wypływało" spod spodu. Nie wiem tylko, jak to się sprawdzi latem przy jasnym oświetleniu.

    Dziękuję również za ciekawego link-a :)

    EDIT: przepraszam durną muzyczkę w tle, ale jak nagrywałem filmik to dwa pokoje obok była puszczona głośno piosenka i ledwo wrzuciłem film na YT to zaraz dostałem maila, że łamię prawa autorskie i na szybko wybrałem jakąś zaproponowaną free-alternatywę;)
  • #6
    japko1024
    Level 18  
    Freddy wrote:
    japko1024 wrote:
    Szkoda, że nie zaprogramowałeś Arduino w języku C - byłoby bardziej profesjonalnie
    To w jakim według Ciebie języku napisany jest teraz program?

    Rzeczywiście, to jest język C, ale z zastosowaniem biblioteki Arduino, która z jednej strony ułatwia początkującym programowanie, ale z drugiej znacznie ogranicza ich możliwości. Znacie kogoś, kto zawodowo zajmuje się programowaniem mikrokontrolerów i pisze swoje programy z zastosowaniem środowiska i bootloadera Arduino? Czy taki ktoś byłby w stanie zaprogramować inny rodzaj procesora niż zastosowany w tej płytce? Chociaż nie jestem profesjonalistą, to od początku programuję mikrokontrolery w języku C korzystając z bibliotek takich, jak avr/io.h. Typowy program stworzony w ten sposób nie jest rozdzielony na sekcje setup i loop (wykonywanie nieskończonej pętli jest w dodatku rozwiązaniem niezbyt efektywnym ze względu na zużycie mocy obliczeniowej i elektrycznej, więc w miarę możliwości lepiej usypiać procesor i korzystać z przerwań), inaczej wygląda w nim odczyt i ustawianie rejestrów GPIO (osoba pisząca w arduino może nawet nie wiedzieć, co to są rejestry DDRx, PORTx i PINx), wreszcie plik z kodem źródłowym nie ma raczej rozszerzenia .ino, ino .c :D (zgodnie z językiem, w którym został napisany).
  • #7
    dondu
    Moderator on vacation ...
    Frog_Qmak wrote:
    Brakuje mi jedynie obudowy i "tła" pod taśmę, co może jeszcze trochę potrwać. Zastanawiam się nad lustrem. Myślałem nad płytą winylową, niestety są one minimalnie zbyt małe. Gdyby ktoś miał jeszcze jakieś pomysły, chętnie wysłucham :)

    Może płyta gipsowa, kuchenna deska do krojenia, ... wszystko zależy, gdzie ma wisieć.
  • #9
    Frog_Qmak
    Level 25  
    Dobry pomysł, kiedyś już popełniłem :) Link Problem w tym, żeby jakoś złączyć ze sobą dwa okrągłe lustra... prostokątna rama odpada :/
  • #12
    Freddy
    Level 43  
    Bierzesz kilka pasów cienkiej sklejki #3 smarujesz je wikolem i usztywniasz w wybranej pozycji do wyschnięcia.
    Ostre łuki, wymagają moczenia w wodzie, lub lepiej na parze (ja tak robiłem).
    Tektura jest mniej wskazana, ja używam wyłącznie sklejki.
  • #13
    ladamaniac
    Level 39  
    Technologia z tekturą jest podobna do tej, którą przestawił kolega Freddy, tylko zamiast sklejki używasz pasków tektury, takiej grubszej. Wikol może być lekko rozcieńczony wodą, pasowałby robić to na jakimś wzorcu.