Stromsparmodus Arduino Nano

hallo leute,

ich bekomme es einfach nicht hin den Nano in den Energiesparmodus zu versetzen. Ich messe immerwieder 50-55mA

Messen tue ich in dem ich ein Amperemeter in Reihe schalte zwischen 9v + und vin

Ich habe es versucht mit verschieden Lib

Narcoleptic v1A mit dem Beispiel Sketch :

#include <Narcoleptic.h>

void setup() {
  pinMode(2,INPUT);
  digitalWrite(2,HIGH);
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
}

void loop() {
  int a;

  // Merlin the cat is snoozing... Connect digital pin 2 to ground to wake him up.
  Narcoleptic.delay(500); // During this time power consumption is minimised

  while (digitalRead(2) == LOW) {
    // Wake up CPU. Unfortunately, Merlin does not like waking up.

    // Swipe claws left
    digitalWrite(13,HIGH);
    delay(50);
    
    // Swipe claws right
    digitalWrite(13,LOW);
    delay(50);
  }

  // Merlin the cat goes to sleep...
}

diesen Sketch

#include <avr/sleep.h>

const byte LED = 9;
  
void wake ()
{
  // cancel sleep as a precaution
  sleep_disable();
  // must do this as the pin will probably stay low for a while
  detachInterrupt (0);
}  // end of wake

void setup () 
  {
  digitalWrite (2, HIGH);  // enable pull-up
  }  // end of setup

void loop () 
{
 
  pinMode (LED, OUTPUT);
  digitalWrite (LED, HIGH);
  delay (50);
  digitalWrite (LED, LOW);
  delay (50);
  pinMode (LED, INPUT);
  
  // disable ADC
  ADCSRA = 0;  
  
  set_sleep_mode (SLEEP_MODE_PWR_DOWN);  
  sleep_enable();

  // Do not interrupt before we go to sleep, or the
  // ISR will detach interrupts and we won't wake.
  noInterrupts ();
  
  // will be called when pin D2 goes low  
  attachInterrupt (0, wake, LOW);
 
  // turn off brown-out enable in software
  // BODS must be set to one and BODSE must be set to zero within four clock cycles
  MCUCR = bit (BODS) | bit (BODSE);
  // The BODS bit is automatically cleared after three clock cycles
  MCUCR = bit (BODS); 
  
  // We are guaranteed that the sleep_cpu call will be done
  // as the processor executes the next instruction after
  // interrupts are turned on.
  interrupts ();  // one cycle
  sleep_cpu ();   // one cycle

  } // end of loop
}

Mein Vorhaben ist es dass sich der Arduino in den Powerdown modus versetzt und aufwacht sobald sich der angeschlossene Schalter also Schalterzustand ändert. Sobald er dann erwacht ist verarbeitet er den Schalterzustand und je nach dem Welcher Zustand erreicht ist schickt er diesen weg.

mein eigener Sektch dazu lautet

#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();
#define Fensterkontakt 6
int Schalterzustand = 0 ;

void setup() {
  
  pinMode(Fensterkontakt,INPUT);
  Serial.begin(9600);
  mySwitch.enableTransmit(10);
  
  
}

void loop() {
  Schalterzustand = digitalRead(Fensterkontakt);
  if (Schalterzustand == HIGH) {
    mySwitch.send("000000000001010100010001");
   
      
  }
  else{
    
    delay(1500);
    
  }
  delay(1500);
 
  

}

Tobbaa:
ich bekomme es einfach nicht hin den Nano in den Energiesparmodus zu versetzen. Ich messe immerwieder 50-55mA

Messen tue ich in dem ich ein Amperemeter in Reihe schalte zwischen 9v + und vin

Ich habe es versucht mit verschieden Lib

Ich habe Dir mal einen Beispielcode gemacht, der den Sleepmode beendet, wenn an einem Atmega328 der Pegel an Pin-2 wechselt (Interrupt 0, CHANGE) .

Wenn der Controller wach ist, sendet er je nach Status von Pin-2 eine unterschiedliche Blinkfolge auf der Board LED-13

Testschaltung:
Taster zwischen GND und Pin-2 (Pin wird im Programm auf pinMode INPUT_PULLUP gesetzt)

#include <avr/sleep.h>

#define WAKEPIN 2
#define WAKEINTERRUPT 0
#define BOARDLED 13

volatile byte isWake =1; // Statusflag zeigt, ob der Controller wach ist

void goToSleep()
{
  sleep_enable();
  noInterrupts();
  attachInterrupt(WAKEINTERRUPT, wakeUp, CHANGE);
  isWake=0;
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  interrupts();
  sleep_cpu();  // hier geht der Controller in den Sleepmode
  sleep_disable();  // und ab hier ist er nach einem Interrupt-0 wieder wach
  detachInterrupt(WAKEINTERRUPT);
}

void wakeUp()
{
  isWake=1;
}


void setup()
{
  pinMode(WAKEPIN,INPUT_PULLUP);
  pinMode(BOARDLED,OUTPUT);
//  goToSleep();  // Kommentarstriche entfernen, falls anfangs schlafend
}

void blink(int num, long duration)
{
  for(int i=0;i<num;i++)
  {
    digitalWrite(BOARDLED,(i+1)%2);
    delay(duration);
  }
}

void loop()
{
  if (isWake)
  {
    if (digitalRead(WAKEPIN)==LOW) blink(8,250);
    else blink(4,500);
    goToSleep();
  }
}

Wie verändert sich denn damit die Stromaufnahme, während der Controller schläft?

also

blinken tut mal nix :smiley:

ich habe einen Taster mit 4 anschlüssen folgendermaßen verkabelt

man stelle sich den taster vor sich liegend vor damit 2 füße nach links schauen und 2 nach rechts

den oberen linken geht an ground und der untere rechte geht an pin 2

Ich merke eine veränderung druch drücken von 55mA zu 39mA

Dann schläft er. Ein Atmega328 braucht etwa 15mA:

Der Rest geht auf dem Board für die Peripherie wie USB/seriell Wandler und den Spannungsregler drauf. Deshalb lohnt sich das nur wirklich mit nackten Prozessoren, aber nicht mit Entwicklungsboards.

Tobbaa:
blinken tut mal nix :smiley:

Hat das Nano-Board keine Board-LED an Pin-13?
Funktioniert der normale "Blink-Sketch" mit Blinken an der Pin-13 LED auf Deinem Board?

Tobbaa:
Ich merke eine veränderung druch drücken von 55mA zu 39mA

Das dürfte der Energiesparmodus sein. Ein Atmega328 mit 16 MHz getaktet braucht ca. 17 mA. Im Powerdown-Modus braucht er weit unter 1 mA, Also sollte der Stromverbrauch eines Boards mit 55 mA Verbrauch, bei dem Du den Atmega328 in Powerdown versetzt, ungefähr 55-17 = 38 mA verbrauchen.

Das kommt mit Deinem Messwert ja extrem gut hin.

Doch hat eine Led an Pin 13.

Halte den SleepModus für unsinn. Da kannst du besser 1 Taster sowie einen Schalter einbauen. Taster 1 speichert alle relevanten Werte im Eeprom, die beim Start wieder ausgelesen werden.
Mit dem Schalter schaltest du einfach die Spannung weg.

Sinnvoll wäre es, einen Arduino Uno mit DIP MCU zu nehmen. Bootloader mittels ISP aufspielen. Danach den Uno soweit programmieren, bis alles funktioniert. Wenn das geschaft ist, den Chip entfernen, an XTAL1 und XTAL2 einen 16MHz Quarz. Zustäzlich von jedem Pin des Quarzes aus einen 10pF Kondensator nach GND legen. Alternative 16MHz Resonator nehmen. Hier einfach die beiden aussenstehenden XTAL1 und XTAL2 zuweisen. Der Mittlere Pin nach GND.

okay vielen danke :slight_smile:

Tobbaa:
okay vielen danke :slight_smile:

Wenn Du ein fertiges Board bevorzugst: Das "Mini-05" Board wird immer noch gelegentlich mal angeboten, z,B, hier:
http://www.exp-tech.de/Mainboards/Arduino-Mini-05-with-pin-headers.html

Weil an diesem Board alle stromfressenden Komponenten wie "Power-On LED" und "Serial-USB Adapter" standardmäßig weggelassen wurden, eignet es sich sehr gut für batteriebetriebene Projekte.

Programmieren kannst Du das Board, indem Du entweder die ISP-Pins entsprechend für einen ISP-Programmer oder einen "Arduino as ISP" anschließt, oder indem Du zum Programmieren einen externen USB-Serial-Adapter anschließt, den Du nach dem Programmieren des Boards wieder entfernst.

Die moderneren "Pro Mini" Boards haben leider eine PowerOn-LED, aber es gibt Bastelanleitungen im Internet, wie Du beim Pro Mini die stromfressende LED durch Durchtrennen einer Leiterbahn außer Gefecht setzen kannst.

Trennen einer Leiterbahn? Es reicht doch aus, die LED mit einem Seitenschneider durchzutrennen und dann die übereste mit einem Lötkolben abzuziehen.

Led 13 kann selber ja drauf bleiben, da diese ja nicht durchgehend an ist, es sei denn, man nutzt den Port.

sschultewolter:
Trennen einer Leiterbahn? Es reicht doch aus, die LED mit einem Seitenschneider durchzutrennen und dann die übereste mit einem Lötkolben abzuziehen.

Led 13 kann selber ja drauf bleiben, da diese ja nicht durchgehend an ist, es sei denn, man nutzt den Port.

Du machst das auf die harte Tour. Bei einer durchtrenten Leiterbahn kann man mit etwas Geschick, Mühe und Lötkenntnissen die LED wieder aktivieren.

Grüße Uwe

Die Lötpunkte habe ich ja auf meinen Boards auch noch drauf, muss halt nur die LED neusetzen. Die Kosten nichts und sich noch recht einfach gelötet.

sschultewolter:
Trennen einer Leiterbahn? Es reicht doch aus, die LED mit einem Seitenschneider durchzutrennen und dann die übereste mit einem Lötkolben abzuziehen.

Led 13 kann selber ja drauf bleiben, da diese ja nicht durchgehend an ist, es sei denn, man nutzt den Port.

Hmm...
Pro Mini und Strom sparen...
Dafür sind sie eigentlich nicht konstruiert.
Auch ist die 3,3V Variante seltener und oft deutlich teurer.

Also verwende ich die 5V Version. Leicht modifiziert.
Der Clock Vorteiler wird per Fuses aktiviert. Läuft also dann mit 2 MHz.
Brownout auch auf eine 3,3V verträgliche Schwelle gesenkt.
Versorgt wird das Ganze dann über einen KIS 3R33S mit 3,3V auf dem ursprünglichen 5V Pin des Mini.

Geweckt wird dann über den WDT oder einen der beiden externe Interrupts

Der Linearregler kann sitzen bleiben.
Wenn die 2 MHz nicht reichen, kann man auch den internen 8MHz RC Oszillator verwenden.

Ganz zum Schuss, wenn die Tests erfolgreich waren:
Trenne ich Power LED mit einem Dremel.
Die Pin 13 LED auch. Die flattert sonst immer mit dem SPI Clock.

Nachtrag:
Der Nano wird Dank des FTDI Chips wohl kein Stromsparwunder werden.