Hallo,
habe mich nach langer Zeit wieder mit dem Thema Strom sparen beschäftigt und haben den Bsp. Code vom Arduino Playground probiert. Im Vergleich zum Code und zur lesenswerten Seite vom Nick Gammon gibts jedoch keinen Unterschied. Vielleicht weil er für beides verantwortlich zeichnet. Gehört ja zur Arduino Truppe soweit ich das verstanden habe.
Also der Code funktioniert soweit, dass er vom normalen Idle Zustand mit 62mA in den Power Down Modus geht mit 27mA. Es leuchtet nur noch die Power LED auf dem Arduino Board. Mit einem Taster an Pin 2 kann man ihn wieder aufwecken, bevor er nach erneuten 10sec Wartezeit wieder in den Power Down Modus wechselt.
Ich speise von einem Netzteil 5V direkt ein an den 5V Pin und GND Pin und messe dabei den Strom.
Jetzt möchte ich fragen. Ist das auf dem Mega2560 wirklich das maximale an Strom sparen was per Code möglich ist?
Die 27mA wird vom Rest auf dem Board verschluckt? Es ist ja nur der USB-RS232 Wandler und der Spannungsregler zusätzlich vorhanden. Der Spannungsregler sollte außen vor sein, wenn ich extern hinter seinem Rücken einspeise. Und der USB-RS232 IC kann doch keine mA ziehen? Hat sich jemand damit schon näher beschäftigt? Wenn er PowerDown ist, ist es doch egal ob der sonst mit 16 oder 8 oder 1MHz taktet? (von 5V auf 3,3V kann ich nicht runtergehen, wegen externer Beschaltung)
Ich müßte mir erst einen 2. Mega2560 kaufen bevor ich weitermachen kann und darauf rum löte bzw. Teile auslöte.
Die einzelnen power .... disable() Funktionen werden nur benötigt um gezielt einzelne Funktionen abzuschalten? Richtig?
Statt dem Taster zum aufwecken möchte ich die RTC DS3231 verwenden. Könnte doch funktionieren? Wenn die den AVR aller einer Sekunde aufweckt. Laufen die millis() im PowerDown Modus weiter oder bleibt der Zähler stehen? Eigentlich müßte der stehen bleiben, laut meiner Überlegung. Das heißt ich müßte meine Warteschleifen mit millis() komplett umschreiben auf Zähler die von der RTC im Sekundentakt dann letztlich gezählt werden?
/* Sleep Demo Serial
* -----------------
* Example code to demonstrate the sleep functions in a Arduino. Arduino will wake up
* when new data is received in the serial port USART
* Based on Sleep Demo Serial from http://www.arduino.cc/playground/Learning/ArduinoSleepCode
*
* Copyright (C) 2006 MacSimski 2006-12-30
* Copyright (C) 2007 D. Cuartielles 2007-07-08 - Mexico DF
*
* With modifications from Ruben Laguna 2008-10-15
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
// 27mA mit direkter 5V Einspeisung an 5V Pin / GND
#include <avr/sleep.h>
int sleepStatus = 0; // variable to store a request for sleep
int count = 0; // counter
int ledPin = 13; // LED connected to digital pin 13
//int interruptPin = 10; // LED to show the action of a interrupt
int wakePin = 2; // active LOW, ground this pin momentary to wake up
//int sleepPin = 12; // active LOW, ground this pin momentary to sleep
void wakeUpNow() // here the interrupt is handled after wakeup
{
// execute code here after wake-up before returning to the loop() function
// timers and code using timers (serial.print and more...) will not work here.
// digitalWrite(interruptPin, HIGH); // LED an Pin 10 ein
}
void sleepNow()
{
/* Now is the time to set the sleep mode. In the Atmega8 datasheet
* http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf on page 35
* there is a list of sleep modes which explains which clocks and
* wake up sources are available in which sleep modus.
*
* In the avr/sleep.h file, the call names of these sleep modus are to be found:
*
* The 5 different modes are:
* SLEEP_MODE_IDLE -the least power savings
* SLEEP_MODE_ADC
* SLEEP_MODE_PWR_SAVE
* SLEEP_MODE_STANDBY
* SLEEP_MODE_PWR_DOWN -the most power savings
*
* the power reduction management <avr/power.h> is described in
* http://www.nongnu.org/avr-libc/user-manual/group__avr__power.html
*/
//set_sleep_mode(SLEEP_MODE_IDLE); // sleep mode is set here
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
sleep_enable(); // enables the sleep bit in the mcucr register
// so sleep is possible. just a safety pin
/* Now it is time to enable an interrupt. We do it here so an
* accidentally pushed interrupt button doesn't interrupt
* our running program. if you want to be able to run
* interrupt code besides the sleep function, place it in
* setup() for example.
*
* In the function call attachInterrupt(A, B, C)
* A can be either 0 or 1 for interrupts on pin 2 or 3.
*
* B Name of a function you want to execute at interrupt for A.
*
* C Trigger mode of the interrupt pin. can be:
* LOW a low level triggers
* CHANGE a change in level triggers
* RISING a rising edge of a level triggers
* FALLING a falling edge of a level triggers
*
* In all but the IDLE sleep modes only LOW can be used.
*/
attachInterrupt(0,wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function
// wakeUpNow when pin 2 gets LOW
/*
power_adc_disable(); // dafür wird die #include <avr/power.h> benötigt
power_spi_disable();
power_timer0_disable();
power_timer1_disable();
power_timer2_disable();
power_timer3_disable();
power_timer4_disable();
power_timer5_disable();
power_twi_disable(); // I2C Interface
power_usart0_disable(); // RS232 Interfaces
power_usart1_disable();
power_usart2_disable();
power_usart3_disable();
*/
sleep_mode(); // here the device is actually put to sleep!!
// THE PROGRAM CONTINUES FROM HERE AFTER WAKING UP
sleep_disable(); // first thing after waking from sleep:
// disable sleep...
detachInterrupt(0); // disables interrupt 0 on pin 2 so the
// wakeUpNow code will not be executed
// during normal running time.
}
void setup()
{
// Serial.begin(57600);
pinMode(ledPin, OUTPUT); // LED connected to digital pin 13
//pinMode(interruptPin, OUTPUT); // LED to show the action of a interrupt pin 10
pinMode(wakePin, INPUT); // active LOW, ground this pin momentary to wake up
digitalWrite(wakePin, HIGH); // Pullup aktiv
//pinMode(sleepPin, INPUT); // active LOW, ground this pin momentary to sleep
//digitalWrite(sleepPin, HIGH); // Pullup aktiv
attachInterrupt(0,wakeUpNow, LOW); // use interrupt 0 (pin 2) and run function
// wakeUpNow when pin 2 gets LOW
}
void loop()
{
count++;
delay(1000); // waits for a second
// check if it should go asleep because of time
if (count >= 10) {
count = 0;
digitalWrite(ledPin, LOW);
sleepNow(); // sleep function called here
}
digitalWrite(ledPin, HIGH);
}