Schlafenlegen, Aufwachen nach Timer und Interrupt

Hallo zusammen,
ich möchte ein batteriebetriebenes System mit dem Arduino Uno bauen. Daher ist es interessant die Stromaufnahme zu minimieren. Das wollte ich schaffen, indem ich den Arduino für die Zeit, in der er nichts zutun hat, schlafen legt. Nach einem gewissen Intervall soll er aufwachen und eine Aktion ausführen. Außerdem soll er erwachen wenn ein Interrupt angelegt ist.
Ich habe 2 Interrupts an Pin2 und Pin3. Daher kann ich kein RTC Modul nehmen, das einen Alarm sendet. Ich wollte das über den Watchdog lösen. Es gibt eine Bibliothek <Sleep_n0m1.h>, die damit arbeiet. Allerdings bin ich nicht so versiert beim Registerlesen /schreiben. Die Dokumentation ist ein Rätsel für mich.

Bei meinem Versuch wacht der Arduino nicht durch den Interrupt auf. Kennt ihr eine Lösung?

boolean toggle;
int Zeitalt;
int Zeitneu;
byte richtigesSignal;
#include <Sleep_n0m1.h>
//element namens sleep der Klasse Sleep
Sleep sleep;

/*zuerst wird Zeitalt auf Zeitneu gesetzt
dann wird geprüft ob ein Interrupt vorhanden war und dann Zeitneu gesetzt
wenn er ein verwertbares signal ist, dann wird 1 zurück gegeben
danach wird einmal warten ausgegeben
danach wird auf interrupt geprüft, falls ja wird Interrupt ausgegegeben und die Interrupt variable zurückgesetzt
Anschließend schläft der Arduino für 2 Sekunden.
wird während der 2 sekunden ein signal erkannt beginnt alles von vorne.
*/

void setup() {
Serial.begin(9600);
//pinMode(2,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), sensor1, RISING);

}

void loop() {
// put your main code here, to run repeatedly:
signalbereinigung();
Serial.println ("warten");
delay(10);
if (richtigesSignal) {
Serial.println ("Interrupt");
toggle = 0;
}

delay(5);

//sleep.pwrDownMode(); //set sleep mode
//sleep.sleepDelay(2000); //sleep for: sleepTime 2s
}

//ISR
int sensor1 () {
toggle = 1;
}
//unterfunktion um die Interrup signale zu säubern
void signalbereinigung() {
Zeitalt = Zeitneu ;
if (toggle) {
Zeitneu = millis();
}
if (Zeitneu - Zeitalt > 100) {
richtigesSignal = 1;
return richtigesSignal;
}
if (Zeitneu - Zeitalt < 100) {
richtigesSignal = 0;
return richtigesSignal;
}
}

Die von dir genannte Library hat speziell die Methode sleepPinInterrupt .

Was ist damit?

Code gehört übrigens in code tags, im übrigen: herzlich willkommen im Forum :slightly_smiling_face:

Möglicherweise solltest Du das alles nochmal nachlesen und überdenken. PCINT Interrrupts kann man mit jedem beliebigen Pin erzeugen, das ist erst mal keine Einschränkung.

Wenn Du einen internen Timer-Interrupt benutzen möchtest, dann darf Dein Sleepmode den Prozessor-Takt nicht abschalten, und das kostet Strom.

Der Arduino UNO ist ungeeignet für Low Power Applikatinen. Mit dem Sleep-Modus schickst Du nur die Hälfte der Hardware schlafen. Die andere Hälfte samt LED verbrauchen frölich weiter Strom. Nur U4 geht schlafen. U2,U3 und U5 verbrauchen weiterhin Strom auch green ON LED. Je nachdem Du den Arduino mit Strom versorgst kann auch U1 ein RiesenLeistungsverschwender werden, auch leicht über 50% der vom Arduino aufgenommen Leistung.

Nimm einen Arduino MINI, PRO MINI ode deren Nachbauten. Die haben nur das Minimum auf der Platine und ein Sleep mode spart da richtig Strom. Zum Programmieren braucht es einen USB to TTL Adapter oder einen ISP-Programmierer.
Grüße Uwe

Hi Michael,
vielen Dank für deine Antwort. Ja meine Frage war ja ob man gleichzeitig über einen TImer und einen Toggle Interrupt den Arduino wecken kann. Soweit ich die Bibliothek verstanden habe, kann entweder das eine oder das andere genutzt werden, allerdings nicht beides, oder hab ich einen Denkfehler?

Ja, da gibt es keine Einschränkung.

Hi,
oh man vielen Dank, du hast mir die Augen geöffnet. Das macht das ganze natürlich wesentlich einfacher. Dann würde ich es bevorzugen über RTC einen Alarm zu senden. Meine anderen zwei Interrupts sind ja nur Statuswechsel Interrupts, sodass dies über PCINT realisiert werden können.

Sehr guter Einwurf! Ist der Mini vergleichbar mit dem UNO?

Also funktioniert es so, dass auch Interrupts während des SleepDelay aufgerufen werden?

sleep.pwrDownMode](https://sleep.pwrdownmode/)(); //set sleep mode
sleep.sleepDelay](https://sleep.sleepdelay/)(2000); //sleep for: sleepTime
sleepPinInterrupt ();

Er hat den selben Controller, nur keinen USB Anschluß.
Zum Testen kann man ihn auf ein Steckbrett stecken, er hat nur Kontaktstifte und keine Buchsen.

Dein Code ist offensichtlich Murks. Mach's nochmal, Sam :wink:

Hier der Schaltplan des Arduino PRO MINI. Da ist nur der Controller in Minimalbeschaltung (nur das was notwendig ist damit er funktioniert) und ein 5V oder 3,3V Spannungsstabilisator der eine Lötbrücke nachgeschaltet hat die für Sparanwendungen durchtrennt werden kann.
Es gibt noch eine LED an PIn 13 welche zum Unterschied am UNO mittels eines Operationsverstärker entkoppelt ist.

[EDIT] Klarstellung:
Der UNO hat den Operationsverstärker. Der MINI / PRO MINI hat keinen.
[/EDIT]

Grüße Uwe

Der von Dir erwähte Operationsverstärker glänzt in dem von Dir verlinkten Schaltplan mit hartnäckiger Abwesenheit. Entweder stimmt Deine Aussage, dass da ein Operationsverstärker drauf ist, NICHT, oder der Schaltplan ist Murks, unvolständig , absolut unbrauchbar. Denn ein Schaltplan , der nicht ALLLE verbauten Komponenten enthält, ist definitiv Murks, und sollte nicht in Umlauf gebracht werden.

Ok, ich spreche meistens nicht Hochdeutsch und viel italienisch aber meines Verständisses der deutschen Sprache ist der Satz so zu verstehen daß der UNO den OpAmp hat.

Grüße Uwe

Nun ja, Deutsch ist auch nicht meine Sprache, war es noch nie. Dennoch kann dein Satz eben sehr gut genau andersrum verstanden werden.
Ich selber weiss natürlich, dass der Mini diesen OPA eben nicht hat, der UNO aber schon.
Anfänger könnte Deine Formulierung aber durchaus in die Irre führen. Aber es ist natürlich verständlich, dass da eine Formulierung mal etwas anders ausfällt, wenn man in der Regel eine andere Sprache spricht.

Habs explizit klargestellt.
Grüße Uwe

1 Like

@uwefed
:+1: :+1: :+1:

Also ich hab mir Mal den arduino pro Mini angeschaut. Der passt super. Stromsparender wäre wahrscheinlich der 3,3V oder ist das ein Trugschluss? Schaffe ich es denn mit einem sleepmode den Stromverbrauch der angeschlossenen Geräte ( Sensoren mit LED und l298n) zu minimieren bzw solange diese nicht benötigt werden komplett vom Stromnetz zu trennen?
Wie stelle ich das am besten an? Als Stromquelle nützte ich einen 12V 20000mA Akku.

Der 3,3V pro Mini benötigt im Betrieb noch etwas weniger Srtom, als der 5V, auch deshalb da der 3,3V nur mit 8 MHz taktet.
Bei den Sensoren mit LED kannst Du diese natürlich, wenn Die LED für den Sensor nicht zwingend notwendig ist (bspw, ist die IR LED auf einem IR-Reflex-Sensor ja zwingend notwendig) auch entfernen, dann wird der Sensor Stromsparender. Teils Sensoren/Module können auch mittels Befehl, und/oder einem Enable Pin in einen Sleep, oder Stromspar-Modus gesetzt werden. Dazu must Du die Datenblätter der jeweiligen Sensoren/Module oder die Datenblätter der Darauf verbauten Chips/Controler zu Rate ziehen. Manchmal hilft auch ein Blick in die Verwendeten Libs zu den Sensoren, ob diese eine Sleep Funktion haben. Man kann Module , die Keinen Sleep oder Stromsparmodus besitzen, auch mittels P-Mosfet Transistoren abschalten, jedoch muss man dabei berücksichtigen, dass dann nicht das Modul versucht, sich seine Betriebsspannung über die Signalleitungen zu holen.