Po krótkiej przerwie przyszedł czas, na ostatnią już część nieco przydługiego cyklu o zegarku. Troszkę mnie poniosło i rozpisałem się o nim na 5 artykułów, a chciałbym Wam jeszcze pokazać przynajmniej jeden mój INNY projekt, wiec dziś zepnę się w sobie i postaram jak najmniej przynudzać.
Ja sam tytuł wskazuje zegar miał być z bajerami, no to będzie. Na razie mamy samą matrycę, no jak już wspomniałem w poprzednim wpisie za moment podłączymy moduł zegara czasu rzeczywistego. Mimo, że to prosty układzik, zdecydowałem się na gotowy moduł, który wygląda tak:
Drabinkę goldpinów przylutowałem sam, dlatego tak krzywo :D
Używać będziemy tylko 4 z nich:
- SCL -> Arduino pin ANALOG5
- SDA -> Arduino pin ANALOG4
- GND -> Arduino GND
- VCC -> Arduino 5V
Jak już wspominałem w poprzedniej części układ DS1307 komunikuje się ze światem przy pomocy dwukierunkowej magistrali I2C, która ze względów patentowych nazywa się w Arduino TWI (Two Wire Interface). Mamy gotową bibliotekę do komunikacji poprzez ten interfejs, która nazywa sie Wire.h. A do komunikacji z samym układem zegara wykorzystamy bibliotekę RTClib, pobraną ze strony: https://github.com/adafruit/RTClib. (Bibliotekę trzeba pobrać, i rozpakować do katalogu …/Moje Dokumenty/Arduino/libraries/ i zrestartować Arduino IDE)
No to kodujemy, czyli to co tygryski lubią najbardziej ;)
Jak widać obsługa układu zegara czasu rzeczywistego jest banalnie prosta. Myślę, że nie wymaga chyba żadnego dodatkowego omówienia. Może tylko wspomnę, że czas jest na sztywno ustawiany w trakcie kompilacji poleceniem:
Gdyby zegar się rozregulował, albo co bardziej prawdopodobne skończyła się bateryjka i będziemy zmuszeni znów ustawić prawidłowy czas – programujemy układ od nowa. Mało to wygodne – wiem, może w wersji 1.1 pomyślę o jakimś sprytnym ustawianiu czasu bez użycia komputera.
No to sprawę czasy mamy niejako z głowy, to teraz pozostał czas na tytułowe BAJERY.
Jak pewnie zauważyliście, prócz funkcji wyświetlającej godzinę, mamy także w kodzie funkcję wyświetlania daty, której do tej pory nie wykorzystaliśmy. Początkowo pomyślałem sobie, że będę wyświetlał datę co minutę na jedną sekundę, a to bez sensu. Znając życie zawsze jak chciałbym sprawdzić godzinę to akurat wyświetlałaby się data, i odwrotnie. Więc trzeba zrobić jakiś “kontroler”.
Jako że zegar ma docelowo stać na dosyć wysokim regale, przycisk też byłby mało wygodny. Sięgnąłem do “szuflad” i znalazłem:
Ultradźwiękowy czujnik odległości. Wykorzystam go sobie jako kontroler :D Wystarczy stanąć przed regałem i “pomachać do zegarka”, aby pokazał datę.
Jak to działa?
Jak prosty sonar. Po podaniu stanu wysokiego (trwającego przynajmniej 10us) na pin oznaczony Trig (TRIGGER), układ wystrzeliwuje przed siebie ultradźwiękową wiązkę o częstotliwości 40 kHz, po czym przełącza stan pinu ECHO na stan wysoki. Po “usłyszeniu” przez układ echa odbitego od przeszkody sygnału, stan ten przełączany jest na niski. Zatem czas trwania impulsu na wyjściu ECHO, jest proporcjonalny do odległości od przeszkody. Według danych producenta (http://www.robot-electronics.co.uk/htm/srf05tech.htm) wystarczy długość impulsu podzielić przez 58 aby otrzymać odległość w centymetrach.
Cała procedura pomiaru będzie zatem wyglądać mniej więcej tak:
Pojawiła się nam tutaj nowa funkcja:
unsigned long pulseIn(numer_pinu, poziom_impulsu, timeout);
Funkcja zwraca w mikrosekundach długość trwania impulsu na pinie podanym jako pierwszy parametr. Drugi parametr może przyjmować wartości HIGH/LOW i mówi funkcji czy mierzymy długość trwania stanu wysokiego/niskiego. Timeout to czas (w mikrosekundach) po jakim funkcja przestaje nasłuchiwać i zwraca zero.
Dlaczego w naszym przykładzie ustawiłem timeout na 29ms? Ponieważ czujnik SFR-5 ma sprzętowy timeout po 30ms po którym sam “wygasi” wysoki sygnał na pinie ECHO, więc nie ma sensu nasłuchiwać dłużej.
Zanim przejdziemy do podłączania czujnika do zegara, jeszcze jeden “bajer”. W przepastnych czeluściach szuflad znalazłem też takie cudo, które oczywiście zaraz podłączymy do zegara:
To czujnik temperatury i wilgotności powietrza. Kosztował jakieś 8 peelenów i niestety okazał się być nieco “niestabilny”. Czasem wariuje. Jakieś 80% czasu działa, pozostałe 20% czasu pokazuje bzdury. Może trafił mi się jakiś wadliwy. Przy okazji kolejnych zakupów wymienię na mniej chiński :D
Do jego obsługi możemy wykorzystać gotową bibliotekę DHT11.h (http://playground.arduino.cc/Main/DHT11Lib), a sama procedura obsługi jest znów niezwykle prosta. Podam najprostszy przykład:
Oczywiście, my nie będziemy odczytywać w głównej pętli loop, tylko napiszemy sobie specjalną funkcję. No to chyba najwyższy czas podłączyć bajery do Arduno i rozbudować kod o obsługę czujników:
No i mamy gotowy zegar! Efekt wygląda tak:
I w zasadzie to już prawie koniec. Tyle, że żeby postawić mój projekt w ostatecznej wersji na półce musiałbym tam wpakować moje jedyne Arduino! Co to to nie. Zatem musiałem polutować sobie osobną płytkę pod atmegę z gotowymi gniazdami na peryferia i modułem zasilania. Efekt poniżej:
Jedynym wolnym prockiem jakim dysponowałem była Atmega328PU. Prawie taki sam jak w Arduino Uno. Ale okazało się, że Arduino IDE nie chciało współpracować i już przy próbie wgrania bootloadera powiedziało, że nie zgadza mu sie sygnatura układu. Znów poszukałem po internetach i okazało się, że wystarczy na chwilę podmienić w pliku avrdude.conf wpis:
na
i wszystko elegancko się wgrywa i działa bez zarzutu. Zaprogramowałem układ, powpinałem czujniki, poskładałem całość w prowizoryczną kupkę, podłączyłem do prądu i efekt ostateczny wygląda tak:
GOTOWE.
Do zrobienia jeszcze:
- wymienić czujnik temperatury na lepszy
- jakaś zgrabniejsza obudowa
- dodać obsługę drugiego czujnika temperatury (zewnętrznego za okno)
- dodać możliwość ustawianiu czasu i daty bez użycia programatora.
Gratuluję wszystkim którzy dzielnie dotrwali do końca tego cyklu. Mam nadzieję, że tych, którzy nie mieli wcześniej do czynienia z podobnymi projektami zainteresowałem i przekonałem, że nie taki diabeł straszny. A tych dla których nie było to nic nowego, zachęciłem do zrobienia ambitniejszych projektów. Dzięki za wszystkie komentarze i konstruktywną krytykę. Do znów :)
Kolejny solidnie napisany post ;)
Dodać zgrabniejszą obudowę? na filmiku i fotkach nie widzę żadnej obudowy ;p
ajtam ajtam – jest taka czerwona szybka i filcowe nóżki od mebli :D
Super projekt! Oby takich więcej!
Błąd w przykładzie użycia biblioteki DHT11 – dwa razy odczytujesz temperaturę.
A gdzie dokładnie?? Bo jeżeli chodzi Ci o odczyt w funkcji mStart – to jest on tam dany celowo. Czujnik szybciej “załapuje” jak go odpytam przy starcie urządzenia.
już znalazłem – faktycznie był :D dziękuje za spotrzegawczość !
spoko ;)
tez uzywam tej biblioteki… tylko ja buduje system zdalnych bezprzewodowych czujnikow temp/wilg z prezentacja w cosm (albo na czyms swoim – to jeszcze nie skonczone)
a jesli chodzi o pomysly – zrobilem kawalek kodu do zalaczania oswietlenia zewnetrznego domu ale o wschodzie i zachodzie slonca – aplikacja wylicza ten czas ze wspolrzednych geograficznych ;) i tez z uzyciem RTC. nie wiem tylko jeszce co zrobie przy zmianie czasu… niby podaje sie tam strefe czasowa, ale chyba sie samo nie zmieni ;)
niemniej nawet fajnie dziala :D
Dobry projekt. Pomyśl nad jakąś dobrą obudową, żeby się to ładnie prezentowało w przyszłości.
Naprawdę świetne poradniki + pomysł z wykorzystaniem matrycy LED.
Robię podobny projekt tylko, że z wykorzystaniem sześciu 7 segmentowych wyświetlaczy. Mam pytanie: RTC spóźnia Ci się? Bo ja nie mogę sobie z tym poradzić. Dziennie spóźnia mi się ok. 10-20 sek, więc w ciągu 3-5 dni już spóźnia mi się średnio minutę. Dla mnie ta dokładność jest nie do przyjęcia. Najpierw myślałem, że to wina baterii, ale układ jest zasilany bez przerwy Vcc.
W tej chwili nie widzę żadnych zauważalnych opóźnień. Ale zegar chodził maksymalnie około 3 dni bez wyłączania. Zobaczymy jak się będzie sprawował jak pochodzi dłużej. Będę meldował.
A układ RTC robiłeś sam, czy też masz gotowca?
Ten sam gotowiec co Ty – z DS1307 Z.
to poczekamy pare dni i zobaczymy – po napisaniu artykułu zegar wylądował z powrotem na regale i zanim nie dotrze nowy czujnik temp, nie zamierzam go zdejmować. Zdam raport czy trzyma czas.
Podobnie jak u Ciebie i u mnie są opóźnienia.
Około minuty na 3 dni. Ciekawe co jest przyczyną? Kwarc?
Może jakiś fachowiec się wypowie?
Ciekawe czy sa się to jakoś kompensować?
Programowo na pewno, ale sprzętowo?
bocianu mógł byś udostępnić wykaz wszystkich elementów do “atmegi” bo schemat dojdę po zdjęciach z góry dzięki =]
odwołuje, już znalazłem ;]
Szacuneczek dla umiejętności! Super gadżet. Dla mnie to czarna magia i podziwiam takich majsterkowiczów.
Pozdrawiam
Witam. Macie może jakiś pomysł jak zrobić zmianę czasu (np na letni) w DS1307
nie programując na nowo?
Wspaniałe, po przeczytaniu wszystkich artykułów uświadamiam sobie, że jestem niezdolnym i niekreatywnym kretynem;D 5/5