Projekt zegara. Tematem projektu jest oparty na Arduino zegar pokazujący godzinę oraz datę. Aktualny czas należy wpisać na monitorze portu szeregowego po podłączeniu płytki. Godzina jest pokazywana mechanicznie na dwóch półokrąłych tarczach (godzinowej i minutowej) poprzez dwa serwomechanizmy obracające wskazówkami (minuta i godzina są konwertowane na kąt obrotu). Data wyświetla jest cyfrowo na wyświetlaczu ciekłokrystalicznym. Schemat ideowy Kod programu. #include <TimeLib.h> //odpowiada za przetrzymywanie daty w ludzkim formacie #include <Time.h> //potrzebna przy funkcji konwersji na czas epoch (struktura tmelements_t) #define TIME_HEADER "T" // tag poprzedzajacy wiadomosc z wpisanym czasem
#define TIME_REQUEST 7 // znak ktory zainicjuje zadanie (zadanie w sensie 'rzondanie', brak polskich znakow) synchronizacji (chyba dzwonek w ASCII, niewazne bo uzytkownik tego nie widzi, jest wpisywane przez program) #include <Servo.h> //serwomechanizm #include <LiquidCrystal.h> //LCD LiquidCrystal lcd(2, 3, 4, 5, 6, 7); Servo servo1; Servo servo2; int minuta; int godz; void setup() { lcd.begin(16,2); //wypisz komunikat na LCD lcd.setcursor(0,0); lcd.print("wprowadz czas"); lcd.setcursor(0,1); lcd.print("poprzedzony 'T '"); Serial.begin(9600); setsyncprovider(requestsync); //ustawia funkcje ktora bedzie synchronizowac czas (biblioteka TimeLib.h) Serial.println("Wpisz date: T RRRR MM DD gg mm ss"); servo1.attach(8); servo2.attach(9); pinmode(10, OUTPUT); //LED void loop() { if (Serial.available()) { //wlaczenie monitora portu szeregowego inicjuje synchronizacje czasu processsyncmessage(); if (timestatus()!= timenotset) { //jesli czas jest ustawiony, wykonaj
lcd.clear(); lcd.setcursor(0,0); lcd.print(day()); //wypisz dzien na LCD lcd.setcursor(3,0); if (month()==1) //wypisz miesiac na LCD (warunki okreslaja kolejne miesiace) lcd.print("stycznia"); if (month()==2) lcd.print("lutego"); if (month()==3) lcd.print("marca"); if (month()==4) lcd.print("kwietnia"); if (month()==5) lcd.print("maja"); if (month()==6) lcd.print("czerwca"); if (month()==7) lcd.print("lipca"); if (month()==8) lcd.print("sierpnia"); if (month()==9) lcd.print("wrzesnia"); if (month()==10) lcd.print("pazdziernika"); if (month()==11) lcd.print("listopada"); if (month()==12)
lcd.print("grudnia"); lcd.setcursor(0,1); lcd.print(year()); // wypisz rok na LCD godz=hourformat12(); //przypisz pod zmienna aktualna godzine w formacie 12h(biblioteka TimeLib.h) minuta=minute(); //przypisz pod zmienna aktualna minute (biblioteka TimeLib.h) int obrotmin=map(minuta, 0, 60, 180, 0); //przekonwertuj z minuty na kat obrotu (proporcja) servo2.write(obrotmin); //obroc serwo minutowe na dany kat int obrotgodz=map(godz,0, 12, 180, 15); //przekonwertuj z godziny na kat obrotu (proporcja) servo1.write(obrotgodz); //obroc serwo godzinowe na dany kat if (ispm()) //jesli godzina jest po poludniu (biblioteka TimeLib.h) zaswiec diode digitalwrite(10,high); else //jak jest przed poludniem, zgas diode digitalwrite(10,low); digitalclockdisplay(); // wyswietl godzine i date na monitorze portu szeregowego delay(1000); //odczekaj 1 sekunde void digitalclockdisplay(){ // funkcja wypisujaca czas i date na monitorze portu szeregowego Serial.print(hour()); printdigits(minute()); printdigits(second()); Serial.print(" "); Serial.print(day()); Serial.print(" "); Serial.print(month()); Serial.print(" ");
Serial.print(year()); Serial.println(); void printdigits(int digits){ // funkcja wypisujaca liczby oddzielone dwukropkiem (format czasu) Serial.print(":"); if(digits < 10) Serial.print('0'); Serial.print(digits); time_t tmconvert_t(int YYYY, byte MM, byte DD, byte hh, byte mm, byte ss){ //konwertuje wpisana date na czas epoch (unix timestamp, czas od 1970) tmelements_t tmset; tmset.year= YYYY-1970; tmset.month=mm; tmset.day=dd; tmset.hour=hh; tmset.minute=mm; tmset.second=ss; return maketime(tmset); void processsyncmessage() { //funkcja przetwarzajaca wpisana wiadomosc na monitorze portu szeregowego unsigned long pctime; const unsigned long DEFAULT_TIME = 1357041600; // ustawia domyslna date na 01.01.2013r. int YYYY; byte MM,DD,hh,mm,ss; if(serial.find(time_header)) { //jesli znajdzie w wiadomosci zadeklarowany tag (T), przypisuje pod zmienne odpowiednie wartosci daty i czasu
YYYY=Serial.parseInt(); MM=Serial.parseInt(); DD=Serial.parseInt(); hh=serial.parseint(); mm=serial.parseint(); ss=serial.parseint(); pctime=tmconvert_t(yyyy,mm,dd,hh, mm, ss); // konwertuje czas na epoch if( pctime >= DEFAULT_TIME) { // jesli czas jest wiekszy od 01.01.2013r. ustawia wpisany czas settime(pctime); time_t requestsync(){ //funkcja ktora odpowiada za zadanie synchronizacji czasu Serial.write(TIME_REQUEST); //wpisuje w monitorze portu szeregowego znak odpowiedzialny za zadanie synchronizacji czasu return 0;