Program Python:
Poniżej przejdę do opisu dwóch klas jedna ma za zadanie obsługę zegara systemowego, druga natomiast odpowiada za obsługę układu DS3231.
Klasa dla obsługi zegara systemowego:
- class SystemTimeDate:
- ###################################
- #get time and date
- def getTimeDate():
- now = datetime.datetime.now()
- timeDate = [now.second,
- now.minute,
- now.hour,
- datetime.date.weekday(now),
- now.day,
- now.month,
- now.year]
- #debug
- #print("getTimeDateFunc: %d:%d:%d %d %d/%d/%d" %(timeDate[2], timeDate[1],
- # timeDate[0], timeDate[3],
- # timeDate[4], timeDate[5],
- # timeDate[6]));
- return timeDate;
- ###################################
- #get only date
- def getDate():
- now = datetime.datetime.now()
- date = [datetime.date.weekday(now),
- now.day,
- now.month,
- now.year]
- #print("getDateFun: %d %d/%d/%d" %(date[0],date[1],date[2],date[3]));
- return date;
- ###################################
- #get only time
- def getTime():
- now = datetime.datetime.now()
- time = [now.second,
- now.minute,
- now.hour]
- #print("getTimeFun: %d:%d:%d" %(time[2], time[1], time[0]));
- return time;
- ###################################
- #get string with week day
- def getWeekDay():
- weekDay = [ "Poniedziałek",
- "Wtorek",
- "Środa",
- "Czwartek",
- "Piątek",
- "Sobota",
- "Niedziela"];
- now = datetime.datetime.now()
- weekDayNumber = datetime.date.weekday(now)
- retWeekDay = weekDay[weekDayNumber]
- return retWeekDay
Pierwsze trzy funkcje od góry zajmują się pobieraniem daty oraz czasu, kolejna daty, następna czasu. Ostatnia funkcja zamienia dzień tygodnia w formacie numerycznym na ciąg znaków.
Klasa dla obsługi zegara RTC DS3231:
- class RtcDs3231:
- address = 0x68
- register = 0x00
- bus = smbus.SMBus(1)
- #sec min hour weekDay day month year
- NowTime = [0x00,0x00,0x18,0x04,0x12,0x08,0x17]
- weekDay = ["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"];
- ########################################
- #set time base on system time
- def ds3231SetSystemTime():
- dataTable = SystemTimeDate.getTimeDate()
- #sec min hour weekDay day month year
- tableToPass = [dataTable[0], dataTable[1], dataTable[2], dataTable[3],
- dataTable[4], dataTable[5], (dataTable[6] - 2000)]
- RtcDs3231.bus.write_i2c_block_data(RtcDs3231.address,
- RtcDs3231.register,
- RtcDs3231.NowTime)
- ########################################
- #set time base on static value NowTime
- def ds3231SetTime():
- RtcDs3231.bus.write_i2c_block_data(RtcDs3231.address,
- RtcDs3231.register,
- RtcDs3231.NowTime)
- ########################################
- #set time with passing parameters
- def ds3231SetTimeParam(dsSec, dsMin, dsHour, dsWeek, dsDay, dsMonth, dsYear):
- timeToSet = [dsSec, dsMin, dsHour, dsWeek, dsDay, dsMonth, dsYear]
- RtcDs3231.bus.write_i2c_block_data(RtcDs3231.address,
- RtcDs3231.register,
- timeToSet)
- ########################################
- #read time and date from device
- def ds3231ReadTime():
- return RtcDs3231.bus.read_i2c_block_data(RtcDs3231.address,
- RtcDs3231.register,
- 7);
- ########################################
- #read and dislay time and date
- def ds3231GetTimeData():
- RtcDs3231.readTime = RtcDs3231.ds3231ReadTime()
- RtcDs3231.readTime[0] = RtcDs3231.readTime[0]&0x7F #sec
- RtcDs3231.readTime[1] = RtcDs3231.readTime[1]&0x7F #min
- RtcDs3231.readTime[2] = RtcDs3231.readTime[2]&0x3F #hour
- RtcDs3231.readTime[3] = RtcDs3231.readTime[3]&0x07 #week
- RtcDs3231.readTime[4] = RtcDs3231.readTime[4]&0x3F #day
- RtcDs3231.readTime[5] = RtcDs3231.readTime[5]&0x1F #month
- print("20%x/%x/%x %x:%x:%x %s" %(RtcDs3231.readTime[6],
- RtcDs3231.readTime[5],
- RtcDs3231.readTime[4],
- RtcDs3231.readTime[2],
- RtcDs3231.readTime[1],
- RtcDs3231.readTime[0],
- RtcDs3231.weekDay[RtcDs3231.readTime[3]-1]))
Idąc od góry po funkcjach. ds3231SetSytemTime wysyła do układu pobrany czas systemowy. ds3231SetTime ustawia czas jaki jest umieszczony w tablicy NowTime. ds3231SetTimeParam ustawia czas podany przez użytkownika. No i teraz funkcje główne czyli ds3231ReadTime pobiera czas z układu. Ostatnia funkcja ds32321GetTimeData pobiera dane z układu, po czym je przekształca i wypisuje na ekranie.
- import os
- import sys
- import time
- from rtcDS3231.rtcDS3231 import RtcDs3231
- if __name__ == '__main__':
- RtcDs3231.ds3231SetTime()
- while 1:
- RtcDs3231.ds3231GetTimeData()
- time.sleep(1)
W przypadku wykorzystywania tego układu jako zegar systemowy nie ma możliwości
Kody do plików można pobrać z dysku Google pod tym linkiem. W zakładce Python.