Jack Christensen's trick to power it from the analog pins is neat as I can simply insert the module in the connector. Thanks! Can I do the same from the digital pins? That is, power low-power devices instead of using 5v and Gnd?
Can't take credit, saw it on Adafruit's site. But yes digital pins would work as well, just stay within the current limitations of the microcontroller, 20mA per pin to be conservative. Analog pins can be used just like digital pins.
Btw, I noticed that when the module works correctly but the time has not been set, it starts with 00:00:00 1-1-2000. When the module doesn't work or is not connected, the start time is 17:18:09 27 2 2037. I thought that the library would detect that the module wasn't present, but apparently not.
Yeah that might be a good idea. Easy to add to the sketch:
/*
* TimeRTCSet.pde
* example code illustrating Time library with Real Time Clock.
*
* RTC clock is set in response to serial port time message
* A Processing example sketch to set the time is inclided in the download
*/
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#define RTC_ADDR 0x68
void setup()
{
pinMode(A2, OUTPUT);
digitalWrite(A2, LOW);
pinMode(A3, OUTPUT);
digitalWrite(A3, HIGH);
Serial.begin(9600);
if ( !rtcPresent(RTC_ADDR) ) {
Serial.println("RTC not connected!");
for (;;); //do not pass go, do not collect $200, loop forever
}
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
}
void loop()
{
if(Serial.available())
{
time_t t = processSyncMessage();
if(t >0)
{
RTC.set(t); // set the RTC and the system time to the received value
setTime(t);
}
}
digitalClockDisplay();
delay(1000);
}
//check to see if the RTC is there
boolean rtcPresent(byte addr)
{
Wire.beginTransmission(addr);
Wire.write(0x00);
if (Wire.endTransmission() != 0)
return false;
else
return true;
}
void digitalClockDisplay()
{
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
void printDigits(int digits)
{
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
/* code to process time sync messages from the serial port */
#define TIME_MSG_LEN 11 // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER 'T' // Header tag for serial time sync message
time_t processSyncMessage()
{
// return the time if a valid sync message is received on the serial port.
while(Serial.available() >= TIME_MSG_LEN ){ // time message consists of a header and ten ascii digits
char c = Serial.read() ;
Serial.print(c);
if( c == TIME_HEADER ) {
time_t pctime = 0;
for(int i=0; i < TIME_MSG_LEN -1; i++){
c = Serial.read();
if( c >= '0' && c <= '9'){
pctime = (10 * pctime) + (c - '0') ; // convert digits to a number
}
}
return pctime;
}
}
return 0;
}