Zegar czasu rzeczywistego (w tym przypadku DS1307) jest jednym z najbardziej powszechnych modułów używanych przy Arduino. Dzięki niemu możliwe jest budowa wielu urządzeń które działają w systemie dobowym (zegary, sterowanie oświetleniem i tym podobne).
Zaczynając zabawę z Arduino prędzej czy później natkniecie się na któryś z modułów czasu rzeczywistego (ds1307 czy to DS3231 lub inne). Zegar w dość dużym stopniu ułatwia budowę niektórych systemów, których działanie jest uwarunkowane porami dnia. Oczywiście można takie rzeczy robić za pomocą liczników czy funkcji delay jednak w przypadku braku prądu te wartości mogą się przesunąć.
Na szczęście zegary czasu rzeczywistego (RTC) dzięki wbudowanej baterii są w pewnym stopniu odporne na zaniki zasilania. Po jego powrocie godzina oraz data zostają ponownie wczytane do programu. Podłączenie modułu zegara do arduino jest bardzo prosty. Dzięki użyciu magistrali I2C wystarczą 4 kable i podłączenie ich do wyjść 5V, GND, A4(SDA) oraz A5(SCL). To połączenie pokazuje poniższy schemat.
W związku z tym, iż jest to urządzenie działające w magistrali I2C mogą się pojawić problemy z adresem urządzenia. W większości przypadków jest to adres podany w skrypcie poniżej (0x68). Jeśli z jakichś powodów skrypt nie będzie działał warto sprawdzić adres zegara. Jak to zrobić opisywałem w artykule o adresacji modułów I2C. Znajduje się tam także skrypt do wyszukania adresu.
Implementacja skryptu
Wgrywanie ustawień zegara oraz skryptu który ma później działać w tym przypadku działa dwuetapowo.
Pierwszym krokiem jest pobranie programu oraz bibliotek dostępnych tutaj. Kolejnym krokiem jest wgranie poniższego skrypt (został on okrojony do absolutnego minimum). W programie ustawiamy tylko i wyłącznie minuty i godziny. Wystarczą one one zupełnie do prawidłowego działania programu w cyklu dobowym.
#include <Wire.h> #include <DS1307.h> #define DS1307_ADDRESS 0x68 //adres zegara void setup() { Wire.begin(); RTC.stop(); RTC.set(DS1307_MIN,00); //MINUTY RTC.set(DS1307_HR,00); //GODZINY RTC.start(); } void loop() { // http://mn-tech.pl // https://www.youtube.com/user/mntechpl // https://www.facebook.com/mntechpl }
Jak widać sam skrypt do ustawienia daty jest bardzo mały. Służy on tylko i wyłącznie do ustawienia czasu. Aby odczytać dane z zegara należy użyć drugiego skryptu – wyświetla on na monitorze szeregowym aktualną godzinę i minuty.
#include <Wire.h> #include <DS1307.h> #define DS1307_ADDRESS 0x68 //adres zegara int GODZ; int MIN; int SEC; void setup() { Wire.begin(); Serial.begin(9600); //serial port RTC.stop(); RTC.start(); } void loop() { GODZ = (RTC.get(DS1307_HR,true)); //godzina pobierana z RTC MIN = (RTC.get(DS1307_MIN,true)); //minuta pobierana z RTC SEC = (RTC.get(DS1307_SEC,true)); //sekundy pobierana z RTC Serial.print(GODZ); Serial.print(":"); Serial.print(MIN); Serial.print(":"); Serial.println(SEC); delay(1000); // http://mn-tech.pl // https://www.youtube.com/user/mntechpl // https://www.facebook.com/mntechpl }
Po wgraniu drugiego skryptu po włączeniu monitora szeregowego na ekranie wyświetli się aktualna godzina ustawiona w zegarze. Jeśli godzina nie została wprowadzona poprawnie (błędy skyptu itp.) albo urządzenie jest źle podpięte (pomylone piny SDA i SCL) pojawi się godzina 45:85. W takim przypadku warto sprawdzić wszystkie połączenia. Może się też tak zdarzyć że pomimo tego że wszystko jest poprawnie podpięte coś nie działa – wtedy warto sprawdzić także czy kable połączeniowe nie są uszkodzone. Są one dość delikatne i nie potrzeba dużo siły, żeby je uszkodzić.
Zdarzają się także sporadycznie fabrycznie uszkodzone modele – rzadko ale jednak. Więc zanim zaczniecie narzekać że skrypt jest zły – wyeliminujcie wszystkie inne opcje.
Termometr DS18b20 w module DS1307
Niektóre modele (jak np. ten z rysunku na górze) mają dodatkowe złącze opisane jako DS – jest to wyjście przeznaczone na podpięcie termometru cyfrowego DS18b20. Termometr został opisany w tym artykule. Dzięki takiemu rozwiązaniu montując moduł w obudowie możemy bez większych problemów monitorować temperaturę urządzenia.