Paso 6: Hablar con el reloj de tiempo Real (RTC)
El circuito y el código siguiente inmediatamente trabajaban para mí.
Aquí está el enlace a la hoja de datos del DS3231:
http://datasheets.Maxim-IC.com/en/DS/DS3231.pdf
Encontré este pequeño programa (sketch en Arduinish) en la web de thew y han unido para usted. Lee la información de la RTC y escupe en el monitor serie. (Mucho gracias al autor; gfbarros). Aquí está el link original:
http://code.Google.com/p/GFB/Source/Browse/Arduino/DS3231/DS3231.PDE
Si todo va bien, debería ver salida en el monitor serial como el de la foto de abajo.
DS3231 Fragmento de código
#include < Wire.h >
#define DS3231_I2C_ADDRESS 104
byte segundos, minutos, horas, día, fecha, mes, año;
día de la semana Char [4];
byte tMSB, tLSB;
Float temp3231;
void setup()
{
Wire.Begin();
Serial.Begin(9600);
registro de control conjunto a onda cuadrada de salida en el pin 3 en 1Hz
Wire.beginTransmission(DS3231_I2C_ADDRESS); 104 es DS3231 dispositivo dirección
Wire.Send(0x0E); //
Wire.Send(B00000000);
Wire.endTransmission();
}
void loop()
{
watchConsole();
get3231Date();
Serial.Print(weekDay); Serial.Print (","); Serial.Print (mes, DEC); Serial.Print("/"); Serial.Print (fecha, DEC); Serial.Print("/"); Serial.Print (año, DEC); Serial.Print ("-");
Serial.Print (horas, DEC); Serial.Print(":"); Serial.Print (minutos, DEC); Serial.Print(":"); Serial.Print (segundos, DEC);
Serial.Print ("temperatura:"); Serial.println(get3231Temp());
Delay(1000);
}
Convierte a números decimales normales a binario codificado decimal
decToBcd(byte val) bytes
{
regresar ((val/10 * 16) + (val % 10));
}
void watchConsole()
{
Si (Serial.available()) {/ / buscar carbón en proceso de cola de la serie y si encuentra
Si (Serial.read() == 84) {//If comando = "T" fijar fecha
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)
Ejemplo: 02 de febrero de 09 @ 19:57:11 para el 3 º día de la semana -> T1157193020209
segundos = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48)); Uso de las matemáticas de fundición y ascii de tipo (byte) para lograr el resultado.
minutos = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
horas = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
día = (byte) (Serial.read() - 48);
fecha = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
mes = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
año = (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()
{
enviar solicitud para recibir los datos a partir de registro 0
Wire.beginTransmission(DS3231_I2C_ADDRESS); 104 es DS3231 dispositivo dirección
Wire.Send(0x00); desde el registro 0
Wire.endTransmission();
Wire.requestFrom (DS3231_I2C_ADDRESS, 7); solicitar siete bytes
{if(Wire.Available())}
segundos = Wire.receive(); segundos
minutos = Wire.receive(); obtener minutos
horas = Wire.receive(); Haz horas
día = Wire.receive();
fecha = Wire.receive();
mes = Wire.receive(); mes temperatura
año = Wire.receive();
segundos = (((seconds & B11110000) >> 4) * 10 + (segundos / B00001111)); convertir de BCD a decimal
minutos = (((minutes & B11110000) >> 4) * 10 + (minutos / B00001111)); convertir de BCD a decimal
horas = (((hours & B00110000) >> 4) * 10 + (horas / B00001111)); convertir de BCD a decimal (asumir el modo de 24 horas)
día = (día & B00000111); 1-7
fecha = (((date & B00110000) >> 4) * 10 + (fecha & B00001111)); 1-31
mes = (((month & B00010000) >> 4) * 10 + (mes & B00001111)); msb7 es desbordamiento del siglo
año = (((year & B11110000) >> 4) * 10 + (año & B00001111));
}
Else {}
Oh noes, no hay datos!
}
interruptor (día) {}
caso 1:
strcpy (día de la semana, "Sol");
rotura;
caso 2:
strcpy (día de la semana, "Lunes");
rotura;
caso 3:
strcpy (día de la semana, "Martes");
rotura;
caso 4:
strcpy (día de la semana, "Mie");
rotura;
caso 5:
strcpy (día de la semana, "Jue");
rotura;
caso 6:
strcpy (día de la semana, "Viernes");
rotura;
caso 7:
strcpy (día de la semana, "se sentó");
rotura;
}
}
flotador get3231Temp()
{
registros de temperatura (11h - 12h) Haz actualizan automáticamente cada 64s
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.Send(0x11);
Wire.endTransmission();
Wire.requestFrom (DS3231_I2C_ADDRESS, 2);
{if(Wire.Available())}
tMSB = Wire.receive(); 2 complementar la porción int
tLSB = Wire.receive(); parte de la fracción
temp3231 = (tMSB & B01111111); de 2 matemáticas en Tmsb
temp3231 += ((tLSB >> 6) * 0.25); atención sólo de bits 7 y 8
}
Else {}
Oh noes, no hay datos!
}
volver temp3231;
}