Steampunk Analog mätare månfas klocka (6 / 11 steg)
Steg 6: Prata med realtidsklocka (RTC)
Kretsen och koden nedan arbetat rätt bort för mig.
Här är länken till DS3231 databladet:
http://datasheets.Maxim-IC.com/en/DS/DS3231.pdf
Jag hittade denna lilla program (skiss i Arduinish) på thew web och har kopplat det för dig. Det läser info från RTC och spottar ut det till seriell bildskärmen. (Mycket tack vare författaren, gfbarros). Här är den ursprungliga länken:
http://code.Google.com/p/GFB/source/browse/Arduino/DS3231/DS3231.pde
Om allt är bra, bör du se utdata i följetong monitor som det i bilden nedan.
DS3231 Kodstycke
#include < Wire.h >
#define DS3231_I2C_ADDRESS 104
byte sekunder, minuter, timmar, dag, datum, månad, år.
char veckodag [4].
byte tMSB, tLSB;
float temp3231;
void setup()
{
Wire.BEGIN();
Serial.BEGIN(9600);
Ställ in avstämningsregister till utgång fyrkantsvåg på stift 3 på 1Hz
Wire.beginTransmission(DS3231_I2C_ADDRESS); 104 är DS3231 enhetsadress
Wire.send(0x0E); //
Wire.send(B00000000);
Wire.endTransmission();
}
void loop()
{
watchConsole();
get3231Date();
Serial.Print(weekDay); Serial.Print (","); Serial.Print (månad, DEC). Serial.Print("/"); Serial.Print (datum, DEC); Serial.Print("/"); Serial.Print (år, DEC). Serial.Print ("-");
Serial.Print (timmar, DEC); Serial.Print(":"); Serial.Print (minuter, DEC); Serial.Print(":"); Serial.Print (sekunder, DEC);
Serial.Print ("temperatur:"); Serial.println(get3231Temp());
Delay(1000);
}
Konvertera normala decimaltal till binary coded decimal
byte decToBcd(byte val)
{
tillbaka ((val/10 * 16) + (val % 10));
}
void watchConsole()
{
om (Serial.available()) {/ / leta efter röding i följetong kö och processen om hittade
om (Serial.read() == 84) {//If kommando = "T" Ange datum
set3231Date();
get3231Date();
Serial.println("");
}
}
}
void set3231Date()
{
T(SEC)(min)(Hour)(DAYOFWEEK)(dayOfMonth)(month)(Year)
T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
Exempel: 02-Feb-09 @ 19:57:11 för 3: e dagen i veckan -> T1157193020209
sekunder = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48)); Användning av (byte) typ gjutning och ASCII-matematik för att uppnå resultat.
minuter = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
timmar = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
dag = (byte) (Serial.read() - 48);
datum = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
månad = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
år = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.send(0x00);
Wire.send(decToBcd(seconds));
Wire.send(decToBcd(Minutes));
Wire.send(decToBcd(hours));
Wire.send(decToBcd(Day));
Wire.send(decToBcd(date));
Wire.send(decToBcd(month));
Wire.send(decToBcd(Year));
Wire.endTransmission();
}
void get3231Date()
{
skicka begäran om att ta emot data från register 0
Wire.beginTransmission(DS3231_I2C_ADDRESS); 104 är DS3231 enhetsadress
Wire.send(0x00); börja vid register 0
Wire.endTransmission();
Wire.requestFrom (DS3231_I2C_ADDRESS, 7); begära sju byte
IF(Wire.available()) {
sekunder = Wire.receive(); få sekunder
minuter = Wire.receive(); få minuter
timmar = Wire.receive(); få timmar
dag = Wire.receive();
datum = Wire.receive();
månad = Wire.receive(); Temp månad
år = Wire.receive();
sekunder = (((seconds & B11110000) >> 4) * 10 + (sekunder & B00001111)); konvertera BCD till decimal
minuter = (((minutes & B11110000) >> 4) * 10 + (minuter & B00001111)); konvertera BCD till decimal
timmar = (((hours & B00110000) >> 4) * 10 + (timmar & B00001111)); konvertera BCD till decimal (antar 24 timmarsvisning)
dag = (dag & B00000111); 1-7
datum = (((date & B00110000) >> 4) * 10 + (datum & B00001111)); 1-31
månad = (((month & B00010000) >> 4) * 10 + (månad & B00001111)); msb7 är talet overflow
år = (((year & B11110000) >> 4) * 10 + (år & B00001111));
}
annat {
Åh nej, inga data!
}
Växla (dag) {
fall 1:
strcpy (veckodag, "Sun");
bryta;
fall 2:
strcpy (veckodag, "Må");
bryta;
fall 3:
strcpy (veckodag, "Tis");
bryta;
fall 4:
strcpy (veckodag, "ons");
bryta;
fall 5:
strcpy (veckodag, "Tor");
bryta;
fall 6:
strcpy (veckodag, "Fr");
bryta;
fall 7:
strcpy (veckodag, "Sat");
bryta;
}
}
float get3231Temp()
{
Temp register (11h - 12h) få uppdateras automatiskt varje 64s
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.send(0x11);
Wire.endTransmission();
Wire.requestFrom (DS3231_I2C_ADDRESS, 2);
IF(Wire.available()) {
tMSB = Wire.receive(); 2: s komplettera int del
tLSB = Wire.receive(); bråk del
temp3231 = (tMSB & B01111111); gör 2: s matematik på Tmsb
temp3231 += ((tLSB >> 6) * 0,25); bara bryr sig om bitar 7 & 8
}
annat {
Åh nej, inga data!
}
återvända temp3231;
}