#include #include /* * Day/Night time monitor (3872 bytes) * 2011.12.29 by radiopenchi * http://radiopench.blog96.fc2.com/ * input pin = 8, Hi=Day, LO=Night Time */ // initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); unsigned long timePassed; // 経過時間保持タイマー unsigned long lastNightTime = 0; unsigned long lastDayTime = 0; boolean dispFlag = false; // 表示ブリンクフラグ boolean nowIsDay; // TRUEなら今は昼 boolean lastIsDay; // TRUEなら前は昼 boolean nodata=true; void setup() { // Serial.begin(9600); lcd.begin(16, 2); //LCDのサイズ設定 pinMode(8, INPUT); //入力ピン digitalWrite(8, HIGH); //weak pul-up pin-1 pinMode(13, OUTPUT); // 動作モニタ、割込み処理中にON MsTimer2::set(1000, event1S); // 1秒毎に event1Sをコール MsTimer2::start(); } void loop() { } void event1S() { // タイマー割込み処理 digitalWrite(13, HIGH); // 割り込みがかかったことをLED表示 timePassed ++; // 経過時間をインクリメント if (digitalRead(8) == HIGH) { // 昼か夜かを読み取り、フラグセット nowIsDay = true; } else{ nowIsDay = false; } if ( nodata == true ){ // 以前のデータが無ければ、 nodata = false; // フラグを反転させ、 lastIsDay = nowIsDay; // 昼か夜だったかを記録して、おしまい。 } else{ if (nowIsDay != lastIsDay){ // 昼夜が変わっていたら、、、 lcd.noCursor(); // カーソルOnの場合があるので、消す if( nowIsDay == true ){ // 夜→昼の場合は、 lcd.setCursor(9, 0); dispHMS(timePassed); // 今日の夜の値を表示 lcd.setCursor(9,1); dispHMS(lastNightTime); // 前日の夜の値を表示 lastNightTime = timePassed; // 再使用するため保存 } else{ // 昼→夜になったなら、 lcd.setCursor(0, 0); dispHMS(timePassed); // 今日の昼の値を一行目に表示 lcd.setCursor(0,1); dispHMS(lastDayTime); // 前日の昼の値を二行目に表示 lastDayTime = timePassed; // 再使用するため保存 } timePassed = 0; // 時計をリセット lastIsDay = nowIsDay; } // 昼夜が変わっていた場合の処理完了 else{ // 昼夜が変わっていない場合は、 if( nowIsDay == true ){ // 昼なら、 lcd.setCursor(0, 0); dispFlag = ! dispFlag; // ブリンクフラグ反転 if( dispFlag == true ){ dispHMS(timePassed); // 現在値表示。 lcd.setCursor(6, 0); lcd.cursor(); // 現在値であることを示すためにカーソル点灯 } else{ lcd.noCursor(); dispHMS(lastDayTime); // 前日の値を移動 } } else{ // 夜なら、 lcd.setCursor(9, 0); dispFlag =! dispFlag; if( dispFlag == true ){ dispHMS(timePassed); // 現在値表示 lcd.setCursor(15, 0); lcd.cursor(); // 現在値であることを示すためにカーソル点灯 } else{ lcd.noCursor(); dispHMS(lastNightTime); // 前の値を移動 } } } } digitalWrite(13,LOW); // LED OFF } void dispHMS(unsigned long sec){ // 引数の値により、LCDにHH:MM.SS形式で書き込む unsigned long hh; unsigned long mm; unsigned long ss; unsigned long xx; hh = sec / 3600; // 時間 mm = (sec - hh * 3600) / 60; // 分 ss = (sec % 60); // 秒 xx = ss / 6; // 1/10分 if(hh < 10) lcd.print("0"); // 文字数調整(本当は文字列操作で2文字切り出すべき) lcd.print(hh); lcd.print(":"); if(mm < 10) lcd.print("0"); // 文字数調整 lcd.print(mm); lcd.print("."); lcd.print(xx); // 1/10分を表示 }