実験に使用した時計のスケッチはこちらです

前エントリでテストに使用したスケッチ。長いのでちょっとよけておきました。
LCD に時刻を表示するだけのシンプルな時計です。ただ、それだけだと実験用とは言えつまらないので、スピーカーを A1(D14)ポートに接続して、毎正時に時報を鳴らすようにしました。
なお、秒の切り上げその他切り上げ処理全般について、充分検証したわけではないので、まだバグが残っているかもしれません。また、時刻合わせは前述のとおりシリアルコンソールから「yyyymmddHHmmss」の書式で数字列を送れば OK という方式にしてありますが、そのタイミングと精度についても若干難が残っています。

まあ、飽くまでクロック精度を大まかに確認するためだけのものですので。
あと、シリアル引っこ抜くとリセットがかかるという Arduino の仕様により、時刻合わせして使うにはシリアルに紐付いてないと不可という外道な仕様です。実用性の欠片もないので、実際に使われるかたは然るべきカスタマイズをして御使用ください。


コロンの点滅に関しては「こういうアイデアもあるよ!」みたいな方法を使ってます。

/*

うっとうしい時報も鳴るシンプルなLCD時計

 modified from:
  LiquidCrystal Library - display() and noDisplay()
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD and uses the 
 display() and noDisplay() functions to turn on and off
 the display.
 
 The circuit:
 * LCD RS pin to digital pin 12
 * LCD Enable pin to digital pin 11
 * LCD D4 pin to digital pin 5
 * LCD D5 pin to digital pin 4
 * LCD D6 pin to digital pin 3
 * LCD D7 pin to digital pin 2
 * 10K resistor:
 * ends to +5V and ground
 * wiper to LCD VO pin (pin 3)
 
 * Speaker to Analog pin 0 and GND
 
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe 
 modified 25 July 2009
 by David A. Mellis
 
 modified to Clock 20100610 (時の記念日)
 by OkibiWorksLabo
 

 
 */

int dyer = 2010;
int dmth = 06;
int dday = 10;

int dhor = 00;
int dmin = 00;
int dsec = 00;

int tOffset;
boolean latch = false;

char str[128];  // シリアル受信用

unsigned char colon = 58;  //  時計のコロン(点滅)の表示用

int bzPin = 14;   // スピーカー接続先:A0 (= D14)
int ledPin = 13;  // LEDピン:D13

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  
  pinMode(bzPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  
  Serial.begin(9600);
  
    tOffset = 500 - millis() % 1000;  
  
  // set up the LCD's number of rows and columns: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Hello!");
    pi();
    delay(120);
    pi();
  delay(500);
    lcd.clear();

}

void loop() {
  
  if((millis() - tOffset) % 1000 < 500) {
    latch = true;
    colon = 32;
    digitalWrite(ledPin, HIGH);
  } else {
    colon = 58;
    digitalWrite(ledPin, LOW);
  }
  
  if(((millis() - tOffset) % 1000 >= 500) && latch) {
    
     latch = false;
   
    dsec++;
      if((dmin == 59) && (dsec >= 57) && (dsec <= 59)) { pi(); }
      if(dsec == 60) {
        dsec = 0;
        dmin++;
          if(dmin == 60) {
                oclock();
            dmin = 0;
            dhor++;
              if(dhor == 24) {
                dhor = 0;
                dday++;
                  if(((dday == 32) && ((dmth == 1) || (dmth == 3) || (dmth == 5) || (dmth == 7) || (dmth == 8) ||(dmth == 10) ||(dmth == 12)))   
                    ||  ((dday == 31) && ((dmth == 4) || (dmth == 6) || (dmth == 9) || (dmth == 11)))
                    ||  ((dday == 30) && (dmth == 2) && (dyer % 4 == 0))
                    ||  ((dday == 29) && (dmth == 2) && (dyer % 4 != 0))) {
                      dday = 0;
                      dmth++;
                        if(dmth == 13) {
                          dmth = 0;
                          dyer++;
        }  }  }  }  }  }
  
  lcd.setCursor(0,0);
  lcd.print(dyer);
  lcd.print(colon);
  lcd.print((dmth / 10));
  lcd.print((dmth % 10));
  lcd.print(colon);
  lcd.print((dday / 10));
  lcd.print((dday % 10));
  lcd.print(colon);
  lcd.print((dhor / 10));
  lcd.print((dhor % 10));
  lcd.print(colon);
  lcd.print((dmin / 10));
  lcd.print((dmin % 10));
    lcd.setCursor(13, 1);
  lcd.print(colon);
  lcd.print((dsec / 10));
  lcd.print((dsec % 10));

  
  lcd.setCursor(0, 1);
  lcd.print("[");
  lcd.print(millis(), DEC);
  lcd.print("]");
  
  
  if(Serial.available() > 0) {
    tOffset = 500 - millis() % 1000;
    for(int i = 0; i<=14; i++) {
        str[i] = Serial.read();
        delay(5);
    }
    
    Serial.print("RECEIVED : ");
    Serial.print(str);
    Serial.print("  ");
      
    dyer = (((char) str[ 0])-48) * 1000 + (((char) str[ 1])-48) * 100
         + (((char) str[ 2])-48) *   10 + (((char) str[ 3])-48);
    dmth = (((char) str[ 4])-48) *   10 + (((char) str[ 5])-48);
    dday = (((char) str[ 6])-48) *   10 + (((char) str[ 7])-48);
    dhor = (((char) str[ 8])-48) *   10 + (((char) str[ 9])-48);
    dmin = (((char) str[10])-48) *   10 + (((char) str[11])-48);
    dsec = (((char) str[12])-48) *   10 + (((char) str[13])-48);
    
    latch = false;
    
    Serial.print("SET on : ");
    Serial.print(dyer);
    Serial.print(":");
    Serial.print(dmth);
    Serial.print(":");
    Serial.print(dday);
    Serial.print(":");
    Serial.print(dhor);
    Serial.print(":");
    Serial.print(dmin);
    Serial.print(":");
    Serial.println(dsec);
  }
}

void oclock() {
  tone(bzPin, 3520, 800);  // A8(うんと高いラ)
}  
  
void pi() {
  tone(bzPin, 1760, 60);  // A7(高いラ)
} 

あんまりコメントとか真面目に書いてなくてすみません m(_ _)m