sleep mode und Taster Entprellung - Zwickmühle

Hallo,

wie macht man das am dümmsten?

Wenn der µC normal läuft, habe ich meine Taster mittels Bounce2 Library mit 30ms entprellt. Funktioniert.
Jetzt habe ich einen Taster mit in die sleep Funktion eingebaut zum aufwecken. 2. Interrupt. Entweder wird der µC vom RTC Alarmsignal geweckt oder durch den Taster. Der Taster schaltet normal mein BT-Modul ein und aus. Immer auf erneutes drücken hin. Damit wecke ich jetzt auch den µC und schalte zu gleich das BT-Modul ein. Ich kann es auch wieder ausschalten und der µC legt sich wieder schlafen. Ich kann es aber während er jetzt schläft nicht nochmal per Taster einschalten. Muß warten bis die RTC ihn geweckt hat. Ich nehme an, dass hängt mit der 30ms Entprellzeit zusammen, die er im Sleepmode nicht setzen/zählen kann. Ich kann aber nicht die Entprellzeit von 30 auf 0 runternehmen, dann schaltet das BT Modul wild ein und aus je nach Tasterprellen wenn er nicht schläft.

Muß man zwingend zum aufwecken einen extra Taster spendieren? Oder gibts andere Tricks?

Oder kann man ganz frech versuchen die Definition der Bounce2 Library mehrfach mit unterschiedlichen Entprellzeiten aufzurufen bzw. einzustellen?

debouncer2.attach(Taster_BTmodul);
debouncer2.interval(30); // Entprellzeit 30ms

Edit:

so einfach ist es nicht, folgendes funktioniert nicht, wollte einfach vorm sleep und danach den Wert ändern

debouncer2.interval(0); // Entprellzeit auf 0ms setzen
sleepNow();
debouncer2.interval(30); // Entprellzeit 30ms

Taster in Hardware per RC-Glied entprellen?

http://www.mikrocontroller.net/articles/Entprellung#Hardwareentprellung

Hallo,

Hardwareentprellung wäre eine Möglichkeit die bestimmt zum Ziel führt. Nur dachte ich man kann alles in Software lösen. Wofür hat man einen µC. :wink:

Hallo,

also mit dem wilden Testcode passiert irgendwas in die richtige Richtung. Ich kann das BT-Modul ein- und schalten während der einen Minute Schlafzeit. Einschalten geht sehr holprig, ausschalten geht sofort. Vielleicht muß ich mir noch einen zusätzlichen Schaltzustand merken oder die Befehlsreihenfolge ändern oder so. Da muß ich mal weiter nachdenken ....

debouncer2.interval(1);    // Entprellzeit ms
debouncer2.update();
debouncer2.read();

sleepNow();
   
debouncer2.interval(1);    // Entprellzeit ms
debouncer2.update();
debouncer2.read();

Hallo,

ich glaube jetzt habe ich den richtigen Ansatz. Wenn ich den Taster zum BT-Modul einschalten und zum wecken an einen Interrupt gekoppelt habe, dann muß ich natürlich auch die zugehörige Interruptroutine nutzen. Ich darf jetzt nicht mehr für diesen Taster die Bounce2 Library verwenden. Ich denke jetzt wird es. Funktioniert schon, nur die Entprellung fehlt noch und die Interruptroutine sollte ich noch kürzer machen und den Rest wieder auslagern.

Hallo,

ich hab's einfach drauf :smiley:

Möchte das Endergebnis melden. Auszugsweise, den kompletten Code mit 42 kByte überblickt eh keiner mehr der nicht drin steckt. Ausgeschalten wird dann entweder nach Zeit x automatisch oder ich schicke über BT einen Befehl rüber der _state_BT wieder auf HIGH setzt.

// globale Variable
boolean _state_BT = HIGH;            // Schaltzustand, P-Channel Mosfet > BT ausgeschalten

// setup
digitalWrite(_BT_Modul_Pin, _state_BT);    // Bluetooth Modul, P-Channel Mosfet > BT ausgeschalten
pinMode(_BT_Modul_Pin, OUTPUT);   // Bluetooth Modul

// loop
BT_Modul_schalten();  // Bluetooth Modul einschalten mittels Interrupt-Taster

wenn "_state_BT" gleich "HIGH" ist und andere Bedingungen erfüllt sind, darf sich der µC schlafen legen

// Interrupt Routine INT-1 (Taster an Pin 2)
void wakeUpNow1()
{
  // wenn LOW Signal vom Interrupt-Taster erkannt, schalte BT Modul ein bzw. mit nächsten LOW wieder aus
  if ( _state_BT == HIGH ) {
    _state_BT = LOW;          // BT-Modul einschalten, P-Channel Mosfet
  }  
}  

void BT_Modul_schalten ()
{
  static byte state_LED = LOW;
  static boolean BT_activ = false;
  static unsigned long millis_LED = 0;
  static unsigned long millis_BT_ON = 0;
    
  // wenn LOW Signal vom Taster erkannt, schalte BT Modul ein oder nach Zeit x wieder aus
  if ( _state_BT == LOW && BT_activ == false ) {
    BT_activ = true;
    millis_BT_ON = millis() + 300000;   // EIN-Zeitpunkt + 5 min merken
    digitalWrite(_BT_Modul_Pin, _state_BT);  
  } 
  
  if ( BT_activ == true && millis() > millis_BT_ON)  {   // nach obiger Zeit automatisch ausschalten
      _state_BT = HIGH;
      BT_activ = false;
      digitalWrite(_BT_Modul_Pin, _state_BT);
  }
  
  // wenn BT ein, dann lasse LED flashen
  if (_state_BT == LOW)  {                           // wenn _state_BT LOW, dann
     if (state_LED == LOW && millis() > millis_LED )  {
       digitalWrite(_BT_Modul_LED, HIGH);            // LED einschalten für
       millis_LED = millis() + 50;                   // 50ms
       state_LED = HIGH;
     }
     if (state_LED == HIGH && millis() > millis_LED )  {
       digitalWrite(_BT_Modul_LED, LOW);             // LED ausschalten für
       millis_LED = millis() + 2000;                 // für 2 Sekunden
       state_LED = LOW;
     }   
  }  
  else digitalWrite(_BT_Modul_LED, LOW);             // wenn _state_BT HIGH, dann ausschalten
}