#include #include /* * Day/Night time monitor (3716 bytes) * 2011.12.24 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){ // 昼夜が変わっていたら if( nowIsDay == true ){ // 夜→昼になったなら、 lcd.setCursor(9, 0); dispHMS(timePassed); // ブリンク中で消えている場合があるので再表示 lastNightTime = timePassed; // 再使用するため保存 lcd.setCursor(0, 1); // 昼の最後の値を二行目に移す dispHMS(lastDayTime); } else{ // 昼→夜になったなら、 lcd.setCursor(0, 0); dispHMS(timePassed); // ブリンク中で消えている場合があるので再表示 lastDayTime = timePassed; // 再使用するため保存 lcd.setCursor(9, 1); // 夜の最後の値を二行目に移す dispHMS(lastNightTime); } timePassed = 0; // 時計をリセット lastIsDay = nowIsDay; } else{ // 昼夜が変わっていない場合は、 if( nowIsDay == true ){ // 昼なら、 lcd.setCursor(0, 0); } else{ lcd.setCursor(9, 0); // 夜なら、 } dispFlag = ! dispFlag; // ブリンクフラグ反転 if( dispFlag == true ){ dispHMS(timePassed); // 表示。所要時間は2.6mSくらいかかる } else{ lcd.print(" "); // 表示を消す } } } 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分を表示 }