Projekt DFMp3player Mini

Hallo,
das das stimmt , das war auch mein erster Ansatz. Allerdings hab ich mir dann einen abgebrochen den einen Merker in der zweiten Schleife wieder zurück zu setzten. Das ist dann mit den andren Eingängen nicht verundet. Da schien mir das dann einfacher. Man müsste noch mal drüber nachdenken :sweat:

wahrscheinlich muss man die if Bedingung mit dem && auseiander nehmen.
Gruß Heinz

Wäre bitSet() eine Idee? Dann hast Du alle Bits in einer Variablen.

Ja, aber überflüssig :wink:
Ich brauche nur ein bit. Grundlage ist #16
@Rentner war schon sehr gut bei. Wir sind nicht weit auseinander :wink:

Hallo,

ja , sowas hatte ich auch überlegt , so ist das halt mit Rom :wink: und dem Weg dahin.

Gruß Heinz

Der Bereich ist für mich gut nachzuvollziehen. Struktur macht einem definitiv das Programmieren leichter.

Hier verstehe ich nicht genau was im Sketch passiert.

Das ist gut.
Damit ist das abgehakt :wink:

Ok. Ich versuch es mal zu erklären. Ich hatte ja schon im Kommentar drin, das das eine Falle ist.

ICH habe erkannt, das Du von DigitalPin 2 bis DigitalPin 9 jeden Pin benutzt um einen Titel auszuwählen.
Dabei ist titel7Pin der digitale Pin 2 und titel6Pin der digitale Pin 9
(Sobald auch nur ein PIN eine andere Funktion hätte, würde das nicht mehr funktionieren)
Was passiert jetzt im else-Zweig?
Ich setzte die Variable tasteGedrueckt auf false.
Danach zähle ich alle Pins (von 2 bis 9) durch und lese jeden einzelnen Pin digital aus und frage ab, ob er gesetzt ist:
if (digitalRead(i) == HIGH)
Sobald ein einziger Pin HIGH ist, wird die Variable tasteGedrueckt ebenfalls gesetzt.
tasteGedrueckt = true;

Nehmen wir an, Pin 2 wäre HIGH. Damit ist tasteGedrueckt bereits hier true.
Die Schleife fragt alle weiteren Pins ab. Wenn ein Pin LOW ist, ändert sich nichts. Wenn ein (weiterer) Pin HIGH ist, ändert sich eigentlich auch nichts. Der Zustand ist true.

Jetzt das Ganze, wenn Pin 8 HIGH ist.
Es ist das gleiche Prinzip.
Die For-Schleife läuft bis Pin 7 durch. Bis dahin ist keine gedrueckte Taste erkannt - das ändert sich mit Pin 8.
Also sobald auch nur einmal erkannt wird, das eine Taste gedrückt ist, passiert eigentlich nichts.
Erst wenn ALLE Taste durchlaufen ohne gedrückt zu sein, bleibt der Merker im Zustand "nicht ausgelöst" und erst damit (!) kann hier wieder ein neuer Auslöser gesetzt werden.

  if (tasteGedrueckt == false)                     // Wenn MERKER nicht ausgelöst ...
  {

Der wichtige Punkt ist, das Du verstehst, das Deine Durchnumerierung der Variablen eigentlich kontraproduktiv ist, weil die PIN-Nummern Dein Zählmedium ist.

Wenn Du kein durchgehendes Zählmedium hast, musst Du Dir eines schaffen.
Das zeige ich Dir, wenn Du den Zusammenhang zwischen der Pin-Nummer und dem davon lösgelösten VariablenNamen erkannt hast.

Hallo, wenn meine Pin´s das Zählmedium sind kann ich diese Schleife also nur nutzen wenn die Pins immer die selbe Art an Funktion ausführen sollen. Ich könnte z.B. nicht mit Pin 5 eine LED ansteuern. Ich muss mir also Variablen schaffen die ich als Zählmedium verwende.

Liege ich damit richtig?

Bin jetzt zwei Tage auf Geschäftsreise, melde mich so gut es geht....

ja!
Damit bist Du dann an dem Punkt, wo Du Dich mit Arrays beschäftigen kannst.
Ein Array ist nichts weiter als eine Aneinanderreihung.
Der Zugriff auf den einzelnen Inhalt erfolgt über seine Position.
Diese Position wird als Index bezeichnet.

Dann hört aber auch schon meine Erklärung auf, weil ich glaube, das Du Dir das selbst erarbeiten kannst und damit eindeutig besser fährst, als würde ich das vorkauen.

Aus Deinem Code gemacht:

// Basiert auf https://forum.arduino.cc/t/projekt-dfmp3player-mini/904529/16?u=my_xy_projekt
// ungetestet und ohne Funktionsgarantie
// kompiliert fehlerfrei

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
//---------------------------------------------------
SoftwareSerial mysoftwareSerial(10, 11);
DFRobotDFPlayerMini myDFPlayer;

/*
  // alt:
  const byte titel1Pin = 4;  // Hier ist sortiert nach den Titeln
  const byte titel2Pin = 5;
  const byte titel3Pin = 6;
  const byte titel4Pin = 7;
  const byte titel5Pin = 8;
  const byte titel6Pin = 9;
  const byte titel7Pin = 2;
  const byte titel8Pin = 3;
*/

// Ich verwende ein Array, indem jeder PIN einzeln abgelegt ist
// Die Reihenfolge der PIN oder gar Unterbrechungen der Reihenfolge ist egal
// Der Index des Array wird mein Zählmedium
const byte titelPin[] = {4, 5, 6, 7, 8, 9, 2, 3}; // noch immer sortiert nach Titel

const byte volumeUpPin = 12;  // das sollte klar sein
const byte volumeDownPin = 13;

void setup()
{
  // Hier siehst Du, wie die Variablen verwendet werden
  // Das ist aber aufwendig und schreibintensiv
  // inkl. Fehlermöglichkeiten.
  /*
    pinMode(titel1Pin, INPUT); pinMode(titel2Pin, INPUT); pinMode(titel3Pin, INPUT);
    pinMode(titel4Pin, INPUT); pinMode(titel5Pin, INPUT); pinMode(titel6Pin, INPUT);
    pinMode(titel7Pin, INPUT); pinMode(titel8Pin, INPUT);
  */
  // Also Kurzweg basierend auf Zeile 26:
  for (byte b = 0; b < sizeof(titelPin); b++)
  {
    pinMode(titelPin[b], INPUT);
  }
  pinMode(volumeUpPin, INPUT); pinMode(volumeDownPin, INPUT);
  //---------------------------------------------------
  mysoftwareSerial.begin(9600);
  Serial.begin(115200);
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  if (!myDFPlayer.begin(mysoftwareSerial))   //Use softwareSerial to communicate with mp3.
  {
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(15); //Set volume value. From 0 to 30
  myDFPlayer.pause(); //Play the first mp3
  myDFPlayer.EQ(DFPLAYER_EQ_POP);
}
//===========================================================
void loop()
{
  // Die Variable tasteGedrueckt ist ein Merker, ob ein Tastendruck ausgelöst wurde
  // static bedeutet, das der Inhalt der Variable erhalten bleibt,
  // bis die Funktion erneut aufgerufen wird
  static bool tasteGedrueckt = false;
  if (tasteGedrueckt == false)                     // Wenn MERKER nicht ausgelöst ...
  {
    for (byte b = 0; b < sizeof(titelPin); b++)    // gezaehlt wird über das array
    {
      if (digitalRead(titelPin[b]) == HIGH)        // frage jede einzelne Taste ab
      {
        tasteGedrueckt = true;                     // wenn Taste gedrückt merke es
        myDFPlayer.play(b + 1);                    // und spiele den Titel
      }
    }
  }
  else                                             // ... Merker ist ausgelöst
  {
    tasteGedrueckt = false;                        // dann initialisiere erstmal mit false
    for (byte b = 0; b < sizeof(titelPin); b++)    // frage alle Tasten durch
    {
      if (digitalRead(b) == HIGH)                  // wenn eine der Tasten gedrückt ist
        tasteGedrueckt = true;                     // wird der Merker wieder ausgelöst
    }
  }
  // Wenn DOWN gedrückt ist, wird UP nicht mehr abgefragt
  // Wenn beide Tasten gedrückt sind, wird es IMMER leiser - nie lauter
  if (digitalRead(volumeDownPin) == HIGH) myDFPlayer.volumeDown();
  else if (digitalRead(volumeUpPin) == HIGH) myDFPlayer.volumeUp();
}

So und weil es so schön ist, eine Nachtliteratur für Dich: Code ausfüren wen 2 Bedinungen erfült sind(if) - #14 by my_xy_projekt
dort das .pdf am Ende des Beitrages runterladen und jeden Abend ein wenig lesen.
Nicht auswendig lernen.
Nur wissen, wo es steht.
Aber alles einmal durch - nicht nur sequentiell. Das geht :wink:

Na dann...