Impulsgeber damit Powerbank nicht abschaltet Apfelhirn.de Hilfe für Code

Hallo,

unter Apfelhirn.de (https://apfelhirn.de/automatische-abschaltung-von-powerbanks-als-arduino-stromversorgung-bei-geringer-grundlast-verhindern/) findet sich ein kleies Tool, dass die Abschaltung der Powerbank verhindern soll.

Der Programmcode verwendet „void setup ()“. Dieser Aufruf wird im Programmcode Toniuno bereits verwendet, so dass ich den Fehler "redefinition of void setup()erhalte. Bin kein Programmierer - was kann ich tun?
Und sind ist dasGleichheitszeichen und das Semikolon in der ersten Zeile korrekt? (#define)

Danke für eure Hilfe!
Gruß Ulf

Hier der Code von Apfelhirn:

#define powerpin = 10;
unsigned long previousmillispower = 0;
unsigned long powerintervalmax = 4000;

void setup()
{
  pinMode(powerpin,OUTPUT);
}

void loop() 
{
  if ((millis() - previousmillispower) > powerintervalmax) 
    {
      previousmillispower = millis();
      digitalWrite(powerpin,HIGH);
      delay(1000);
      digitalWrite(powerpin,LOW);
    }
}

Was du hier siehst ist quasi ein stand alone program. Du musst einfach nur die Zeile pinMode…. in deine Setup kopieren und die Programmzeilen die hier in der loop stehen in deine loop integrieren.

Hallo Thomas,
danke dir für deine schnelle Antwort - klingt irgendwie logisch, wenn man es weiß. :wink:

Bei der define-Zeile gab es noch Probleme:
Aus
#define powerpin = 10;
habe ich nun
#define powerpin 10
gemacht. Keine Fehlermeldung - aber ist das ok so?

Danke!!

Ja das ist ok. Die pindefinitionen werden ohne Gleichheitszeichen gemacht.

ok, danke, mühsam lernt das Eichhörnchen. Morgen mal die Schaltung anschließen und hoffen, dass es funzt.
Dir einen schönen Abend!

Schau dir auf jeden Fall auch die anderen Beiträge hier zum Thema Abschaltung verhindern an. Es gibt da schon viele Hinweise und auf den ersten Blick ist der Loop-Block aus Deinem Beispiel nicht optimal, weil er dort alle 4 Sekunden 1 Sekunde Pause macht (delay(1000)).

unter anderem:

nicht optimal ist noch untertrieben…

Hallo Christian,
danke für deine Anregung. Aber macht die Schaltung von Apfelhirn nicht genau das? So wie ich das verstehe, sitzt hier ein Widerstand zwischen 5v und GND, der periodisch über den Digitalpin und den Code geschaltet wird.

Hättest du eine bessere Idee? Möglichst mit Schaltplan, Code - bin gut im Kopieren und Adaptieren, schlecht im Programmieren. Aber TONUino finde ich so super, dass ich für meinen Enkel fast am Ziel mit der Box bin.

Hallo Stephan,

hast du eine bessere Idee, die zudem einfach umzusetzen ist, um die Abschaltung der Powerbank zu verhindern? Habe das Forum die letzten zwei Wochen nach allen möglichen Lösungen durchsucht, bin aber nicht so richtig fündig geworden. Oft kreisen die Beiträge um den Kauf der “richtigen“ Powerbank, aber das scheint mir keine gute Lösung.

Danke dir schon mal, vG Ulf

Ja, macht sie. Der Code blockiert aber den gesamten Loop für eine Sekunde und das ist nicht gut. Ich hab auch keine Lösung parat, aber schau dir mal die anderen Beiträge an. Du kannst z.B. eine LED als Daueranzeige verbauen. Dann siehst Du direkt ob das Gerät eingeschaltet ist und die Powerbank schaltet vermutlich nicht ab. Dann müsstest Du nichts am Code ändern. Wenn Du die Schaltung von oben verwenden möchtest, versuchen wir mal den Code zu optimieren.

Hallo Christian,
vielen Dank, ich habe mir die LED-Lösungen mal angeschaut und versuche da mein Glück. Falls du eine Idee für eine Optimierung des Codes hast, würde mich das sehr freuen.
LG Ulf

Du kannst versuchen den delaywert schritt für schritt zu verringern. Ich denke, dass die Zusatzlast für die Powerbank auch kürzer als eine Sekunde sein kann. Oder du nutzt anstelle des delay auch die millis Funktion, da wird die loop nicht durch delay unterbrochen.
Du müüstest eine weitere Variable unsigned long powerintervalmin = 1000 hinzufügen. dann hättest du wieder die 1 sekunde. die Änderung des Codes könnte dann so aussehen.

if ((millis() - previousmillispower) > powerintervalmax) 
    {
      previousmillispower = millis();
      digitalWrite(powerpin,HIGH);
       if ((millis() - previousmillispower) < powerintervalmin) 
        {
      digitalWrite(powerpin,LOW);
       }
    }

Ich denke so könnte es gehen. Habe es aber noch nicht getestet.

Es würde mehr sinn machen das Delay zu entfernen und den Ausgang in einem 1Hz Takt toggeln zu lassen.
In dem man bei jedem mal in der if Abfrage, den Ausgangszustand ändert.

Hallo Thomas,
danke dir für die Anregung! Werde das heute Abend mal durchspielen.

Hallo marco-117,
auch dir danke für deine Idee. Meine Programmierkenntnisse sind seeehr begrenzt: Wie setze ich „in einem 1Hz Takt toggeln lassen“ und den Hinweis auf die Änderungen in der if-Abfrage konkret für die Codezeilen um?

Verbrate den Strom lieber sinnvoll mit LEDs oder whatever als ihn einfach 1x pro Sekunde an einem Widerstand zu verbrennen. Ist im Forum alles schon bequatscht worden.

Habe hier mal ein bisschen am Code probiert. Folgender Code funktioniert. Ist hier als Standalone geschrieben, zum integrieren in deinen Code gilt dass schon weiter oben gesagte.
Habe hier Pin 13 benutzt, wegen der LED (optische Kontrolle. Kannst du dann wieder auf 10 setzen.

#define powerpin 13 
unsigned long previousmillispower = 0;
unsigned long powerintervalmax = 4000;
unsigned long powerintervalmin = 1000;

void setup() {
   Serial.begin(115200);                   // serielle Schnittstelle initialisieren

}

void loop() {
  
 if ((millis() - previousmillispower) > powerintervalmax) 
    {
      previousmillispower = millis();
      digitalWrite(powerpin,HIGH);
      
      Serial.println(" Powerpin --> On ");
    }
 if ((millis() - previousmillispower) == powerintervalmin) 
       
        {
         digitalWrite(powerpin,LOW);
         Serial.println(" Powerpin --> Off ");
        }
       
 }

Viel spass beim ausprobieren.

Hallo Thomas,
super, vielen Dank! Heute Abend ist Bastelstunde.
Kämpfe mich leider grad durch Corona-Absagen - dananch wird es wohl erstmal seeeehr ruhig - Zeit für TonUINO.

Falls die Zeiten genau falsch herum sind, das heist die LED ist 3sec an und eine sec aus , tausche einfach die LOW und HIGH ins Gegenteil. Weiss jetzt nicht ganz genau wie die LED auf dem NanoBoard geschaltet ist. Könnte sein dass es genau falsch herum ist. Das nur noch als Tipp.

ok, danke ich probier das aus und weiß dann notfalls, wo ich was ändern muss.