#include #include #include #include #define SERIALBUFSIZE 11 LiquidCrystal lcd(12, 11, 5, 4, 3, 2); unsigned long previousMillis = 0; char serialBuffer[SERIALBUFSIZE]; byte setBufPointer = 0; // core routines void setup() { Serial.begin(9600); RTC.startClock(); lcd.begin(8, 1); delay(1000); startupReport(); } void loop() { if (passed(200)) { lcd.clear(); printTimeToLCD(); previousMillis = millis(); printDateToSerial(); Serial.print(" "); printTimeToSerial(); Serial.print(" "); Serial.print(getCurrentTime()); Serial.println(); } commandCollector(); } // startup report void startupReport() { Serial.print("Started: "); printDateToSerial(); Serial.print(" "); printTimeToSerial(); Serial.println(); } // delay without delay boolean passed(int interval) { return (millis() - previousMillis > interval); } // RTC routines unsigned long getCurrentTime() { RTC.getTime(); unsigned long hour = RTC.hour; unsigned int minute = RTC.minute; unsigned int second = RTC.second; unsigned long currentTime = (hour * 3600 + minute * 60 + second); return currentTime; } // output formatting void printDateToSerial() { char str[5]; RTC.getTime(); Serial.print(format4(str, RTC.year)); Serial.print("-"); Serial.print(format2(str, RTC.month)); Serial.print("-"); Serial.print(format2(str, RTC.date)); } void printTimeToSerial() { char str[3]; RTC.getTime(); Serial.print(format2(str, RTC.hour)); Serial.print(":"); Serial.print(format2(str, RTC.minute)); Serial.print(":"); Serial.print(format2(str, RTC.second)); } void printTimeToLCD() { char str[3]; RTC.getTime(); lcd.print(format2(str, RTC.hour)); lcd.print(":"); lcd.print(format2(str, RTC.minute)); lcd.print(":"); lcd.print(format2(str, RTC.second)); } void printTimeFromSecs(unsigned long timeInSecs) { char str[3]; unsigned int hour = getHours(timeInSecs); Serial.print(format2(str, hour)); Serial.print(":"); unsigned int minute = getMinutes(timeInSecs); Serial.print(format2(str, minute)); Serial.print(":"); unsigned int second = getSeconds(timeInSecs); Serial.print(format2(str, second)); } // sprintf wrapper char* format2(char* str, byte value) { sprintf(str, "%02d", value); return str; } char* format4(char* str, unsigned int value) { sprintf(str, "%04d", value); return str; } byte getHours(unsigned long timeInSecs) { return(timeInSecs / 3600); } byte getMinutes(unsigned long timeInSecs) { return(timeInSecs / 60 - getHours(timeInSecs) * 60); } byte getSeconds(unsigned long timeInSecs) { return(timeInSecs - (getHours(timeInSecs) * 3600) - getMinutes(timeInSecs) * 60); } // interactive command part unsigned long timeInSecs(byte hours, byte minutes, byte seconds) { unsigned long lHours = hours; unsigned int lMinutes = minutes; unsigned long total = seconds + lMinutes * 60 + lHours * 3600; return total; } void commandCollector() { if (Serial.available() > 0) { int inByte = Serial.read(); switch(inByte) { case '.': case '\r': case '\n': // Serial.print("Executing: "); // Serial.println(serialBuffer); commandInterpreter(); clearSerialBuffer(); setBufPointer = 0; break; default: // Serial.print("Storing "); // char str[1]; // sprintf(str, "%c", inByte); // Serial.println(str); serialBuffer[setBufPointer] = inByte; setBufPointer++; if (setBufPointer >= SERIALBUFSIZE) { Serial.println("Serial buffer overflow. Cleanup."); clearSerialBuffer(); setBufPointer = 0; } } } } void commandInterpreter() { byte bufByte = serialBuffer[0]; switch(bufByte) { case 'D': dArgInterpreter(); break; case 'H': case '?': Serial.println("DHT?"); break; case 'T': tArgInterpreter(); break; default: Serial.print(bufByte); Serial.println(": unknown command"); return; } } void dArgInterpreter() { if (setBufPointer == 1) { printDateToSerial(); Serial.println(); } else if (setBufPointer == 9) { RTC.getTime(); RTC.stopClock(); RTC.year = (serialBuffer[1]-'0') * 1000 + (serialBuffer[2]-'0') * 100 + (serialBuffer[3]-'0') * 10 + serialBuffer[4]-'0'; RTC.month = (serialBuffer[5]-'0') * 10 + serialBuffer[6]-'0'; RTC.date = (serialBuffer[7]-'0') * 10 + serialBuffer[8]-'0'; RTC.setTime(); RTC.startClock(); Serial.print("Date set: "); printDateToSerial(); Serial.println(); } else { Serial.print("unsupported arg size: "); Serial.println(setBufPointer); } } void tArgInterpreter() { if (setBufPointer == 1) { printTimeToSerial(); Serial.println(); } else if (setBufPointer == 7) { RTC.getTime(); RTC.stopClock(); RTC.hour = (serialBuffer[1]-'0') * 10 + serialBuffer[2]-'0'; RTC.minute = (serialBuffer[3]-'0') * 10 + serialBuffer[4]-'0'; RTC.second = (serialBuffer[5]-'0') * 10 + serialBuffer[6]-'0'; RTC.setTime(); RTC.startClock(); Serial.print("Time set: "); printTimeToSerial(); Serial.println(); } else { Serial.print("unsupported arg size: "); Serial.println(setBufPointer); } } void clearSerialBuffer() { byte i; for (i = 0; i < SERIALBUFSIZE; i++) { serialBuffer[i] = 0; } }