LowPower doppeltes aufwachen,geht das ???

Guten Abend Leute,
habe folgende Frage-> ich versetze das Arduino Pro in schlaf mit
LowPower.powerDown(period, ADC_OFF, BOD_OFF);
also nach 8 Sekunde wacht er auf, ich wollte aber noch zusätzlich das er durch drücken eines Knopfes auch aufwacht, also mit
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
meine Frage geht es die beiden Sachen zu kombinieren? :o
klappt irgendwie nicht

ich wollte aber noch zusätzlich das er durch drücken eines Knopfes auch aufwacht,

Was hindert dich, einen externen Interrupt zu etablieren?

Was combie meint: im PowerDown sleep mode sind allfällig konfigurierte Interrupts (INT0, INT1 und Pin Change Interrupts) immer noch aktiv und falls ein solcher Interrupt detektiert wird, wacht der Arduino auf, auch wenn Du den Watch Dog konfiguriert hast. Du solltest im entsprechenden Interrupt-Handler einfach auch den Watchdog noch deaktivieren, damit Du von der Seite keine Überraschungen erlebst. Dein Knopf müsste also einen Hardware-Interrupt auslösen, welchen der oben genannten, das ist eigentlich egal, und schon funktioniert's.

pylon: Was combie meint: im PowerDown sleep mode sind allfällig konfigurierte Interrupts (INT0, INT1 und Pin Change Interrupts) immer noch aktiv und falls ein solcher Interrupt detektiert wird, wacht der Arduino auf, auch wenn Du den Watch Dog konfiguriert hast. Du solltest im entsprechenden Interrupt-Handler einfach auch den Watchdog noch deaktivieren, damit Du von der Seite keine Überraschungen erlebst. Dein Knopf müsste also einen Hardware-Interrupt auslösen, welchen der oben genannten, das ist eigentlich egal, und schon funktioniert's.

kriege es nicht hin, kann ich da ein beliebige Pin nehmen oder muss es der Pin 2 sein? habe folgendes ausprobiert.

// **** INCLUDES *****
#include "LowPower.h"

// Use pin 2 as wake up pin
const int wakeUpPin = 2;

void wakeUp()
{
    // Just a handler for the pin interrupt.
}

void setup()
{
    // Configure wake up pin as input.
    // This will consumes few uA of current.
    pinMode(wakeUpPin, INPUT);   
}

void loop() 
{
    // Allow wake up pin to trigger interrupt on low.
    attachInterrupt(0, wakeUp, LOW);
    
    // Enter power down state with ADC and BOD module disabled.
    // Wake up when wake up pin is low.
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
    
    // Disable external pin interrupt on wake up pin.
    detachInterrupt(0); 
    
    // Do something here
    // Example: Read sensor, data logging, data transmission.
}

Habs pisel geändert läuft immer durch,kein einschlafen :o

// **** INCLUDES *****
#include "LowPower.h"

// Use pin 2 as wake up pin
const int wakeUpPin = 2;

void wakeUp()
{
    // Just a handler for the pin interrupt.
    Serial.println("  wakeUp !!!");
    delay(1000);  

}

void setup()
{  
     Serial.begin(9600);
    // Configure wake up pin as input.
    // This will consumes few uA of current.
    pinMode(wakeUpPin, INPUT);
    Serial.println("schlafen und aufwachen !!!"); 
    delay(200);  
}

void loop() 
{
    // Allow wake up pin to trigger interrupt on low.
    attachInterrupt(0, wakeUp, LOW);
    
    // Enter power down state with ADC and BOD module disabled.
    // Wake up when wake up pin is low.
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
    
    // Disable external pin interrupt on wake up pin.
    detachInterrupt(0); 
    
    // Do something here
    // Example: Read sensor, data logging, data transmission.
    Serial.println("ENDE Aufgewacht !!!");
     delay(200);  
}

hab jetzt die Interne Pullup zugeschaltet da funktioniert es nur mit Pin 2. aber bin weit entfernt vom das was ich wollte.

aber bin weit entfernt vom das was ich wollte.

Doppeltes Aufwachen? Das kannste knicken.

combie: Doppeltes Aufwachen? Das kannste knicken.

also wen ich dich richtig verstanden habe geht's entweder mit Interrupt oder durch Timer aber nicht beides. Richtig?

Nur, und ausschließlich, per Interrupt. Es gibt in der Realität keine Alternative. (auch wenn deine Fantasie was anderes behauptet)

combie:
Nur, und ausschließlich, per Interrupt.
Es gibt in der Realität keine Alternative.
(auch wenn deine Fantasie was anderes behauptet)

okay , für mich ist Interrupt irgendein Ereignis was mit einem Hardware pin zu tun hat. Aber wo ich das jetzt übersetzt habe, heißt ja " Unterbrechen" ,dann verstehe ich deine Antwort. Englisch < 5 % ,gut das es Google gibt. Danke!
und meine Fantasie-> der Kontroller schläft ein wacht 1x pro Stunde auf empfängt Daten und geht wieder schlafen, aber wen man innerhalb des Schlafens den einen Knopf (Motor rechts) oder Knopf( Motor links) betätigt wacht er auf und verstellt den Anker und geht weiter schlafen. Das einschlafen und aufwachen nach einer bestimmter Zeit klappt aber das mit den Knöpfen noch nicht.

okay , für mich ist Interrupt irgendein Ereignis was mit einem Hardware pin zu tun hat.

Es gibt viele weitere Interruptquellen.

Das einschlafen und aufwachen nach einer bestimmter Zeit klappt aber das mit den Knöpfen noch nicht.

Hmm... Sorge dafür, dass deine Knöpfe Interrupts auslösen! INT0 und INT1 sind an Pin2 und 3 gebunden. Alle können PCINTs auslösen. (Ausnahme A6 und A7) ATMEGA328 Und schalte den WDT ab, aber das wurde schon gesagt....

combie: Es gibt viele weitere Interruptquellen.Hmm... Sorge dafür, dass deine Knöpfe Interrupts auslösen! INT0 und INT1 sind an Pin1 und 2 gebunden. Alle können PCINTs auslösen. (Ausnahme A6 und A7) ATMEGA328 Und schalte den WDT ab, aber das wurde schon gesagt....

Watchdog benutze ich nicht ich habe die include "LowPower.h" . bei mir sint die Knöpfe Pin 6 und 7 ,da fehlt mir die Grütze um das auf die Pins zuzuschneiden,aber ich fersuche es........Trotzdem Danke combie .

Merke! Stichwort: PCINT

Watchdog benutze ich nicht

Glaube ich dir nicht. Denn, wenn du es nicht siehst, kann es doch existent sein. Bedenke: Die Libs beschützen dich, vor solchen komplizierten Details. Wobei das auch mal eine unbeabsichtigte Falle bilden kann.

combie:
Merke!
Stichwort: PCINT
Glaube ich dir nicht.
Nur, wenn du es nicht siehst, kann es doch existent sein.
Bedenke: Die Libs beschützen dich, vor solchen komplizierten Details.
Wobei das auch mal eine unbeabsichtigte Falle bilden kann.

Du hast recht Watchdog habs gefunden bei (#include <avr/wdt.h>), wen ich das untere richtig verstehe ,kann ich nur die Pin 2 und 3 benutzen…

However, older sketches often have direct interrupt numbers. Often number 0 (for digital pin 2) or number 1 (for digital pin 3) were used. The table below shows the available interrupt pins on various boards.

combie versucht Dich zum selbst lernen zu animieren. Deine LowPower-Bibliothek verwendet den Watchdog, um den Schlaf-Timeout bereitzustellen. Dieser verwendet natürlich auch einen Interrupt, um aus dem Schlafmodus zu erwachen, es ist also immer ein Hardware-Interrupt, der den Prozessor weckt. Externe Interrupts können über Pin 2 und 3 mit Unterstützung der Arduino-Bibliotheken aktiviert werden. Wenn Du einen Interrupt auf fast beliebigen Pins auslösen willst, musst Du die von combie erwähnten Pin Change Interrupts verwenden. Die werden über direkte Register-Manipulationen aktiviert, wecken dann aber auch den ATmega auf. Wie das geht, ist im Arduino-Playground (http://playground.arduino.cc/Main/PcInt) beschrieben.
Alles klar?

combie versucht Dich zum selbst lernen zu animieren.

Ja, aber ich versage oft daran. Selbst das Stichwort PCINT verhallte hier ungehört.

Aus meiner Sicht, sollte man, wenn man hört, dass ein Interrupt den Prozessor wecken kann/muss, sich alle möglichen Interrupts genau anschauen. Dann wird aus raten auch irgendwann wissen.

pylon: combie versucht Dich zum selbst lernen zu animieren. Deine LowPower-Bibliothek verwendet den Watchdog, um den Schlaf-Timeout bereitzustellen. Dieser verwendet natürlich auch einen Interrupt, um aus dem Schlafmodus zu erwachen, es ist also immer ein Hardware-Interrupt, der den Prozessor weckt. Externe Interrupts können über Pin 2 und 3 mit Unterstützung der Arduino-Bibliotheken aktiviert werden. Wenn Du einen Interrupt auf fast beliebigen Pins auslösen willst, musst Du die von combie erwähnten Pin Change Interrupts verwenden. Die werden über direkte Register-Manipulationen aktiviert, wecken dann aber auch den ATmega auf. Wie das geht, ist im Arduino-Playground (http://playground.arduino.cc/Main/PcInt) beschrieben. Alles klar?

so halbwegs.......Danke

Habs geschaft :wink: :wink: :wink: Pin 6 und 7

#include "LowPower.h"
    int milliseconds1;

    
    // Install Pin change interrupt for a pin, can be called multiple times
    int mal; 
    void setup() { 
    Serial.begin(9600); 
    int i;
    for (i=6; i<=8; i++)
          digitalWrite(i,HIGH);  // pinMode( ,INPUT) is default
           pinMode(13,OUTPUT);  // LED
    // enable interrupt for pin...
      pciSetup(6);
      pciSetup(7);
     
    }
     
     
    void loop() {
      // Nothing needed
      mal=0;
         //digitalWrite(13,LOW);
         //delay(2000);
         //pinMode(13,OUTPUT); 
        Serial.println("LOOP !!"); 
        delay1(8000);  //8 oder 4,2,1sec.->15millisec schlafen  
    }


void delay1( int milliseconds)
 {
  
  Serial.println("schlafe ein !"); 
  delay(200);
  while (milliseconds >= 8000) { sleep(SLEEP_8S); milliseconds -= 8000;
   milliseconds1=milliseconds;
  }
  if (milliseconds >= 4000)    { sleep(SLEEP_4S); milliseconds -= 4000; }
  if (milliseconds >= 2000)    { sleep(SLEEP_2S); milliseconds -= 2000; }
  if (milliseconds >= 1000)    { sleep(SLEEP_1S); milliseconds -= 1000; }
  if (milliseconds >= 500)     { sleep(SLEEP_500MS); milliseconds -= 500; }
  if (milliseconds >= 250)     { sleep(SLEEP_250MS); milliseconds -= 250; }
  if (milliseconds >= 125)     { sleep(SLEEP_120MS); milliseconds -= 120; }
  if (milliseconds >= 64)      { sleep(SLEEP_60MS); milliseconds -= 60; }
  if (milliseconds >= 32)      { sleep(SLEEP_30MS); milliseconds -= 30; }
  if (milliseconds >= 16)      { sleep(SLEEP_15MS); milliseconds -= 15; }
 
}

/*
 * Verwendet LowPower-Bibliothek zum Aktivieren des Schlafmodus der CPU.
 */
void sleep(period_t period) {
  LowPower.powerDown(period, ADC_OFF, BOD_OFF); 
}


void pciSetup(byte pin)
    {
        *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));  // enable pin
        PCIFR  |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
        PCICR  |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
    }
     
    ISR (PCINT2_vect) // handle pin change interrupt for D0 to D7 here
     { 
        //digitalWrite(13,digitalRead(7));
          Serial.println("Knopf gedrueckt ");
        
      }

geht das den auch so, dass der Mini (Empfänger) aufwacht sobald Daten gesendet werden????habe gegoogelt aber nichts so richtig was verstanden. :confused: hmmm glaube nicht.....

Was sicher funktioniert, ist den Arduino einfach in den Idle-Mode zu schicken, daraus erwacht er bei jedem IO von selbst. Dabei sparst Du aber selbstverständlich viel weniger Strom.

Da Du nur mit 9600 baud überträgst, könnte es genügen, wenn Du die serielle Schnittstelle vor dem Schlafenlegen deaktivierst, den PCINT auf Pin 0 aktivierst und dann in der Interrupt-Routine den PCINT deaktivierst und gleich die serielle Schnittstelle aktivierst. Das wäre allerdings ein ziemlicher Hack und ich müsste mal durchrechnen, ob das vom Timing her überhaupt aufgehen könnte. Auch müsste man überprüfen, ob die Hardware der seriellen Schnittstelle noch korrekt funktionieren kann, wenn sie die erste Flanke verpasst hat.

Wenn Du uns verrätst, wie Du Dein Projekt verschaltet hast, können wir Dir vielleicht eine Alternative zeigen.