Forum: Mikrocontroller und Digitale Elektronik Stromspartipps Arduino nano


von TCE (Gast)


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

von Jens M. (schuchkleisser)


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.

von Tim T. (tim_taylor) Benutzerseite


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.

: Bearbeitet durch User
von Pascal D. (pascal_d)


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.

: Bearbeitet durch User
Beitrag #5756090 wurde vom Autor gelöscht.
von Manfred (Gast)


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/

von extern (Gast)


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

von Uwe B. (boerge) Benutzerseite


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.