Ausschalten über Lautstärketasten

Hallo,

ich habe eine Idee die ich gerne umsetzen will und wollte fragen ob das jemand schon gemacht hat, bzw. mir etwas helfen kann.

Aktuelle Situation ist, dass mein TonUNINO keinen separaten Ein Aus Schalter hat.
Ich wollte alle unnötigen öffnungen und extra Knöpfen vermeiden (weshalb ich auch induktiv lade).
Deshalb habe ich einen Pololou Switch eingebaut, der mit dem Pause Button eingeschalten und über den Time out ausgeschalten wird.

Das möchte ich erweitern und zwar um ein manuelles Ausschalten über einen langen Druck beider Lautstärke Taster.
Der Arduino hat ja schon den D7 Ausgang am OF des Pololu angeschlossen um über den time out den Pololu zu deaktivieren. D7 soll jetzt extra noch über die Lautstärke Tasten angetriggert werden.

Hat das schon mal jemand so oder so ähnlich umgesetzt?

Ich hab mal einen Ansatz.

Ich würde folgende Abfrag in loop setzen

if (upButton.pressedFor(LONG_PRESS) & & (downButton.pressedFor(LONG_PRESS) ) {
digitalWrite(shutdownPin, HIGH) ;
delay(500);
}

Ich hab nun eine Lösung.
Allerdings verwende ich nun die Pause Taste um die Box ein und Auszuschalten.

Hier meine Anpassungen:

void loop() {
  do {
    checkStandbyAtMillis();
    mp3.loop();

    // Modifier : WIP!
    if (activeModifier != NULL) {
      activeModifier->loop();
    }

    // Buttons werden nun über JS_Button gehandelt, dadurch kann jede Taste
    // doppelt belegt werden
    readButtons();

    // admin menu
    if ((pauseButton.pressedFor(LONG_PRESS) || upButton.pressedFor(LONG_PRESS) || downButton.pressedFor(LONG_PRESS)) && pauseButton.isPressed() && upButton.isPressed() && downButton.isPressed()) {
      mp3.pause();
      do {
        readButtons();
      } while (pauseButton.isPressed() || upButton.isPressed() || downButton.isPressed());
      readButtons();
      adminMenu();
      break;
    }

    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();
        }
      ignorePauseButton = false;
    } else if (pauseButton.pressedFor(LONG_PRESS) &&
               ignorePauseButton == false) {
///////////////////////////////Original//////////////////////////////////
//      if (activeModifier != NULL)
//        if (activeModifier->handlePause() == true)
//          return;
//      if (isPlaying()) {
//        uint8_t advertTrack;
//        if (myFolder->mode == 3 || myFolder->mode == 9) {
//          advertTrack = (queue[currentTrack - 1]);
//        }
//        else {
//          advertTrack = currentTrack;
//        }
//        // Spezialmodus Von-Bis für Album und Party gibt die Dateinummer relativ zur Startposition wieder
//        if (myFolder->mode == 8 || myFolder->mode == 9) {
//          advertTrack = advertTrack - myFolder->special + 1;
//        }
//        mp3.playAdvertisement(advertTrack);
//      }
//      else {
//        playShortCut(0);
//      }
//     ignorePauseButton = true;
/////////////////////////////Original//////////////////////////////////
//
/////////////////////////////////////Eigener Code//////////////////////////////////
     while (digitalRead(buttonPause) != LOW) {
         
      }
     delay(100);
      
     ignorePauseButton = true;
     shutDown();
  
/////////////////////////////////////Eigener Code//////////////////////////////////
  }


///////////////////////////////////////// Eignener Code   ///////////////////////////////////
void shutDown ()
{
   digitalWrite(shutdownPin, HIGH);
   delay(500);
}

Oh, sorry, da war ich zu langsam.
In meiner Fork habe ich es auch so gemacht.

Kein Grund zum Entschuldigen.
Ich hab ja selbst zun ziel gefunden.

Hi zusammen,
ich hatte nach einer Lösung (Pololu OFF an D7) gesucht, neben der Timeout-Funktion, den TonUINO auch über Langes Drücken der PAUSE Taste auszuschalten.
Mit eurem Code oben bin ich leider nicht wirklich weiterkommen.
Folgend meine Lösung. Vielleicht kann die ja jemand gebrauchen.
Die aktuelle DEV Version von Thorsten wurde nur minimal geändert.

// uncomment the below line to enable five button support
//#define FIVEBUTTONS

// mod by ManfredFFM
// uncomment the below line to enable shutdown via pauseButton when not playing (e.g. by Pololu-Switch or Mosfet)
#define LONGPAUSESHUT

    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();
        }
      ignorePauseButton = false;
    } else if (pauseButton.pressedFor(LONG_PRESS) &&
               ignorePauseButton == false) {
      if (activeModifier != NULL)
        if (activeModifier->handlePause() == true)
          return;
      if (isPlaying()) {
        uint8_t advertTrack;
        if (myFolder->mode == 3 || myFolder->mode == 9) {
          advertTrack = (queue[currentTrack - 1]);
        }
        else {
          advertTrack = currentTrack;
        }
        // Spezialmodus Von-Bis für Album und Party gibt die Dateinummer relativ zur Startposition wieder
        if (myFolder->mode == 8 || myFolder->mode == 9) {
          advertTrack = advertTrack - myFolder->special + 1;
        }
        mp3.playAdvertisement(advertTrack);
      }
      else {
// mod by ManfredFFM
#ifdef LONGPAUSESHUT    
        sleepAtMillis = 1;
#endif
// endmod 
        playShortCut(0);
      }
2 „Gefällt mir“

Hi zusammen,
um manchmal einen Konflkt mit dem Adminmenü zu vermeiden (wenn zuerst die Pause Taste und dann UP und Down lange gedrückt werden) folgend noch eine Änderung:

// mod by ManfredFFM
#ifdef LONGPAUSESHUT 
        if (!(upButton.pressedFor(LONG_PRESS)) && !(downButton.pressedFor(LONG_PRESS))) {
        sleepAtMillis = 1;
        }
#endif
// endmod 

Gruß an Alle und Danke für das Super Projekt,
Manfred

1 „Gefällt mir“

Hallo zusammen,
ich habe auch den Pololu verbaut und bin auf der Suche nach einer softwareseitigen Lösung, um den Pololu mittels langem Pausen Tasten Drucks auszuschalten.

Programmiertechnisch bin ich noch ein Noob. Deshalb hoffe ich auf eure Unterstützung.
@marco-117 & @ManfredFFM wie habt ihr eure Code Elemente in Thorstens DEV eingebaut? Wenn ich Manfreds Code schlicht hinein kopiere erhalte ich folgende Fehlermeldung:

Arduino: 1.8.16, Board: "Arduino Nano, ATmega328P (Old Bootloader)"

Tonuino:28:5: error: expected unqualified-id before 'if'
     if (pauseButton.wasReleased()) {
     ^~
Tonuino:42:7: error: expected unqualified-id before 'else'
     } else if (pauseButton.pressedFor(LONG_PRESS) &&
       ^~~~
exit status 1
expected unqualified-id before 'if'

Über Tipps bin ich sehr dankbar.

Wie möchtest du es denn genau haben, denn der Longpress der Playtaste hat ja schon Funktionen draufprogrammiert.
Während der Wiedergabe wird die Tracknummer angesagt und während Pause wird darüber der Shortcut gestartet.
Deshalb verwenden viele eine Kombination aus 2 Tasten

ich hab beides einfach raus geschmissen und durch ausschalten ersetzt…

Aber da mein Fork in der Steuerung so anders ist als das Original, kannst du das nicht mal eben übertragen.

Wow! Super schnelle Antworten. Danke erstmal dafür.

@marco-117 ich werde mir mal dein Fork genauer anschauen und überprüfen, ob das für mein Vorhaben passen könnte.

@Gute_Laune Für mich wäre ideal, würde der Longpress der Playtaste die Stromversorgung über den Pololu kappen.
Tracknummeransage brauche ich nicht. Den Shortcut, um ins Admin-Menü zu gelangen, würde ich mir am liebsten über eine programmierte RFID Karte herstellen. So weit bin ich aber noch nicht. (Ich versuche - soweit es geht - die Probleme in kleinen Häppchen abzuarbeiten.)

Dafür brauchst du nichts programmieren. Du legest eine neue Karte auf, wählst irgendeinen Ordner und dann als Wiedergabemodus das mit Admin. Im Adminmenü gibt es den Punkt „das Adminmenü absichern“ da kannst du einstellen, dass es nur mit Karte geöffnet werden kann.

Der Shortcut der Playtaste hat damit nichts zu tun, das ist ja eine „virtuelle Karte“. Ich mache hier mal ein paar Vorschläge. So kannst du entweder nur das eine oder nur das andere ersetzen. Ich ersetze immer nur den Shortcut, weil man dann nicht so leicht aus, statt pause macht.

else if (pauseButton.pressedFor(LONG_PRESS) &&
               ignorePauseButton == false) {
      if (activeModifier != NULL)
        if (activeModifier->handlePause() == true)
          return;
      if (isPlaying()) {
-        uint8_t advertTrack;
-        if (myFolder->mode == 3 || myFolder->mode == 9) {
-          advertTrack = (queue[currentTrack - 1]);
-        }
-        else {
-          advertTrack = currentTrack;
-        }
-        // Spezialmodus Von-Bis für Album und Party gibt die Dateinummer relativ zur Startposition wieder
-        if (myFolder->mode == 8 || myFolder->mode == 9) {
-          advertTrack = advertTrack - myFolder->special + 1;
-        }
-        mp3.playAdvertisement(advertTrack);
+       sleepAtMillis = 1; // für Abschalten während der Wiedergabe
      }
      else {
-        playShortCut(0);
+        sleepAtMillis = 1; // für ausschalten wenn Pause ist
      }
      ignorePauseButton = true;
    }

In dem Beispiel blockiert die Tastensperre (Krabblermodus) auch das Abschalten. Wenn du willst dass die Box immer aus geht, wenn play lange gedrückt wird, dann kannst du alles in der else if Abfrage durch sleepAtMillis = 1; ersetzen. Wichtig ist mit den Klammern aufzupassen. Arduino macht einem manchmal irgendwo direkt auch eine Klammer zu hin. Wenn man die übersieht, gibt es Fehlermeldungen an Orten, wo das Problem eigentlich gar nicht ist.

@Gute_Laune vielen Dank für deine schnelle und sehr hilfreiche Unterstützung. Ich habe jetzt alles zusammen, was ich brauche, und wieder eine Menge dazu gelernt!
Mein Kleiner ist froh und Weihnachten ist gerettet.

1 „Gefällt mir“