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.