Beim Arduino Art der Spannungsversorgung erkennen

Hallo liebe Gemeinde,
ist es bei einem Arduino Nano möglich, die Art der Spannungsversorgung (USB oder Vin) in einem Sketch zu ermitteln?
Ich möchte den Sleep Mode abhängig von der Spannungsversorgung verwenden. Bei USB kein Sleep, bei Batteriebetrieb alle xx Sekunden aufwachen, Arbeit erledigen und wieder schlafen legen.

Der Sleep Mode mit WDT funktioniert bereits einwandfrei. Nur soll der eben bei USB Power nicht aktiviert werden.

Gruß
Fred

Ab Werk kannst du das nicht erkennen, aber du kannst ja für die entsprechenden Spannungseingänge jeweils einen analogen Pin opfern, der da eine Spannung misst. Je nachdem was du vorhast, reicht auch ein digitaler Pin um eine anliegende Spannung zu detektieren.

Nein direkt nicht möglich! Das musst du über eine externe Schaltung realisieren. Hast du einen orginalen Nano? Wenn nein, musst du da selber mal den Schaltplan rausfinden.

Einfache Möglichkeit wäre, einen Spannungsteiler an VIN anschließen, der sollte so dimensioniert werden, dass an diesem auch bei fast leerer Batterie immer noch der Wert HIGH als Eingang erkannt wird. Versorgungsspannung * 0,7V. Wäre bei 5V etwa 3,5V.

Edit: HotSystem war schneller. Würde dafür aber nicht zwingend einen Analogen Eingang für nutzen. Digital könnte schon ausreichen über den Schwellwert wann ein Eingang 0 oder 1 erkennt. Alternativ geht aber aus ein Mosfet o. ä. der einen Eingang schaltet, sobald dieser eine Spannung am Eingang sieht. Dazu müssen mehr Infos über die externe Spannungsquelle bekannt sein.

sschultewolter:
Edit: HotSystem war schneller. Würde dafür aber nicht zwingend einen Analogen Eingang für nutzen. Digital könnte schon ausreichen über den Schwellwert wann ein Eingang 0 oder 1 erkennt. Alternativ geht aber aus ein Mosfet o. ä. der einen Eingang schaltet, sobald dieser eine Spannung am Eingang sieht. Dazu müssen mehr Infos über die externe Spannungsquelle bekannt sein.

Ja, deswegen habe ich ja auch geschrieben, “je nach dem, was man vor hat”

Externe Spannungsquelle ist ein 3er Pack AA Zellen.
Die wären bei USB Betrieb aber auch weiterhin angeschlossen, sozusagen als USV.
Hintergrund der Frage ist der Anschluss des Arduinos an einem 16000 mAh Powerpack. Bei Versorgung über USB ist die Stromaufnahme des Arduinos so gering, dass sich der Powerpack ausschaltet.
Deshalb wollte ich bei Versorgung über den Powerpack den Stromverbrauch nicht gar so sehr senken und die Batterien sollen die Stromversorgung nur übernehmen, wenn ich den Akku wieder laden muss.

Das ist ja total was anderes.
Dann musst du die Spannung der Powerbank messen und wenn die abfällt, die Batterien hinzuschalten.

Ein wenig logik musst du einbauen und entsprechend programmieren.

Den Batteriestatus prüfe ich so:

// function to read and send the battery status
void bat_check(){
  // enable the ADC
  ADCSRA |= (1<<ADEN);

  // short delay
  _delay_ms(10);

  ADCSRA |= (1 << ADSC); // start ADC measurement
  while ( ADCSRA & (1 << ADSC) ); // wait till conversion complete
  
  int16_t adc = ADCH;

  // clear the ADIF bit by writing 1 to it
  ADCSRA|=(1<<ADIF);

  // disable the ADC
  ADCSRA &= ~(1<<ADEN);

  // write the raw value into the buffer
  rh_buf[2] = adc;
  
  // calc the battery status in percent, respecting min and max
  adc = 100 * ( adc - BAT_ADC_MIN ) / (BAT_ADC_MAX - BAT_ADC_MIN);
  if(adc > 100){
    adc = 100;
  }
  else if(adc < 0){
    adc = 0;
  }

  // write it into the buffer
  rh_buf[1] = adc;

  // set command byte to 0x02 for battery status
  rh_buf[0] = 0x02;

  // send 3 bytes from the buffer
  rh_send(3);
}

// function to send RadioHead messages from the buffer
void rh_send(uint8_t len){

//Status per 433Mhz Funk senden

}

Wenn der Akku leer wird bekomme ich trotzdem immer den besten Batteriezustand angezeigt, in dem Fall, den der Batterieen.

freddy64:
Wenn der Akku leer wird bekomme ich trotzdem immer den besten Batteriezustand angezeigt, in dem Fall, den der Batterieen.

Dann solltest du die Batterien zusätzlich an bzw. abschalten.

Wie müsste dann so eine Schaltung aussehen?
Wenn Akku noch voll, über einen GPIO-Pin und Transisitor Batterie abschalten, wenn Akku unter Mindestspannung, Batterie an PIN Vin anschalten und zusätzlich einen GPIO auf H oder L stellen, damit das Programm weiß, dass es auf Notstrom läuft und den SLEEP_MODE_PWR_DOWN aktiviert.
Den Zustand "Notstrom" könnte ich dann auch noch an meinen Controller funken: Achtung Akku laden nicht vergessen.
Langsam nimmt die Sache Gestalt an.

Du machst einiges falsch.
Beim Nano den Sleep-modus aktivieren bringt nicht so viel wie Du denkst. Der Strom geht nicht unter 1µA herunter sondern bleibt wegen der anderen ICs und der LED im 2-stelligen mA Bereich.
Außerdem muß die Spannung an Vin mindestens 6,6V sein. Also nichts mit 3 AA Batterien.

Du mußt Das ganze Konzept ändern.

Besorg Dir ein Power Pack das sich nicht ausschaltet. Einige Modelle tun das nämlich nicht.

Grüße Uwe

Beim Nano den Sleep-modus aktivieren bringt nicht so viel wie Du denkst. Der Strom geht nicht unter 1µA herunter sondern bleibt wegen der anderen ICs und der LED im 2-stelligen mA Bereich.

Mit ausgelöteter Power LED messe ich noch 0.26 mA.
Per Software wurden alle nicht benötigten Funktionen deaktiviert.

  // disable ADC for powersaving
  ADCSRA &= ~(1<<ADEN);

  // disable analog comperator for powersaving
  ACSR |= (1<<ACD);

Besorg Dir ein Power Pack das sich nicht ausschaltet. Einige Modelle tun das nämlich nicht.

Och nööö, nicht schon wieder Geld ausgeben.
Hast du ein Beispiel Power Pack. Die Abschalt-Funktion steht doch nirgens drauf.

Außerdem muß die Spannung an Vin mindestens 6,6V sein. Also nichts mit 3 AA Batterien.

Was wäre hier besser? Step-Up oder mehr AA Batterien.