一定時間で自動施錠や自動スリープ
条件に合致したら自動施錠。開いたときに施錠する時間を決めておくという考え方で作った。
・開いて一定時間で自動施錠 これはまさに決められた施錠時間が来たら閉めるし、close_flagを立てておく。
・自動施錠した後に一定時間でスリープする。
・電源を入れただけで、開錠しないまま一定時間過ぎたらスリープする。
この2つは入れないでテストしていたら、電力供給がいつまでたっても切れず、電池がすぐになくなってしまった失敗から。
一定量減ってしまうと、Arduinoだけでも電力供給多めとして判断されるみたい。
参考にしたサイト等
【Arduino】sleepを利用して電力消費を抑えてみた
このサイトにも大量の参考になるサイトがリンクされている。大変助かった。
外部タイマーやWatchdogなど、様々なWakeupの方法があるもんだと感心。
自動施錠などの箇所の抜粋
void loop() { MFRC522::MIFARE_Key key; // 開いて一定時間で自動施錠 checktime = millis(); if (unlocktime != 0 && unlocktime < checktime ){ //Serial.println(unlocktime); //Serial.println(checktime); servodegree = 180; myservo.write(servodegree); // deglee 180 is lock close_flag = true; // 閉めたら1 sleeptime = unlocktime + 60000; } // 自動施錠した後に一定時間でスリープする if (sleeptime != 0 && sleeptime < checktime ){ //Serial.println(checktime); //delay(3000); ADCSRA &= ~(1 << ADEN); // ADENビットをクリアしてADCを停止(120μA節約) set_sleep_mode(SLEEP_MODE_PWR_DOWN); // パワーダウンモード sleep_enable(); sleep_mode(); // ここでスリープに入る } // 電源を入れただけで、開錠しないまま一定時間過ぎたらスリープする。 // 何も無かった場合、最終行のdelay 1000で1秒待機なので、300秒=5分の計算 if(sleeptime == 0 && unlocktime == 0 && pulse_count > 300){ ADCSRA &= ~(1 << ADEN); // ADENビットをクリアしてADCを停止(120μA節約) set_sleep_mode(SLEEP_MODE_PWR_DOWN); // パワーダウンモード sleep_enable(); sleep_mode(); // ここでスリープに入る } |