

通常はSPRESENSEをSleep状態にしておいて、タップスイッチ（buttonPower）で起床させようとしております。  
スケッチのset up内で以下のステップがあり、ボタンが変化すればクリックか長押しかを判定するルーチン（read_button）に至ります。  
attachInterrupt(buttonPower, read_button, CHANGE);  
read_buttonはクリック／長押しで環境変数を変化させ、スケッチのloopの中で長押しならばsleep、クリックならば起床というロジックを作ろうとしています。  
LowPower.coldSleep();  
一旦はCold
Sleepしてくれるのですが、すぐに再起動理由がbuttonPowerが押されたからと起きだしてしまいます。Serial.flush()、あるいはattachInterruptをやり直すなど色々試しましたが、うまく寝かしつけることができません。  
LowPower.disableBootCause(buttonPower);  
みたいなことをすれば台無しですし。

どなたかアドバイスいただけませんか？


CC BY-SA 4.0
2020-11-18T02:29:51.050
72025
2020-11-20T05:52:40.490
42343
question
spresense
SPRESENSE なかなか寝かせつけられない（arduino）


buttonのクリック/長押しやpress/releaseをどのように検出しているのか分かりませんが、  
attachInterrupt()のmodeが`CHANGE`なので、press長押しでCold
Sleepに入って、releaseしたときにその変化を検出して起床してしまっているということは無いでしょうか？ソースコードが添付されていればもう少し具体的なアドバイスができるかもしれません。

シンプルな実装例ですが、pressの時間が3秒以上であればCold Sleepに入る、Cold
Sleepに入る前にbuttonがreleaseされるまで待つようにすれば実現できそうな気がします。参考まで。

[code]

    #include <LowPower.h>
    
    uint8_t buttonPower = PIN_D33;
    unsigned long long pressTime = 0;
    
    void read_button()
    {
      if (LOW == digitalRead(buttonPower)) {
        pressTime = millis(); // pushed
      } else {
        pressTime = 0; // released
      }
    }
    
    void setup()
    {
      Serial.begin(115200);
    
      Serial.println("Power ON");
      ledOn(LED0);
    
      LowPower.begin();
    
      pinMode(buttonPower, INPUT_PULLUP);
      attachInterrupt(buttonPower, read_button, CHANGE);
    }
    
    void loop()
    {
      unsigned long long currentTime;
      unsigned long long diffTime;
    
      currentTime = millis();
    
      if (LOW == digitalRead(buttonPower)) {
        diffTime = currentTime - pressTime; // pushed
      } else {
        diffTime = 0; // released
      }
    
      if ((pressTime != 0) && (diffTime > 3000)) {
        Serial.println("Power OFF");
        ledOff(LED0);
        while (LOW == digitalRead(buttonPower));
        LowPower.coldSleep();
      }
    }
    
[/code]


CC BY-SA 4.0
2020-11-20T05:52:40.490
72090
2020-11-20T05:52:40.490
31378
72025
answer