zondag 31 maart 2013

I²C Real time Clock

Als je de Raspberry Pi op internet hebt staan heb je altijd de juiste tijd en datum, maar wat als je de Raspberry Pi eens voor een lange tijd niet op internet hebt staan, dan loopt je tijd niet meer goed en als je alle pech hebt ben je datum en tijd kwijt.

Om dit te voorkomen kunnen we gebruik maken van een Realtime Clock.
Dit is een ds1307 IC die de datum en tijd onthoud aan de hand van een knoop batterij van 3V.



Deze ds1307 werkt perfect op I²C want hij werkt op 5V.

Om deze op het I²C te zetten bouwen we de volgende schema op.

Alle poorten moeten we dus aansluiten behalve de SQW/OUT poort niet , deze blijft vrij.

Proef opstelling van bovenstaande.:


Eerst laden de RTC module door het volgende te typen.:
pi@raspberrypi ~ $ sudo modprobe rtc-ds1307

Als alles aangesloten is krijgt deze adres 0x68 toegewezen.
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Het onderstaande gedeelte is niet verplicht want je kunt met bovenstaande het wel laten werken via Python maar de zonder python niet , wil je het niet zonder ython laten werken dan kun je onderstaande gebruiken.
 
Type in de console het volgende.:
pi@raspberrypi ~ $ echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

Dit doen we om de real time clock vast als adres in de I²C lijn te krijgen , als je de real time clock nu van het systeem zou verwijderen blijft het adres UU toch zichtbaar (dit is zo lang je niet opnieuw de software op je sd kaart zet).
Als je opnieuw een detectie doet ziet men dat de realtime clock is aangepast naar UU.:
pi@raspberrypi ~ $ sudo i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Om te testen of iets word getoond van tijd en datum proberen we in de console het volgende.:
pi@raspberrypi ~ $ cat /sys/class/rtc/rtc0/time
00:00:00
pi@raspberrypi ~ $ cat /sys/class/rtc/rtc0/date
2000-01-01
Of controleer de tijd met sudo hwclock - r die de tijd van de DS1307 module lezen zal.
Als dit de eerste keer is dat de module gebruikt word, zal het resultaat Jan 1 2000 zijn.

Nu om de tijd in de realtime clock vast te zetten wat van de RPI afkomt (die is wel juist) typen we het volgende.:
pi@raspberrypi ~ $ sudo hwclock -w

Als we nu opnieuw tijd en datum oproepen via sudo hwclock -r zie je dat het wel goed ingesteld is.
pi@raspberrypi ~ $ cat /sys/class/rtc/rtc0/time
10:12:38
pi@raspberrypi ~ $ cat /sys/class/rtc/rtc0/date
2013-03-31

Update.:

Printje is nu klaar en werkend.

Je ziet rechts boven in nog 1 pin vrij.
Het schijnt volgens de datasheet van de ds1307 ic dat die SQW/OUT wat ik eerder vermelde vrij te houden gebruikt kan worden voor het alarm.
Dus die pin heb ik erbij gemaakt voor eventueel later te gaan gebruiken.

Als je het gedeelte zou gebruiken dat je met Python de tijd en datum zou willen uitlezen kun je deze code gebruiken.:

#!/usr/bin/python
# Raspberryboard I2C bus scan V0.1
# voor de Raspberry Pi Revision 2
#
# Author : Pascal Schuffelers
# Site   : http://www.vbib.be
# 
# Date   : 3/03/2013 tijd.: 19:57 uur.
#
# Uitlezen van Realtime Clock

import smbus

def BCD2Up( bcd ):    # Functie om de 4 hogere bits weg te halen van de byte
        return (str(bcd >> 4))

def BCD2Lo( bcd ):     # Functie om de 4 lagere bits weg te halen van de byte
        return (str(bcd & 0x0F))

bus = smbus.SMBus(1)  # bus number 1

czas = []
data = []

# Lees ruwe data van DS1307
sec = bus.read_byte_data(0x68, 0)
min = bus.read_byte_data(0x68, 1)
hour = bus.read_byte_data(0x68, 2)
day = bus.read_byte_data(0x68, 3)
date = bus.read_byte_data(0x68, 4)
month = bus.read_byte_data(0x68, 5)
year = bus.read_byte_data(0x68, 6)

# converteer naar strings
czas.append(BCD2Up(hour & 0x3F))
czas.append(BCD2Lo(hour & 0x3F))
czas.append(BCD2Up(min))
czas.append(BCD2Lo(min))
czas.append(BCD2Up(sec))
czas.append(BCD2Lo(sec))

data.append(BCD2Up(date))
data.append(BCD2Lo(date))
data.append(BCD2Up(month))
data.append(BCD2Lo(month))
data.append(BCD2Up(year))
data.append(BCD2Lo(year))

sc = czas[0] + czas[1] + ':' + czas[2] + czas[3] + ':' + czas[4] + czas[5]
sd = data[0] + data[1] + '/' + data[2] + data[3] + '/20' + data[4] + data[5]

print "Huidige tijd is: " + sc + "   " + sd

Geen opmerkingen:

Een reactie posten