Abschaltung der Powerbank mit blinkender LED verhindern

Ja, ich habe großes Interesse - vielen vielen Dank schon mal für dein Angebot. Ggf. / Vrsl. bekomme ich die Zeitabstände hin, wenn ich weiß wo ich grds. was einfügen muss…

Nach #define shutdownPin 7
#define TonuinoOnLEDPin 6
einfügen.

Vor void setup()
const int KonstLEDHell = 150;
und direkt am Anfang in void setup()

  pinMode(TonuinoOnLEDPin, OUTPUT);
  digitalWrite(TonuinoOnLEDPin, HIGH);

einfügen. Hier wird aber lediglich die LED auf Dauerleuchten gesetzt. Kannst digitalWrite(TonuinoOnLEDPin, HIGH); auch auf LOW setzen oder erstmal ganz weglassen. Wie du willst.

Vor void loop()

int helligkeit = 150;
int richtung = 4;
unsigned long previousMillis = 0; 
const long interval = 1000;    // Blinkdauer 
unsigned long currentMillis = 0;
bool ledState = LOW;

void StatusLED(int state) {
    
   // - Pin D6: Status LED:(TonuinoOnLEDPin) wird direkt beim Starten des Arduinos aktiviert

  switch (state) {
    case 0: {Serial.println(F("StatusLED Case 0"));  // Leuchtet normal (z.B. Musik wird abgespielt)
        analogWrite(TonuinoOnLEDPin, KonstLEDHell);
      }
      break; 
    case 1: {Serial.println(F("StatusLED Case 1"));  // blinken
      currentMillis = millis();
      if (currentMillis - previousMillis >= interval) 
        { previousMillis = currentMillis;
          ledState = !ledState;
          digitalWrite(TonuinoOnLEDPin, ledState);
        } 
      }
      break;
    case 2: {Serial.println(F("StatusLED Case 2"));  //pulsierende LED
      analogWrite(TonuinoOnLEDPin, helligkeit); 
      helligkeit = helligkeit + richtung;
      if (helligkeit >= 200 || helligkeit <= 5) {
        richtung = richtung * -1; 
        } 
      }
      break;
      
      case 99: {Serial.println(F("StatusLED Case 99"));  // LED aus
        digitalWrite(TonuinoOnLEDPin, LOW);
      }
      break; 
  }
}

Nun die folgenden Stellen suchen und jeweils die Zeile mit StatusLED einfügen:
In void loop:

if (pauseButton.wasReleased()) {
  if (activeModifier != NULL)
    if (activeModifier->handlePause() == true)
      return;
  if (ignorePauseButton == false)
    if (isPlaying()) {
      mp3.pause();
      setstandbyTimer();
    }
    else if (knownCard) {
      mp3.start();
      disablestandbyTimer();
      StatusLED(1);  // LED soll leuchten
    }

und

  if (readCard(&myCard) == true) {
    if (myCard.cookie == cardCookie && myCard.nfcFolderSettings.folder != 0 && myCard.nfcFolderSettings.mode != 0) {
      playFolder();
      StatusLED(1);
    }

In void adminMenu

  disablestandbyTimer();
  mp3.pause();
  StatusLED(1);

Am Ende von uint8_t voiceMenu

  } else {
    ignoreDownButton = false;
  }
}
StatusLED(1);
  } while (true);
}

Am Anfang von void checkStandbyAtMillis() {
StatusLED(1);


Ich habe mal den Select case drin gelassen, dann kannst ein bisschen Spielen mit pulsieren StatusLED(2), blinken StatusLED(1), dauerhaft an StatusLED(0) oder dauerhaft aus StatusLED(99).
Die Blinken-Funktion musst du allerdings noch anpassen. Das ist momentan ein gleichmäßiges Blinken (Ein und Aus ist gleich lang). Dauer wird mit interval in Millisekunden eingestellt.

Hallo Manuel, ganz vielen Dank. Ich werde erst heute Abend dazu kommen es auszuprobieren und werde morgen Rückmeldung geben. Aber ich danke schon mal ganz herzlich.

Habe oben noch etwas ergänzt:

Edit: Nicht in der DEV vorhanden...

Hallo Manuel,
vielen Dank für deine Hilfe, der Code funktioniert (nur den Abschnitt void WriteRFID() habe ich bei mir nicht gefunden). Im Codebeispiel war noch TonuinoOnPin und zum Teil TonuinoOnLEDPin definiert, was ich auf ersteres vereinheitlicht habe.

Zur Info, falls jemand dieselbe Powerbank (EasyAcc 20000) hat: die Powerbank schaltet trotz LED-Band mit knapp 20 LEDs trotzdem noch ab, wenn keine Musik gespielt wird. Wenn Musik gespielt wird, schaltet sie mit der oben genannten Blinkschaltung von LEDs jetzt nicht mehr ab.
Ich habe jetzt mal mit Widerständen gespielt (ohne LEDs je 10 Ohm in Reihe an D6 dazugeklemmt) und bei 30 Ohm bleibt die Powerbank auch ohne Musik an (bis der Tonuino in Standby geht), bei 40 Ohm schaltet sie nach 20-30 Sekunden ab. Ich werde jetzt eine Kombination aus LEDs und Wärme (Widerstände) einsetzen um das Abschalten der Powerbank zu verhindern. Durch das Blinken spart das auf jeden Fall Strom und die LEDs bringen noch einen Effekt. Das Aufwecken der Powerbank und Einschalten des Tonuino werde ich durch einen (vom Tonuino getrennten) zusätzlichen Schalter an einem zweiten USB-Anschluss der Powerbank umsetzen mit 30 Ohm Widerstand dazwischengeschalten - dann schaltet mit der Powerbank der Tonuino ebenfalls ein.

Nur falls jemand das einfach beantworten kann: wie kann ich den Abstand des Aufblinkens auf bspw. 20 Sekunden verlängern, ohne das Aufblinken selbst zu verlängern? Falls das kompliziert ist, lasse ich es bei dem aktuellen Blinkverhalten.

Ich danke Euch allen jedenfalls für die ganzen Antworten und Hilfe, die ich bei Euch im Forum erhalten habe.

################################################################################

Da ich die max. Anzahl der heute möglichen Beiträge erreicht habe, hier noch mein Fazit :slight_smile:

Dann sind 30 Ohm bei 5 V auf jeden Fall zuviel, da ca. 160mA. Also die Powerbank mit LEDs/Wärme wach zu halten funktioniert dann nicht so einfach… Vielleicht ist es doch das einfachste eine neue Powerbank zu kaufen…

Danke

Danke, hab’s korrigiert.

Pass bitte auf. So ein Ausgang darf max. mit 40mA belastet werden. 20mA sollten auf Dauer nicht überschritten werden!

2 „Gefällt mir“

Definitiv.
Hier hast du einen Überblick über Powerbanks, die von der Community genutzt werden mit vielen nützlichen Informationen wie zum Beispiel automatische Abschaltung usw…

Sorry, das kannst du auch gar nicht finden, da es nicht in der DEV enthalten ist. Das war eine Erweiterung für meine Software…

Danke nochmal.
Ich habe jetzt folgende Powerbank bestellt:

Die Erfahrungen mit der EasyAcc 20000 habe ich in die Übersicht eingetragen.

nur zum Verständnis: das Interval ist die Zeit, welche die LED jeweils an und aus ist.
Eine längere Pause zwischen den einzelnen Aufblinken könnte man in unsigned long previousMillis = 0; durch eine Erhöhung der Zahl 0 erreichen, oder ist das falsch? (Ich bin neu auf dem Gebiet :slight_smile: )

Hab nur kurz Zeit…

Ja.

Nein. previousMillis wird beim Statuswechsel der LED mit der aktuellen Zeit currentMillis beschrieben.

Erklärung: Aktuelle Zeit - Zeit beim letzten Statuswechsel >= Intervall
Ach ja, aktuelle Zeit ist nicht die Uhrzeit, sondern eine Zahl in ms seit Start des Arduinos…

Hier mal wie es mit 2 Intervallen gehen müsste.

const long interval1 = 1000;    
const long interval2 = 20000;
unsigned long currentMillis = 0;
bool ledState = LOW;

Für case 1 musst du dann folgendes nehmen.

case 1: {Serial.println(F("StatusLED Case 1"));  // blinken
      currentMillis = millis();
      if (currentMillis - previousMillis >= interval1 && ledState = LOW) 
        { previousMillis = currentMillis;
          ledState = !ledState;
          digitalWrite(TonuinoOnLEDPin, ledState);
        } 

      if (currentMillis - previousMillis >= interval2 && ledState = HIGH) 
        { previousMillis = currentMillis;
          ledState = !ledState;
          digitalWrite(TonuinoOnLEDPin, ledState);
        } 

      }
      break;
1 „Gefällt mir“

Hallo Manuel, vielen vielen Dank für deine Antworten und Mühen - dein Einsatz ist wirklich großartig. Also vielen Dank an dich und das Forum.
Ich werde deinen Vorschlag die nächsten Tage mal ausprobieren - jetzt muss ich erst mal alles in ein Gehäuse bauen, die Karten anlernen, usw. und erst dann am Code weiter spielen (es ist nicht mehr so lange hin bis zum Geburtstag und da muss zumindest die Hardware fertig sein). Ich werde mich auf jeden Fall nächste Woche wieder melden und Feedback geben. Viele Grüße

Gerne. Das sind ja eben die Dinge, von denen ein Forum lebt.

Gute Idee. Aber plane schon einmal einen zweiten Tonuino zum Basteln ein, den anderen wirst du so schnell nicht mehr bekommen :joy:

Hallo Manuel,
vielen Dank für den Code. Das klappt sehr gut. Die LED blinkt jetzt bei mir alle 5 Sekunden für 1 Sekunde.
Deine Codebeispiel habe ich noch wie folgt angepasst;
if (currentMillis - previousMillis >= interval1 && ledState == LOW)
und
if (currentMillis - previousMillis >= interval2 && ledState == HIGH)
(jeweils == am Ende). Auch ist bei mir interval1 der lange Zeitraum (5000, LED für 5 Sekunden aus) und interval2 der kurze Zeitraum (1000, LED für 1 Sekunde an).

Unter // enter sleep state habe ich (wie im Forum schon oft ausgeführt) noch digitalWrite(6, LOW); eingefügt, damit sich die LED mit dem Sleep-Modus ausschaltet und dann auch die Powerbank abschaltet. Einschalten kann ich das ganze wieder mit einem Taster (Öffner), welchen ich zwischen Powerbank und Tonuino geschalten habe.

Ich werde die nächsten Tage deine Codebeispiele, den ich jetzt bei mir in die DEV-Version reinkopiert habe, nochmal kurz für evtl. Leser zusammenfassen, falls andere User die LED bspw. aus energiespar-Gründen immer nur kurz aufblinken lassen wollen, ohne die zusätzlichen Funktionen einer StatusLED.

Vielen Dank nochmals und viele Grüße.

1 „Gefällt mir“

Ups, war gedanklich in Visual Basic unterwegs :see_no_evil:. Aber gut dass du mitgedacht hast :wink:.

nicht mitgedacht - ich hab keine Ahnung was ich da reinkopiere :slight_smile: Google hat geholfen…

Bin gerade dabei mich in die ganze Thematik einzuarbeiten um Weihnachten den ersten Kasten verschenken zu können.
Jetzt habe ich mir das hier mit den LEDs durchgelesen und da kamen mir gleich die fertigen Blink LEDs in den Sinn, werden im Modellbau gerne verwendet. Da spart man sich die ganze Programmierkurse. Einfach Strom drauf. Gibt’s flackernde, Blinker usw

1 „Gefällt mir“

Aus elektronischer Sicht ist das natürlich nicht die sauberste Lösung, aber am besten ist immer die Lösung, die man selbst nachzuvollziehen und umsetzen kann.
Ich denke damit wirst du vielen helfen können.

Ja,warum umständlich, wenn es auch einfach geht. Das spart auf jeden Fall einen Pin des Nano, den man dann vielleicht sinnvoller nutzen kann und auch wertvollen Programmspeicher. Also gut ausgedacht.:+1::+1::+1:

Hallo Pete,

was willst du denn mit den LEDs erreichen? Geht es nur darum geht, die Powerbank wach zu halten?

Viele Grüße