Created
August 10, 2014 10:49
-
-
Save CLCL/daf75d5d19a6bf1782a2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Delayを使わないArduino時計 | |
Arduinoにはシステム時刻があって、RTCを持たないArduinoでは | |
起動時必ず1970/01/01T00:00:00Z(UNIX epoch)に初期化されています | |
Arduinoのコンパイラでは__DATE__定数と__TIME__定数が使えますので、 | |
コンパイル時に埋め込まれるこれらの定数を利用してシステム時刻を | |
設定します。 | |
当然ながら、コンパイル時にコンパイラがあるシステムの時刻が定数 | |
として埋め込まれますので、コンパイル直後以外のArduinoリセット時 | |
には時刻が狂うことになります。 | |
DS1307RTCのライブラリを参考にした。 | |
*/ | |
#include <Time.h> // 日付・時刻と時間構造体を取り扱うライブラリ | |
#include <TimerOne.h> // Arduino(AVR)のタイマ割り込みを取り扱うライブラリ | |
// 必要に応じてMsTimer2.hの仕様も検討 | |
// __DATE__パース用関数 getDate() で使う定数 | |
const char *monthName[12] = { | |
"Jan", "Feb", "Mar", "Apr", "May", "Jun", | |
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" | |
}; | |
// 時刻オブジェクト(日付の演算をこれで行って、システム時刻に設定する) | |
tmElements_t tm; | |
void setup() { | |
// 動作確認用 LED | |
pinMode(13, OUTPUT); | |
// 時刻パース | |
bool parse = false; | |
// コンパイラ起動時に__DATE__と__TIME__に定数が入るはず | |
if (getDate(__DATE__) && getTime(__TIME__)) { | |
parse = true; | |
time_t t = makeTime(tm); | |
setTime(t); | |
} | |
// パース出来ない場合は 1970-01-01T00:00:00Zからスタート | |
// シリアルモニタ通信 | |
Serial.begin(9600); // (Arduino IDEのシリアルコンソールのデフォルトは9600bps) | |
while (!Serial) ; // Adruinoの特定バージョンではシリアルモニタ起動時まで監視する | |
delay(200); | |
// タイマ割り込み設定。delayよりも正確に表示タイミングが入る | |
Timer1.initialize(1000000); // 1秒 | |
Timer1.attachInterrupt( timerIsr ); // 1秒ごと割り込みで呼ばれるコールバック関数を指定する | |
} | |
void loop() { | |
// タイマ割り込みにより処理が実行されるので、 | |
// メインループは空です | |
} | |
// Timer1によるタイマ割り込みで呼ばれるルーチン | |
void timerIsr() { | |
digitalClockDisplay(); | |
//flash_pin13led(); | |
} | |
// シリアルポートに日付文字列を出力します | |
void digitalClockDisplay(){ | |
// digital clock display of the time | |
char datestrings[31]; | |
sprintf(datestrings, "%4d-%02d-%02dT%02d:%02d:%02d %010lu", | |
year(), month(), day(), hour(), minute(), second(), now() | |
); | |
Serial.print(datestrings); | |
Serial.println(); | |
} | |
// __TIME__パース用関数 | |
bool getTime(const char *str) | |
{ | |
int Hour, Min, Sec; | |
if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false; | |
tm.Hour = Hour; | |
tm.Minute = Min; | |
tm.Second = Sec; | |
return true; | |
} | |
// __DATE__パース用関数 | |
bool getDate(const char *str) | |
{ | |
char Month[12]; | |
int Day, Year; | |
uint8_t monthIndex; | |
if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false; | |
for (monthIndex = 0; monthIndex < 12; monthIndex++) { | |
if (strcmp(Month, monthName[monthIndex]) == 0) break; | |
} | |
if (monthIndex >= 12) return false; | |
tm.Day = Day; | |
tm.Month = monthIndex + 1; | |
tm.Year = CalendarYrToTm(Year); | |
return true; | |
} | |
void flash_pin13led() { | |
digitalWrite(13, HIGH); // LED を点滅 | |
delay(10); | |
digitalWrite(13, LOW); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment