一定時間で自動施錠や自動スリープ(シムシムのArduinoスケッチ詳細)

一定時間で自動施錠や自動スリープ

条件に合致したら自動施錠。開いたときに施錠する時間を決めておくという考え方で作った。
・開いて一定時間で自動施錠 これはまさに決められた施錠時間が来たら閉めるし、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(); // ここでスリープに入る
  }