Schlaufe Chaos bei if Abfragen

Hallo zusammen

Ich möchte, wenn der RGB-Taster gedrückt wurde, eine mp3 abgespielt wird.
In der Zeit soll der RGB-Taster blinken und nicht mehr blinken, wenn die mp3 abgespielt wurde.
Einzel läuft alles, aber bei alles zusammen, komm ich einfach nicht weiter.
Ab der Taster Abfrage hängt es.
Das ist der "alles zusammen code" der nicht geht:``

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

int rot = 5;
int gruen = 6;
int blau = 3;

//Farbe vom Taster festlegen
int rotHell = 26;
int gruenHell = 33;
int blauHell = 0;
int dunkel = 0;

unsigned long lastMillis;
unsigned long newMillis = millis() - lastMillis;

int Taster = 13; //Taster an Pin 13.
int Tasterstatus = 0; //Das Wort „tasterstatus“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.

SoftwareSerial mySoftwareSerial(10, 11); // TX, RX
DFRobotDFPlayerMini myDFPlayer;


void setup() {
  pinMode(Taster, INPUT);
  pinMode(blau, OUTPUT);
  pinMode(gruen, OUTPUT);
  pinMode(rot, OUTPUT);

  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  myDFPlayer.begin(mySoftwareSerial);
}

void loop() {

  Tasterstatus = digitalRead(Taster); //Hier wird der Pin13 ausgelesen. Das Ergebnis wird unter der Variable „TasterstatusViolet“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert

  if (Tasterstatus == HIGH)   //Ist der Taster gedrückt
  {
    newMillis = millis() - lastMillis;
    if (newMillis >= 1000) {
      lastMillis = millis();
    }

    myDFPlayer.volume(27);  //Lautstärke von bis (0~30).
    myDFPlayer.EQ(DFPLAYER_EQ_BASS);//Equalizer: NORMAL; POP; ROCK; JAZZ; CLASSIC; BASS
    myDFPlayer.playMp3Folder(1);

    if ( (newMillis < 500) || ( (newMillis > 125) && (newMillis < 155)) || ( (newMillis > 250) && (newMillis < 280)))
    {
      analogWrite(rot, rotHell);
      analogWrite(gruen, gruenHell);
      analogWrite(blau, blauHell);
    }
    else
    {
      analogWrite(rot, dunkel);
      analogWrite(gruen, dunkel);
      analogWrite(blau, dunkel);
    }
  }
  else
  {
    analogWrite(rot, rotHell);
    analogWrite(gruen, gruenHell);
    analogWrite(blau, blauHell);
  }
}

Chaos pur

??
Ist die erste Bedingung erfüllt, brauchst Du weder auf Bedingung 2 noch auf Bedingung 3 prüfen.

Ich sehe nirgend, das Du merkst, das der Titel zu Ende ist.

Edit: Wenn es Dir nur ums blinken geht, vielleicht das:

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

int rot = 5;
int gruen = 6;
int blau = 3;

//Farbe vom Taster festlegen
int rotHell = 26;
int gruenHell = 33;
int blauHell = 0;
int dunkel = 0;

unsigned long lastMillis;
unsigned long newMillis = millis() - lastMillis;

int Taster = 13; //Taster an Pin 13.
int Tasterstatus = 0; //Das Wort „tasterstatus“ steht jetzt zunächst für den Wert 0. Später wird unter dieser Variable gespeichert, ob der Taster gedrückt ist oder nicht.

SoftwareSerial mySoftwareSerial(10, 11); // TX, RX
DFRobotDFPlayerMini myDFPlayer;


void setup()
{
  pinMode(Taster, INPUT);
  pinMode(blau, OUTPUT);
  pinMode(gruen, OUTPUT);
  pinMode(rot, OUTPUT);
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
  myDFPlayer.begin(mySoftwareSerial);
}

void blinkTaster()
{
  if ((millis() / 500) % 2 == 0)
  {
    analogWrite(rot, rotHell);
    analogWrite(gruen, gruenHell);
    analogWrite(blau, blauHell);
  }
  else
  {
    analogWrite(rot, dunkel);
    analogWrite(gruen, dunkel);
    analogWrite(blau, dunkel);
  }
}
//
void loop()
{
  Tasterstatus = digitalRead(Taster); //Hier wird der Pin13 ausgelesen. Das Ergebnis wird unter der Variable „TasterstatusViolet“ mit dem Wert „HIGH“ für 5Volt oder „LOW“ für 0Volt gespeichert
  if (Tasterstatus == HIGH)   //Ist der Taster gedrückt
  {
    newMillis = millis() - lastMillis;
    if (newMillis >= 1000)
    {
      lastMillis = millis();
    }
    myDFPlayer.volume(27);  //Lautstärke von bis (0~30).
    myDFPlayer.EQ(DFPLAYER_EQ_BASS);//Equalizer: NORMAL; POP; ROCK; JAZZ; CLASSIC; BASS
    myDFPlayer.playMp3Folder(1);
    blinkTaster();
  }
  else
  {
    analogWrite(rot, rotHell);
    analogWrite(gruen, gruenHell);
    analogWrite(blau, blauHell);
  }
}

Mit dem Block, definiert man das: Blinkverhalten, Tempo und Pausen
Separata get das.

newMillis = millis() - lastMillis;
    if (newMillis >= 1000) {
      lastMillis = millis();
    }

 if ( (newMillis < 500) || ( (newMillis > 125) && (newMillis < 155)) || ( (newMillis > 250) && (newMillis < 280)))
    {
      analogWrite(rot, rotHell);
      analogWrite(gruen, gruenHell);
      analogWrite(blau, blauHell);
    }
    else
    {
      analogWrite(rot, dunkel);
      analogWrite(gruen, dunkel);
      analogWrite(blau, dunkel);
    }
  }

wie kann man wissen ob mp3 zu Ende ist?

Ich habe dein Vorschlag ausprobiert.
Kein blinken, nur das mp3 wird ausgelöst.
Nach dem zweiten mal auslösen, gibt es danach keine Reaktion mehr.
Nur der LED auf dem ArdunioUno leuchtet, solange der Taster gedrückt gehalten wird.

Und weiter geht's :smiley:..

Ich schaue wie lange der ist (mit einer Uhr)
Und übernehme den Wert um die Blinkdauer zu definieren. Soweit bin ich aber noch nicht gekommen.

In einer anderen Projekt habe ich das mit "delay* gelöst. Aber da musste nichts blinken.

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

const int Taster_pin = 13; //Taster an Pin 13.
const int rotLED_pin = 5;
const int gruenLED_pin = 6;
const int blauLED_pin = 3;

//Farbe vom Taster festlegen
const uint8_t rotHell = 26;
const uint8_t gruenHell = 33;
const uint8_t blauHell = 0;
const uint8_t dunkel = 0;

SoftwareSerial mySoftwareSerial(10, 11); // TX, RX
DFRobotDFPlayerMini myDFPlayer;

void setup(){
  pinMode(Taster_pin, INPUT); // nehmen wir an du hast es richtig angeschlossen und beim Tastedrücken hier wird HIGH
  pinMode(blauLED_pin, OUTPUT);
  pinMode(gruenLED_pin, OUTPUT);
  pinMode(rotLED_pin, OUTPUT);
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);
    myDFPlayer.begin(mySoftwareSerial);
    myDFPlayer.volume(27);  //Lautstärke von bis (0~30).
    myDFPlayer.EQ(DFPLAYER_EQ_BASS);//Equalizer: NORMAL; POP; ROCK; JAZZ; CLASSIC; BASS
    myDFPlayer.playMp3Folder(1);
}

void blinkTaster(){
  if ((millis() / 500) % 2 )  {
    analogWrite(rotLED_pin, rotHell);
    analogWrite(gruenLED_pin, gruenHell);
    analogWrite(blauLED_pin, blauHell);
  }
  else  {
    digitalWrite(rotLED_pin, dunkel);
    digitalWrite(gruenLED_pin, dunkel);
    digitalWrite(blauLED_pin, dunkel);
  }
}

void loop(){
  static unsigned long lastMillis;
  static unsigned long Dauer;

  while (! digitalRead(Taster_pin)); //Hier wird der Pin13 ausgelesen.

  Dauer = 3 * 60000; //hier irgendwie dauer bestimmen, ich nehme 3 Minuten
  lastMillis = millis();

  while (millis() - lastMillis < Dauer) blinkTaster();
  
  analogWrite(rotLED_pin, rotHell);
  analogWrite(gruenLED_pin, gruenHell);
  analogWrite(blauLED_pin, blauHell);
}

Der DFPlayer sagt Dir das. Schau Dir die Beispiele der Bibliothek an.
Grüße Uwe

Ich würde dazu den Busy-Pin abfragen (Bild rechts oben):
dfPlayer
Der Busy-Pin ist LOW solange ein File abgespielt wird und HIGH (3,3 Volt), wenn nichts spielt (wenn also das mp3 zu Ende ist).

In der Bibliothek gibt es zwar auch die Möglichkeit über die Serielle Schnittstelle abzufragen, ob gerade gespielt wird oder nicht, allerdings führt das meist zu hörbaren Störungen der Audiowiedergabe.

while (!digitalRead(Busy_pin)) blinkTaster();

Diese while-Konstrukte einem Anfänger als Lösung anzubieten, halte ich für grenzwertig.
Sie mögen zwar im einem konkreten Fall Erfolg zeigen, leiten aber die Erkenntnis in die falsche Richtung: hin zu blockierender Programmgestaltung.

Gruß Tommy

Viiiiilen Dank an alle und speziell an kolaha!
Alles geht! ich musste nur noch kleine Anpassungen machen:

  Dauer = 1 * 6000; //dauer bestimmen
  lastMillis = millis();

  myDFPlayer.playMp3Folder(1);

  while (millis() - lastMillis < Dauer) blinkTaster();

Nun werde ich diese Lösung eingehend studiere, um alles nachvollziehen zu können.

Grüsse aus der Schweiz...

Wenn es funktioniert und auch noch Spaß gemacht hat, ist es auf alle Fälle richtig.

Das hat aber überhaupt nichts miteinander zu tun, auch wenn Du das Zitat von mir aus dem Zusammenhang reißt.

Gruß Tommy

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.