Erkennung, ob USB-Kabel angesteckt ist

Hallo Community,

ich habe hier einen Arduino Leonardo, der normalerweise über Akku mit 3,3V am 5V Pin betrieben wird. Da es beim Akkubetrieb ja wichtig ist, möglichst wenig Strom zu verbrauchen, geht er nach dem Start sofort in den "sleep_mode_pwr_down" und wird dann mittels Interrupt aufgeweckt, um den Code auszuführen und wieder "schlafen zu gehen".
Da im sleepmode keine serielle Kommunkikation stattfindet, kann ich keine Werte auslesen (es hängen noch ein Flash über SPI und unterschiedliche I2C Sensoren dran).
Meine Idee ist nun, mittels If-Schleifen zu unterscheiden, ob er am USB-Kabel hängt und den sleepmode nicht ausführt oder ob er ohne Kabel arbeitet und daher Strom sparen soll. Ich habs mal mit if(Serial) versucht, hat aber, wie mein Post hier im Forum zeigt, nicht geklappt...

Für Denkanstöße in die Richtung wär ich ziemlich dankbar!

hier noch der (relevante) Code:

if(Serial1)
  {
    #if defined(__AVR_ATmega32U4__)  
    if (Serial.available() && Busy == false) serial_event();   
    #endif
    
    if(millis() - Pre_scan_time > 500)
    {
    Scan_result = scan_I2C();
    Pre_scan_time = millis();
    battery_level();
    }
    
    if(millis() - Pre_measure_time > 1000)
    {
      
      if(Scan_result == 72)
      {
        moisture_sensor();
      }
      
      if(Scan_result == 73)
      {
        alcohol_sensor();
      }
      
      Pre_measure_time = millis();
    }
  }
  
  else
  {
    attachInterrupt(0, InterruptServiceRoutine, FALLING);
    delay(20);
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    sleep_mode();
    //The program will continue from here.
    sleep_disable();
    detachInterrupt(0);
    
    Scan_result = scan_I2C();
    battery_level();
    
    if(Scan_result == 72)
    {
      moisture_sensor();
    }
        
    if(Scan_result == 73)
    {
      alcohol_sensor();
    }
  }
  
}

void InterruptServiceRoutine()
{
  //just for correct syntax
}

Die Versorgungsspannung kann man so: Supply Voltage Measurement | Blinkenlight messen.

Mit Narcoleptic oder ähnlichen Libraries immer 8s schlafen legen und dann kurz zum Spannungsmessen aufwachen. Danach wieder schlafen legen, oder eben auch nicht.

Und "If" ist keine Schleifenanweisung.

Das würde beim jetzigen Steckbrettaufbau klappen, später mit der selbst gemachten Platine aber nicht mehr, da dann das USB-Kabel,bevor es zum Arduino kommt, gesplittet wird und nur D+/D- zum ATMega 32u4 geführt werden. Die Versorgung wird getrennt davon auf 3,3V vermindert, da das ganze projekt mit diesen 3,3V läuft. (Sry, hab ich vergessen zuerwähnen!)

Deshalb brauche ich irgendwas, um dem µC mitzuteilen, dass gerade ein Kabel (genauer gesagt D+ und D-) dransteckt, oder eben nicht.

Hoffe, dass das einigermaßen verständlich formuliert ist...

LG

Hallo,

wenn alle Stricke reißen, nimm einen zusätzlichen Taster.

Tja, wäre schön wenn man sowas vorher sagen würde. Ich würde einfach einen 1 M Pull Down an einen Digitalpin klemmen und an den gleichen Pin einen 100 k Widerstand plus Entkoppeldiode an die Versorgungsspannung.

Also:

5V --->|------[100k]------[pin]---[1M]----- Masse

Wenn die 5V weg sind ist der Pin low, sobald die 5V sind geht er auf high. 100k reichen normalerweise nicht um den Pin über die 3,3V hochzuziehen. Per Interrupt kann man den Arduino dann auch bequem aufwecken.