• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

AVR-Wecker (RTC-basiert)

qByter

Geocacher
Hallo,

schon mehrfach kam hier die Frage nach zeitgesteuerten Stationen und der Anbindung einer RTC (Real time clock) an die Atmels auf... Ich hab mal den Code von einem kleinen Projekt von mir etwas aufgefrischt und stell das Ding einfach mal ein, vielleicht kann es der ein oder andere ja verwenden...

Es handelt sich um einen "Wecker" auf AVR-Basis (ATMega8) mit einer Dallas 1337 Realtimeclock.

Pro Tag lassen sich zwei Alarm-Zeiten einstellen, die ein Relais anziehen (im Schaltplan eine LED). Natürlich lässt sich auch jede beliebige andere Aktion starten, freie Ports und freier Speicher sind noch genug vorhanden ;)

Über ein kleines LCD-Display und ein einfaches Menü mit 3 Taster-Eingaben lassen sich Zeit und Alarmzeiten jederzeit korrigieren, ohne dafür an den Rechner zu müssen.
(1 Taste Menü/OK, 1 Taste Wert erhöhen, 1 Taste Cursorposition).

Die Ruhestromaufnahme liegt bei etwa 7 uA und ist somit absolut "batterietauglich".


Hier der Schaltplan:

avr-wecker.JPG
 
OP
qByter

qByter

Geocacher
Und der Quellcode (BASCOM):

Code:
' ====================================
' = "AVR-Wecker" mit Dallas 1337 RTC =
' = -------------------------------- =
' = Version 1.0 / qByter             =
' ====================================

$regfile = "m8def.DAT"
$crystal = 1000000
$baud = 9600
$hwstack = 20

Declare Sub Set_menu
Declare Sub Settime_Menu
Declare Sub Incrcursor_setmenu
Declare Sub Selection_setmenu
Declare Sub Setalarm_menu
Declare Sub Alarm
Declare Sub Display_time
Declare Sub Display_setting
Declare Sub Raisevalue
Declare Sub Setcursor
Declare Sub Incrcursor
Declare Sub Turnoffavr
Declare Sub Getdatetime
Declare Sub Setdate
Declare Sub Settime
Declare Sub Setalarm
Declare Sub Resetalarm
Declare Sub Checkalarm

Const Relaistime = 10

Config Portb = &B00000011
Config Portc = &B00111111
Config Portd = &B00000011

Config Sda = Portb.7                                        ' I2C Bus konfigurieren
Config Scl = Portb.6
Const Ds1307w = &HD0                                        ' Addresse der Ds1307/Ds1337 Uhr
Const Ds1307r = &HD1

Config Clock = User                                         ' Interne Time/Date Routinen für Bascom konfigurieren
Config Date = Dmy , Separator = .

Config Lcd = 20 * 2                                         ' LCD konfigurieren
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5

Config Debounce = 25                                        ' Wartezeit zum Entprellen der Taster
Portd.7 = 1                                                 ' Pullups für Taster zuschalten
Portd.6 = 1
Portd.2 = 1
Portd.3 = 1                                                 ' Pullup für D3/INT1 zuschalten

' Variablen
Dim Alarm_flag As Byte
Dim Int1_flag As Byte
Dim Zeichen As Byte
'Dim Stri As String * 5
Dim Weekday As Byte

Dim Set_hour As Byte
Dim Set_min As Byte
Dim Set_sec As Byte

Dim Alarm1_hour As Byte
Dim Alarm1_min As Byte
Dim Alarm1_sec As Byte
Dim Alarm2_hour As Byte
Dim Alarm2_min As Byte
Dim Alarm2_sec As Byte
Dim Alarm_to_change As Byte

Dim Maincursorpos As Byte
Dim Cursorpos As Byte

Maincursorpos = 1
Cursorpos = 1
Int1_flag = 0
Alarm_flag = 0

Enable Interrupts

Stop Adc
Stop Ac

Portb.1 = 1                                                 ' LCD anschalten

Waitms 50                                                   ' Kleines INIT, zur Funktionsprüfung beim Start
Initlcd
Cls
Locate 1 , 1
Lcd "Init..."


' Stellen der Uhr, muss nur einmal ausgeführt werden
Time$ = "19:57:00"                                          ' Initialwerte für Uhr
Date$ = "01.12.10"                                          ' Datum setzen,  wird derzeit nicht wirklich gebraucht

Alarm1_hour = 19                                            ' Alarmzeit 1
Alarm1_min = 59
Alarm1_sec = 20
Alarm2_hour = 23                                            ' Alarmzeit 2
Alarm2_min = 0
Alarm2_sec = 1

Gosub Setalarm                                              ' Alarmzeiten in DS1337 programmieren


Enable Int0                                                 ' INT0 = Alarm ausgelöst
Config Int0 = Low Level
On Int0 Int0_alarm

Enable Int1                                                 ' INT 1 = Menü aufrufen
Config Int1 = Low Level
On Int1 Int1_alarm

Lcd "OK!"
Wait 1                                                      ' Ende der Initialisierung


' =============
' HAUPTSCHLEIFE
' =============

Do
  If Int1_flag = 1 Then                                     ' INT1 ausgelöst, Menü aufrufen
   Getdatetime
   Set_menu
   Int1_flag = 0
   Gifr = 32
  End If

  If Alarm_flag = 1 Then                                    ' INT0 ausgelöst, Alarm auslösen
   Disable Int0                                             ' Interrupt vorrübergehend abschalten
   Alarm
   Alarm_flag = 0
   Gifr = 32                                                ' Interrupt Status Flag zurücksetzen
   Enable Int0
  End If

  Gosub Turnoffavr                                          ' LCD und AVR abschalten bis Interrupt

 Loop
End


' ===============
' ISRs

Int0_alarm:
 Alarm_flag = 1
Return

Int1_alarm:
 Int1_flag = 1
Return



' ==============
' Sub-Routinen


Sub Alarm                                                   ' Alarm auslösen
  Portb.1 = 1                                               ' LCD anschalten
  Initlcd

  Locate 2 , 1
  Lcd Time$                                                 ' Zeit anzeigen

  Locate 1 , 1
  Lcd "ALARM"
  Portb.0 = 1                                               ' Ausgang schalten (Relais)

  Wait Relaistime                                           ' Definierte Zeit warten
  Resetalarm                                                ' Alarm in der RTC resetten/abschalten
  Portb.0 = 0                                               ' Ausgang wieder abschalten
End Sub


Sub Set_menu                                                'Hauptmenü - Auswahl ob Zeit, Alarm1 oder Alarm2 geändert werden soll
   Portb.1 = 1
   Initlcd
   Locate 1 , 1
   Lcd "SET: Zeit A1 A2"
   Locate 1 , 6
   Cursorpos = 1
   Cursor On Blink

  Int1_flag = 0                                             ' Interrupt flag löschen
  Gifr = 32

  While Int1_flag = 0                                       ' Warten auf Tasteneingabe
    Debounce Pind.6 , 0 , Selection_setmenu , Sub
    Debounce Pind.7 , 0 , Incrcursor_setmenu , Sub
    Waitms 10
  Wend
End Sub


Sub Incrcursor_setmenu                                      ' Cursor im Menü auf Position bringen
 Select Case Cursorpos
  Case 1:
    Incr Cursorpos
    Locate 1 , 11
  Case 2:
    Incr Cursorpos
    Locate 1 , 14
  Case 3:
    Cursorpos = 1
    Locate 1 , 6
 End Select
End Sub


Sub Selection_setmenu                                       ' Aktion je nach Auswahl im Menü
  Select Case Cursorpos
    Case 1:                                                 ' 1 = Zeit neu stellen
      Call Settime_menu
    Case 2:                                                 ' 2 = Alarm1 neu stellen
      Alarm_to_change = 1
      Call Setalarm_menu
    Case 3:                                                 ' 3 = Alarm2 neu stellen
      Alarm_to_change = 2
      Call Setalarm_menu
  End Select
End Sub


Sub Setalarm_menu                                           ' Alarm neu stellen
    Cls
    Locate 1 , 1
    Lcd "Neue Alarm" ; Str(alarm_to_change) ; "-Zeit"

    If Alarm_to_change = 1 Then
      Set_hour = Alarm1_hour
      Set_min = Alarm1_min
      Set_sec = Alarm1_sec
    Else
      Set_hour = Alarm2_hour
      Set_min = Alarm2_min
      Set_sec = Alarm2_sec
    End If

    Gosub Display_setting

    While Int1_flag = 0                                     ' Warten auf Tasteneingabe
      Debounce Pind.7 , 0 , Raisevalue , Sub
      Debounce Pind.6 , 0 , Incrcursor , Sub
      Waitms 10
    Wend

    If Alarm_to_change = 1 Then
      Alarm1_hour = Set_hour
      Alarm1_min = Set_min
      Alarm1_sec = Set_sec
    Else
      Alarm2_hour = Set_hour
      Alarm2_min = Set_min
      Alarm2_sec = Set_sec
    End If

    Gosub Setalarm                                          ' Alarm in RTC neu stellen

    Cls
    Locate 1 , 1
    Lcd "Neuer Alarm" ; Str(alarm_to_change) ; ": "
    Gosub Display_setting
    Wait 3                                                  ' Pause für Anzeige + Entprellung
End Sub


Sub Display_setting                                         ' Zu ändernde Zeit anzeigen
  Locate 2 , 1
  If Set_hour < 10 Then
    Lcd "0" ; Str(set_hour) ; ":"
   Else
    Lcd Str(set_hour) ; ":"
  End If

  Locate 2 , 4
  If Set_min < 10 Then
    Lcd "0" ; Str(set_min) ; ":"
   Else
    Lcd Str(set_min) ; ":"
  End If

  Locate 2 , 7
  If Set_sec < 10 Then
    Lcd "0" ; Str(set_sec)
   Else
    Lcd Str(set_sec)
  End If

  Gosub Setcursor
End Sub


Sub Settime_menu                                            ' Zeit neu stellen
  Cls
  Locate 1 , 1
  Lcd "Zeit einstellen:"
  Cursorpos = 1

  Set_hour = _hour
  Set_min = _min
  Set_sec = _sec

  Gosub Display_setting

  While Int1_flag = 0                                       ' Auf Tasteneingabe warten
    Debounce Pind.7 , 0 , Raisevalue , Sub
    Debounce Pind.6 , 0 , Incrcursor , Sub
    Waitms 10
  Wend

  ' An dieser Stelle ist Int1 erneut ausgelöst, also Zeit neu setzen

  _hour = Set_hour
  _min = Set_min
  _sec = Set_sec

  Gosub Settime                                             ' Zeit in RTC schreiben

  Cls
  Locate 1 , 1
  Lcd "Neue Zeit: "
  Gosub Display_setting
  Wait 3                                                    ' Entprellpause, um sofortigen neuen INT zu verhindern
End Sub


Sub Incrcursor                                              ' Cursor im Menu neu setzen / erhöhen
  If Cursorpos > 2 Then
    Cursorpos = 1
   Else
    Incr Cursorpos
  End If
  Gosub Setcursor
End Sub


Sub Raisevalue                                              ' Wert (h/min/sec) erhöhen
 Select Case Cursorpos
   Case 1:                                                  ' 1 = Stunden
    If Set_hour = 23 Then
      Set_hour = 0
     Else
      Incr Set_hour
    End If
    Locate 2 , 1
    If Set_hour < 10 Then
      Lcd "0" ; Str(set_hour) ; ":"
     Else
      Lcd Str(set_hour) ; ":"
    End If
    Locate 2 , 1

   Case 2:                                                  ' 2 = Minuten
    If Set_min = 59 Then
      Set_min = 0
     Else
      Incr Set_min
    End If
    Locate 2 , 4
    If Set_min < 10 Then
      Lcd "0" ; Str(set_min) ; ":"
     Else
      Lcd Str(set_min) ; ":"
    End If
    Locate 2 , 4

   Case 3:                                                  ' 3 = Sekunden
    If Set_sec = 59 Then
      Set_sec = 0
     Else
      Incr Set_sec
    End If
    Locate 2 , 7
    If Set_sec < 10 Then
      Lcd "0" ; Str(set_sec)
     Else
      Lcd Str(set_sec)
    End If
    Locate 2 , 7
 End Select
End Sub


Sub Setcursor                                               ' Cursor auf die Position der aktuellen Auswahl setzen
 Select Case Cursorpos
   Case 1:
   Locate 2 , 1
   Case 2:
   Locate 2 , 4
   Case 3:
   Locate 2 , 7
 End Select
End Sub


Sub Turnoffavr:
  Portb.1 = 0                                               ' LCD aus
  Portc = 0                                                 ' Alle Datenpins low
  Powerdown
End Sub



' ==================================================
' Unterprogramme für die RTC

Sub Getdatetime
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cstart
  I2cwbyte Ds1307r
  I2crbyte _sec , Ack
  I2crbyte _min , Ack
  I2crbyte _hour , Ack
  I2crbyte Weekday , Ack
  I2crbyte _day , Ack
  I2crbyte _month , Ack
  I2crbyte _year , Nack
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
End Sub


Sub Setdate
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
End Sub


Sub Settime
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cwbyte _sec
  I2cwbyte _min
  I2cwbyte _hour
  I2cstop
End Sub


Sub Setalarm
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 7
  Zeichen = Makebcd(alarm1_sec)
  I2cwbyte Zeichen
  Zeichen = Makebcd(alarm1_min)
  I2cwbyte Zeichen
  Zeichen = Makebcd(alarm1_hour)
  I2cwbyte Zeichen
  I2cwbyte &B10000000                                       '128 = Jeweils beim Erreichen von h/m/s ALARM auslösen

    Zeichen = Makebcd(alarm2_sec)
    I2cwbyte Zeichen
    Zeichen = Makebcd(alarm2_min)
    I2cwbyte Zeichen
    Zeichen = Makebcd(alarm2_hour)
    I2cwbyte Zeichen
    I2cstop

  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 14

  I2cwbyte &B00011011                                       'Alarme aktivieren
  I2cwbyte 0                                                'Statusbits auf 0
  I2cstop
End Sub


Sub Resetalarm
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 15
  I2cwbyte 0
  I2cstop
End Sub

Größe kompiliert liegt bei etwa 3.5kb, sollte also auch für die Demo-Version noch reichen.


Anregungen und Kommentare sind natürlich willkommen.

Viel Spaß!
 
Ich sage an dieser Stelle mal vielen Dank qByter. Ich bin zwar noch recht kurz mit den Atmels unterwegs, aber das Programm ist gut zu verstehen und kann leicht auf die Bedürfnisse anderer abgestimmt werden.
Zwei Fragen hätte ich aber:
1. $crystal = 1000000 sagt ja, dass der µP mit 1 MHz taktet. Wie stehen denn die Fusebits, auf EXT oder INT 8MHz mit DIV/8? Das habe ich noch nicht verstanden.
2. Welchen Quarz Q1 und welche Widerstandwerte für R1-R3 hast Du benutzt?
Danke fürs Teilhabenlassen.
Gruß
Ralf
 
OP
qByter

qByter

Geocacher
Hallo Ralf,

die Fuses vom Mega8 sind "out of the box", d.h. da hab ich nichts speziell gesetzt. 1MHz interner Takt (DIV/8 gibt´s beim Mega nicht). Kann aber gerne noch einen Screenshot machen...

Der Quartz vom DS1337 ist ein 32kHz Uhrenquartz mit 6pf Lastkapazität (z.B. Reichelt 32,768 MS1V-6). R1-R3 sind einfache PullUps, da geht eigentlich alles von 10-100k, ich glaub ich hab 22k drin.
 

thomas_st

Geowizard
qByter schrieb:
schon mehrfach kam hier die Frage nach zeitgesteuerten Stationen und der Anbindung einer RTC (Real time clock) an die Atmels auf... Ich hab mal den Code von einem kleinen Projekt von mir etwas aufgefrischt und stell das Ding einfach mal ein, vielleicht kann es der ein oder andere ja verwenden...
Vielen Dank!
Sehr schön - ich werde es zwar nicht sofort umsetzen, aber wenn mal der Bedarf besteht, weiß ich jetzt, wo ich mal vorbei sehen werde ... :D :^^:

Ein paar Fragen und Kommentare hätte ich dann aber doch:
- Das Ganze müsste doch ohne "Programmiertasten" und LCD-Display auch mit weniger Pins auskommen, so dass man das Ganze vielleicht mit einem Tiny24 realisieren könnte. Oder gibt es einen Punkt der den Mega nötig macht (Speicher könnte ich mir vorstellen und die in Hardware verfügbare Integermultiplikation)
- Wenn ich mir die Bezeichnung der Pins am RTC ansehe, dann scheint das I²C bzw. TWI zu sein. Warum nutzt Du nicht die Hardwareunterstützung für I²C/TWI des Megas? Du hast die entsprechenden Pins für RS und E des Displays verwendet.

qByter schrieb:
(DIV/8 gibt´s beim Mega nicht)
Bist Du sicher? Ich bin bisher davon ausgegangen dass es sich beim Mega 48, 88 und 168 um aufgebohrte Varianten des Mega 8 handelt - und diese haben das Div/8 Fuse sehr wohl (einen Mega 8 habe ich nicht und bin jetzt zu faul dafür das Datenblatt zu ziehen)

Viele Grüße,
Thomas(_st)
 
OP
qByter

qByter

Geocacher
- Das Ganze müsste doch ohne "Programmiertasten" und LCD-Display auch mit weniger Pins auskommen, so dass man das Ganze vielleicht mit einem Tiny24 realisieren könnte. Oder gibt es einen Punkt der den Mega nötig macht (Speicher könnte ich mir vorstellen und die in Hardware verfügbare Integermultiplikation)
Das dürfte ohne die LCD- und Menüroutinen locker in einen Tiny passen, mir fällt da auch nix ein was ein kleiner nicht schaffen würde ;)
Da die RTC aber mit der Zeit wohl ein wenig falsch laufen wird, war mir die Anzeige- und Korrekturmöglichkeit recht wichtig. Wie´s in der Praxis mit Temperaturdrift tatsächlich ausschaut kann ich noch nicht sagen... Und so ist´s mit wenigen Tastendrücken wieder korrigiert.

- Wenn ich mir die Bezeichnung der Pins am RTC ansehe, dann scheint das I²C bzw. TWI zu sein. Warum nutzt Du nicht die Hardwareunterstützung für I²C/TWI des Megas? Du hast die entsprechenden Pins für RS und E des Displays verwendet.
Hab ich mir ehrlich gesagt keine Gedanken drum gemacht, da man die IC2-Pins in Bascom frei konfigurieren kann. In wie weit der Code kleiner wird und evtl. auf die Hardware-Möglichkeiten zurückgegrifffen wird wenn man die "richtigen" Pins verwendet - gute Frage. Werd ich mal testen...

Jo, ziemlich. Wird mir zumindest nicht angeboten und ein flüchtiges Suchen nach CKDIV8 im Datenblatt hatte auch kein Ergebnis ;)

Ich mach aber der Vollständigkeit halber noch einen Screenshot der Fuses...
 

thomas_st

Geowizard
qByter schrieb:
[Hardware-TWI beim Mega]Hab ich mir ehrlich gesagt keine Gedanken drum gemacht, da man die IC2-Pins in Bascom frei konfigurieren kann.
Ach ich vergaß ... bei Bascom gibt es wieder eine Luxusfunktion die das regelt ;) Ok, ich könnte vielleicht auch Libraries dafür nutzen die HW- oder SW-TWI kapseln. Aber ich hatte das damals selbst geschrieben und da fällt das dann schon etwas auf ... ;) ... wobei so viel kürzer oder länger ist der Code mit HW-Unterstützung oder ohne auch nicht.

qByter schrieb:
Jo, ziemlich. Wird mir zumindest nicht angeboten und ein flüchtiges Suchen nach CKDIV8 im Datenblatt hatte auch kein Ergebnis ;)

Ich mach aber der Vollständigkeit halber noch einen Screenshot der Fuses...
Lass mal, wenn Du sicher bist glaube ich Dir das schon :) Ich war halt bisher von der falschen Annahme ausgegangen, dass die Mega x8 nur aufgebohrte Mega 8 sind - ist dann nicht der Fall.

Viele Grüße und vielen Dank,
Thomas(_st)
 
Super ! Vielen Dank für die klärenden Angaben. Dann werde ich mich da wohl auch mal drauf stürtzen. Dauert zwar noch ein wenig, aber ich weiß ja jetzt, wo ich es finde.
Gruß
Ralf
 

hcy

Geoguru
Wo findet man eigentlich immer die Adressen der I2C-Bausteine? Für den DS1337 liest man mal 0xD0, mal 0x68, welche ist nun richtig? Ausprobieren?
 

Millhouse

Geocacher
Beide Slave-Adressen sind richtig!

Da die Slave-Adresse auch noch das R/W Bit enthält, kann man jetzt die Slave-Adresse einmal als 7Bit Wert ohne R/W-Bit interpretieren (0x68 = 0b1101000) oder als 8Bit Wert mit R/W-Bit (0xD0 = 0b11010000).

Je nach Softwareinterface, muss man der Software mal die Slave-Adresse als 7Bit Wert übergeben, oder als 8Bit Wert.

Näheres (I²C Datenformat) steht im Datenbuch: http://pdfserv.maxim-ic.com/en/ds/DS1337-DS1337C.pdf
 

upigors

Geowizard
Danke erstmal für die Info. Sieht spannend aus und das Programm ist verständlich....
Werde mir das mal näher zu Gemühte ziehen ;-)
Eine Frage, würde es Dir viel ausmachen den obligatorischen Screenshot der Lock und Fuses-Einstellungen noch zu posten? Ich versteh das immer noch nicht zu 100% und ich meine auch der eine oder andere freut sich wenn er das nicht durch Versuch und Irrtum probieren muß :eek:ps:
obwohl, dann liegen meine 2 "verlorenen" 24'er nicht mehr so allein im Schrank :/
 
OP
qByter

qByter

Geocacher
Eine Frage, würde es Dir viel ausmachen den obligatorischen Screenshot der Lock und Fuses-Einstellungen noch zu posten?
Nee, kein Problem - sind aber wie schon geschrieben "out of the box" beim Mega8...


rtcfuses.JPG
 

Hucky3000

Geocacher
Cooooooool :)

Da ist man mal ne Zeit nicht so aktiv und die "Probleme" lösen sich fast von selbst.
Ganau DAS was ich für ein kommendes Projekt gesucht habe. Hatte auch schon ähnliches auf anderen Seiten gefunden - aber hier fühlt man sich doch noch am wohlsten :D

Hucky
 

Gorki

Geonewbie
Ja ich weiss, der thread ist schon ziemlich alt, aber ich wollte gern die Schaltuhr nachbauen, leider ist der Schaltplan nicht mehr da.
qByter; könntest Du den bitte neu posten?
 

MaxPower

Geocacher
Nur so ein Tipp, sowas Ähnliches auch mit Dallas RTC-Chip gibt es mittlerweile für schmales Geld als fertiges Modul zur Anbindung an Arduinos/AVRs, google "waiman arduino rtc" oder "tiny rtc" bzw. in der eBucht.
 

fogg

Geomaster
Ich würde den DS3231 RTC-Chip verwenden. Ist genauer als der DS1337, hat den Quarz eingebaut, kann auch 3,3 Volt und hat einen Anschluss für eine Backup-Batterie. Ich habe den jetzt auf einem Seeedstudio-Stalker-Modul ein Jahr lang im Garten liegen gehabt und die Gangabweichung war bei rund 1 Minute. Man sollte darauf achten, dass es der DS3231SN ist, da dieser bis -40 Grad spezifiziert ist.
 

MaxPower

Geocacher
@fogg
Danke für den Tipp mit dem DS3231SN. Ich hab mal eben auf ebay geschaut, Module mit diesem Chip sind für ~3€ inkl. Versand aus Europa erhältlich.
Btw, der DS1337 kann auch 3,3V ;)
 
Oben