Fischertechnik
AVR
Raspberry Pi
Elektronik
Netzwerk
Sonstiges


















Impressum

RTC-Modul mit DS1307

RTC-Modul RTC-Modul Batterie-Seite
Bei eBay gibt es ab ca. 2,50 € ein RTC-Modul auf Basis des beliebten DS1307; als Dreingabe gleich mit Akku und eine 4kByte EEPROM. Darüberhinaus ist auch der Einbau des OneWire-Temperatur-Sensors DS18B20 vorbereitet.

Ganz kurz zur Schaltung

D1 und R5 (200 Ω) laden aus der Betriebspannung von 5 V die LiPo-Zelle LIR2032. R8 (3,3 kΩ) legt den Open-Collector-Ausgang "Squarewave" des DS1307 (U2) auf die Versorgungsspannung.
U3 ist ein EEPROM AT24C32 mit 4 kByte. Die drei Adressleitungen liegen auf GND; somit ist dieser Chip auf der niedrigsten Adresse (0x50/8010) anzusprechen.
R1 (3,3 kΩ) ist schon für den Temperatursensor (U1) vorbereitet. R2 und R3 (beide ebenfalls 3,3 kΩ) sind die Pullups für den I2C-Bus SDA/SCL. C1 und C2 sind die Stützkondensatoren zu U2 und U3. Der Quarz X1 ist an den zugehörigen Pins 1 und 2 des DS1307 angeschlossen; die vorbereiteten Anschlüsse R7 erschließen sich mir nicht; im Datenblatt des DS1307 finde ich keinen diesbezüglichen Punkt.
R6 (510 kΩ) und R4 (1,5 MΩ) bilden einen Spannungsteiler bezüglich der Batteriespannung. Über R4 fällt ca. 3 Volt ab; der Strom beträgt ca. 2 μA. Der Abgriff ist an den Anschluss BAT an P1 geführt.

Ist die so einfache Ladeschaltung ein Risiko?

Die sehr einfache Ladeschaltung hat mich sehr verwundert; ich dachte immer, LiIon-Akkus sind sehr, sehr empfindlich und brennen oder explodieren gerne bei Überladung. Laut Datenblatt beträgt die einzuhaltende Ladeschlussspannung 4,2 Volt. Verbleibt als Spannungsabfall über R5 und D1 noch 0,8 Volt. Die Diode wird bei den kleinen Strömen nicht mehr als 0,7 Volt beitragen; verbleiben mindestens 0,1 Volt über R5.
0,1 V / 200 Ω = 0,5 mA.
Dieses erscheint mir bezogen auf die max. 45 mAh Kapazität noch immer relativ viel.

Arduino Quelltext

/*
0x00   BCD Sekunden
0x01   BCD Minuten
0x02   BCD Stunden (nur wenn bit_6==0; sonst AM/PM+12h-Form)
0x03       Wochentag 1=Sonntag, ... 7=Samstag
0x04   BCD Tag im Monat
0x05   BCD Monat
0x06   BCD Jahr
0x07   Control-Byte 0=>SQW=0, kein Takt
*/
#include <Wire.h>

#define ds1307  0x68
char *DOW[8]={"--","So","Mo","Di","Mi","Do","Fr","Sa"};
#define BCD2BIN(x)  ((x>>4)*10+(x&0x0f))
#define BIN2BCD(x)  (((x/10)<<4)|(x%10))
byte a[8],s,m,h,dow,D,M,Y,ctrl;
void DS1307read(){
  byte i;
  Wire.beginTransmission(ds1307);
  Wire.write((byte)0);
  Wire.endTransmission();
  Wire.requestFrom(ds1307, 8);
  for(i=0;i<8;i++){
    while(0==Wire.available());
    a[i]=Wire.read();
  };
  s=BCD2BIN(a[0]);
  m=BCD2BIN(a[1]);
  h=BCD2BIN(a[2]);
  dow=a[3];
  D=BCD2BIN(a[4]);
  M=BCD2BIN(a[5]);
  Y=BCD2BIN(a[6]);
  ctrl=a[7];
};
void DS1307write(){
  a[0]=BIN2BCD(s);
  a[1]=BIN2BCD(m);
  a[2]=BIN2BCD(h);
  a[3]=dow;
  a[4]=BIN2BCD(D);
  a[5]=BIN2BCD(M);
  a[6]=BIN2BCD(Y);
  a[7]=ctrl;
  Wire.beginTransmission(ds1307);
  Wire.write((byte)0);
  Wire.write(a,8);
  Wire.endTransmission();
};
void setup(){
  Wire.begin();
  Serial.begin(19200);
}

void loop(){
  DS1307read();
  Serial.print(DOW[dow]);
  Serial.print(' ');
  Serial.print(Y/10);Serial.print(Y%10);Serial.print('-');
  Serial.print(M/10);Serial.print(M%10);Serial.print('-');
  Serial.print(D/10);Serial.print(D%10);Serial.print(' ');
  Serial.print(h/10);Serial.print(h%10);Serial.print(':');
  Serial.print(m/10);Serial.print(m%10);Serial.print(':');
  Serial.print(s/10);Serial.print(s%10);Serial.println();
  delay(1000);
}