Zegar DS1307

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.

DS1307

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.