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
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.
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
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.
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/
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.