Fischertechnik
AVR
Raspberry Pi
Elektronik
Netzwerk
Sonstiges
Impressum
|
RTC-Modul mit DS1307
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);
}
|