Stromspartipps Arduino nano

Gast #5756043
Lesenswert?
• ▲
▼
Hallo,
ich habe da mal eine Frage zur Programmierung eines Arduino nano.
Ich möchte so viel Strom sparen wie möglich. Leider habe ich es bis 
jetzt noch nicht hinbekommen den Arduino in den Sleep-Modus zu 
versetzen. Da bin ich aber noch dabei. Was mir dabei aber durch den Kopf 
gegangen ist, ist ob es noch auf Seite der Programmierung 
Optimierungsmöglichkeiten gibt.
Also gewisse Schleifen, Funktionen oder ähnliches zu meiden und dafür 
andere Routinen zu nutzen weil eben diese sehr viel Energie verbrauchen.
So stellt sich mir die Frage, ob z.B. der Delay-Befehl sinnvoll ist oder 
nicht. Also ob eine Schleife mit delay weniger Energie benötigt wie die 
gleiche Schleife mit delay um z.B. einen Taster abzufragen.
Gibt es eine Übersicht welcher Befehl wie viel Energie benötigt?

mfg
TC
#5756050
Lesenswert?
• ▲
▼
Die Befehle brauchen alle gleich viel energie.
Du musst deine Programme also schnell machen, damit wenig Zeit vergeht.
Taktfrequenz ist auch noch ein Faktor. der 16MHz-Arduino braucht mehr 
Strom als der 8MHz.
Letzterer braucht aber doppelt so lange. Möglicherweise ist aber 
trotzdem eine Ersparnis möglich, weil 8M z.B. nur 45% des Stroms der 16M 
verbraten.

Außerdem ist es die Peripherie, die Strom frisst.
Also alles abschalten, was nicht benötigt wird.
Gast #5756055
Lesenswert?
• ▲
▼
Theoretisch ja, aber wirklich sinnvoll ist das nicht weil das 
Einsparpotential doch sehr gering ist.
Deutlich mehr sparst du wenn du nicht benötigte Komponenten (z.B. ADC, 
Comparator, Treiber für IOs, etc.) still legst, die Taktfrequenz auf ein 
Minimum absenkst und bei jeder Gelegenheit den Controller schlafen legst 
statt aktiv über delays zu warten.
Was davon wie auf Arduino umzusetzen ist, kann ich dir leider nicht 
sagen da ich die Dinger nur nativ benutze.
#5756078
Lesenswert?
• ▲
▼
Hi,
du müsstest den uC in einen Schlafmodus bringen. Das passiert über die 
avr/sleep.h api. Um ihn aus dem Schlaf zu wecken brauchst du einen 
Interrupt. Dafür wird oft der Watchdog Timer avr/wdt.h genutzt. Probiere 
mal das hier aus:
1
#include <avr/sleep.h>
2
#include <avr/wdt.h>
3

4
volatile boolean waitForWDT;
5

6
void setup() {
7
  // diesdas
8
  setup_watchdog(WDTO_2S);
9
}
10

11
void loop() {
12
  //mache dies das
13
  waitForWDT = 1;
14
  system_sleep();
15
  while (waitForWDT == 1);
16
}
17

18
void system_sleep() {
19
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
20
  sleep_mode();
21
}
22

23
void setup_watchdog(int ii) {
24
  if (ii > 9 ) ii = 9;
25
  byte bb = ii & 7;
26
  if (ii > 7) bb |= (1 << 5);
27
  bb |= (1 << WDCE);
28

29
  MCUSR &= ~(1 << WDRF);
30
  WDTCSR |= (1 << WDCE) | (1 << WDE);
31
  WDTCSR = bb;
32
  WDTCSR |= 1 << WDIE;
33
}
34

35
ISR(WDT_vect) {
36
  waitForWDT = 0;
37
}

In der setup-Methode wird der Watchdog auf eine Zeit gestellt, in diesem 
Fall 2 Sekunden. Die Zeit kannst du anpassen mit den anderen Konstanten 
die es da gibt: 
http://nongnu.org/avr-libc/user-manual/group__avr__watchdog.html. Wenn 
du mehr Zeit brauchst, musst du den Timer öfters hintereinander starten. 
In der loop-Methode wird, nachdem du deinen Code ausgeführt hast, der 
Nano schlafen gelegt.

Das wäre schonmal eine große Verbesserung. Wenn du jetzt aber noch 
wirklich viel Strom sparen möchtest, um den Nano z.B. über Batterien 
laufen zu lassen, müsstest du die Power-Led auslöten und ggf den 
Spannungswandler. Dazu gibt es Berichte im Internetz, wieviel das 
bringt.

Den Code habe ich grob auch aus anderen Quellen Teilweise lassen sich 
Sachen vielleicht noch verbessern, wenn man das AVR-Datenblatt komplett 
durchnimmt.
Beitrag #5756090 wurde von einem Moderator gelöscht.
Gast #5756189
Lesenswert?
• ▲
▼
TCE schrieb:
> Ich möchte so viel Strom sparen wie möglich.

Sinnloses Unterfangen, ungeeignete Hardware ! Ich hab's nicht im 
Detail untersucht, aber unter 10..15 mA wir man den kaum bekommen.

Auf dem Nano ist der USB-Baustein, der sich nicht abschalten lässt. 
Spannungsregler und LEDs wollen auch gefüttert werden.

Nimmst Du einen ProMini und steckst zum Programmieren ein externes 
USB-Interface dran, kannst Du mit sehr wenig Aufwand bei etwa 5..7µA 
schlafen gehen. Auch da muss man aber mit dem Lötkolben dran:

http://www.home-automation-community.com/arduino-low-power-how-to-run-atmega328p-for-a-year-on-coin-cell-battery/
Gast #5761928
Lesenswert?
• ▲
▼
Ein Wunsch könnte auch sein per 3V knopfzelle zu versorgen, nen sensor 
zu lesen und per funkmodul übertragen und dabei so wenig strom zu 
verbrauchen wie diese wetterstations-außentemperatur-funksender
Persönliche Seite #5761957
Lesenswert?
• ▲
▼
TCE schrieb:
> Was mir dabei aber durch den Kopf
> gegangen ist, ist ob es noch auf Seite der Programmierung
> Optimierungsmöglichkeiten gibt.

ich hatte mich mal mit dem Thema etwas eingehender beschäftigt. Dabei 
ist z.B. dieser Vortrag:
https://chemnitzer.linux-tage.de/2014/vortraege/folien/153-low_power.pdf

bzw. diese Webseite entstanden:
https://www.bralug.de/wiki/Mikrocontroller_stromsparend_programmieren

Grüße Uwe

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.