Skip to content

Instantly share code, notes, and snippets.

@CLCL
Created August 10, 2014 10:49
Show Gist options
  • Save CLCL/daf75d5d19a6bf1782a2 to your computer and use it in GitHub Desktop.
Save CLCL/daf75d5d19a6bf1782a2 to your computer and use it in GitHub Desktop.
/* 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