Halloween Projekt der Kids, Pir, Mp3 und Nachtwächter?

Hallo,

kurz zu mir, habe mich vor 6 Jahren mal ein wenig mit Arduino beschäftigt, bis auf ein paar Blinklichter nicht viel erreicht, da zu wenig zeit, Kinder etc.

Nun sind meine Kinder etwas älter und haben ein kleines Halloween Projekt.

Angestrebt ist ein Effekt der durch einen Pir Sensor ausgelöst wir. Der Pir Sensor soll ein Mp3 Board ansteuern und ein Geräusch auslösen, zudem 3 Led lichter in unterschiedlicher Frequenz zum leuchten bringen um einen blitz zu Simulieren, in etwa so: 1Led 0,2an/0,2aus/0,2an/0,2aus/0,2an/0,2aus - beim zweiten an der 1Led die 2Led etwa 0,5an/0,5aus/0,5an/0,5aus - beim ersten aus der 2Led die 3Led ungefähr 0,3an/0,3aus/0,3an/0,3aus. Bisschen blöd erklärt, sorry.

Ich bekomme den Pir Sensor soweit das er eine Abfolge der Led's ablaufen lässt.
mit dem "Nachtwächter" habe ich auch schon herumprobiert, nun aber das entscheidende Problem.

Wie bekomme ich den Pir Sensor dazu den Mp3 Sound abzufeuern und Gleichzeitg den Nachtwächter loszuschicken der nach erfolgtem Ablauf der Sequen wider ruht bis der Pir Sensor Erneut auslöst?

Ab diesem punkt bin ich leider hoffnungslos überfordert.

Wenn jemand einen Tipp oder eine Hilfestellung hat bin ich dafür überaus dankbar.

Ich danke schon mal im voraus

Grüße

1 Like

Wenn der PIR auslöst setzt du dir eine Variable running = true und gleichzeitig einen Timer, wann er gestartet wurde. Wenn running == true ignoriest du weitere PIR Trigger. Nach Ablauf des Timers wird running = false.

3 Nachtwächter:

void loop() {
  unsigned long currentMillis = millis();
  
   if (running == true) {
	   if (currentMillis - previousMillis >= interval) {
		previousMillis = currentMillis;
		if (ledState == LOW) {
		  ledState = HIGH;
		} else {
		  ledState = LOW;
		}
		digitalWrite(ledPin, ledState);
	  }
	  if (currentMillis - previousMillis1 >= interval1) {
		previousMillis1 = currentMillis;
		if (ledState1 == LOW) {
		  ledState1 = HIGH;
		} else {
		  ledState1 = LOW;
		}
		digitalWrite(ledPin1, ledState1);
	  }
	  if (currentMillis - previousMillis2 >= interval1) {
		previousMillis2 = currentMillis;
		if (ledState2 == LOW) {
		  ledState2 = HIGH;
		} else {
		  ledState2 = LOW;
		}
		digitalWrite(ledPin2, ledState1);
	  }
   } else {
   digitalWrite(ledPin, LOW);
   digitalWrite(ledPin1, LOW);
   digitalWrite(ledPin2, LOW);   
   }  
}

@daywalker85
Also erst mall zeige was du schon hast schein so aussehen das du ziemlich weit bist.

Nö.

// Forensketch Halloween Projekt der Kids, Pir, Mp3 und Nachtwächter?)
// https://forum.arduino.cc/t/halloween-projekt-der-kids-pir-mp3-und-nachtwachter/1178798

constexpr byte pirPin {5};
constexpr byte ledPin[] {2, 3, 4};
constexpr uint32_t ledSwitchIntervall[sizeof(ledPin)] {200, 500, 300};
uint32_t ledSwitchTime[sizeof(ledPin)] = {0, 0, 0};

byte zaehler[sizeof(ledPin)] = {0};
bool state;

void setup()
{
  Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
  delay(300);
#endif
  Serial.println(F("\r\nStart...\r\n"));
  pinMode(pirPin, INPUT);
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    pinMode(ledPin[b], OUTPUT);
    digitalWrite(ledPin[b], LOW);
  }
}

void  loop()
{
  if (digitalRead(pirPin) && !state)          // Der PIR wird nur einmal ausgelöst (retriggersperre)
  {
    blinkStart(0);
  }
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    if (zaehler[b]) // Wenn Zaehler aktiv
    {
      blinken(b);   // dann switchen
    }
    if (zaehler[0] == 3)      // Wenn
    {
      blinkStart(1);          // dann nächsten blinker Starten
    }
    else if (zaehler[0] == 6) // Ende?
    {
      blinkStop(0);
    }
    if (zaehler[1] == 2)
    {
      blinkStart(2);
    }
    if (zaehler[1] == 4)
    {
      blinkStop(1);
    }
    if (zaehler[2] == 4)
    {
      blinkStop(2);
    }
  }
  // gib den PIR wieder frei, wenn kein Zaehler aktiv
  state = false;
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    if (zaehler[b] != 0)
    {
      state = true;
    }
  }
}

void blinkStart(const byte ledNum)
{
  zaehler[ledNum] = 1;
  digitalWrite(ledPin[ledNum], HIGH);
  ledSwitchTime[ledNum] = millis();
}

void blinkStop(const byte ledNum)
{
  zaehler[ledNum] = 0;
  digitalWrite(ledPin[ledNum], LOW);
}

void blinken(const byte ledNum)
{
  if (millis() - ledSwitchTime[ledNum] >= ledSwitchIntervall[ledNum])
  {
    ledSwitchTime[ledNum] += ledSwitchIntervall[ledNum];
    digitalWrite(ledPin[ledNum], !digitalRead(ledPin[ledNum]));
    zaehler[ledNum]++;
  }
}

Nicht schön und noch mit versetzten Klammern, aber zum ersten Test....

Ooooha, komplexer als ich dachte, aber funktionieren tut es, super Sache, danke :v:.

Ich habe gemerkt das ich echt recht wenig weiß, kann nur vereinzelte befehle und deren Funktion interpretieren :astonished:. da ist wohl noch massives pauken angesagt :stuck_out_tongue_closed_eyes:

könnte man am ende der blink Sequenz noch eine sperre für den Pir einfügen damit er, sagen wir mal, erst nach 30sekunden wieder auslösbar ist? also nicht direkt nach der Sequenz wieder scharfgestellt ist?

Der schein trügt, hab mir aus vorhanden Tutorials die Zeilen geklaut die ich dachte verwenden zu können. Hat zum teil auch Funktioniert aber wenn ich mir den sketch von my_xy_projekt so ansehe weiß ich, das ich nichts weiß :see_no_evil:

1 Like

Auf 5 Sekunden gesetzt - Die Variable findest Du oben im Kopf

// EDIT - ist kommentiert

// Forensketch Halloween Projekt der Kids, Pir, Mp3 und Nachtwächter?)
// https://forum.arduino.cc/t/halloween-projekt-der-kids-pir-mp3-und-nachtwachter/1178798

constexpr byte pirPin {5};
constexpr uint32_t pirSperrTime {5000};

constexpr byte ledPin[] {2, 3, 4};
constexpr uint32_t ledSwitchIntervall[sizeof(ledPin)] {200, 500, 300};
uint32_t ledSwitchTime[sizeof(ledPin)] = {0, 0, 0};

byte zaehler[sizeof(ledPin)] = {0};
bool state;

void setup()
{
  Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
  delay(300);
#endif
  Serial.println(F("\r\nStart...\r\n"));
  pinMode(pirPin, INPUT);
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    pinMode(ledPin[b], OUTPUT);
    digitalWrite(ledPin[b], LOW);
  }
}

void  loop()
{
  if (digitalRead(pirPin) && !state)          // Der PIR wird nur einmal ausgelöst (retriggersperre)
  {
    blinkStart(0);
  }
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    if (zaehler[b]) // Wenn Zaehler aktiv
    {
      blinken(b);   // dann switchen
    }
    if (zaehler[0] == 3)      // Wenn
    {
      blinkStart(1);          // dann nächsten blinker Starten
    }
    else if (zaehler[0] == 6) // Ende?
    {
      blinkStop(0);
    }
    if (zaehler[1] == 2)
    {
      blinkStart(2);
    }
    if (zaehler[1] == 4)
    {
      blinkStop(1);
    }
    if (zaehler[2] == 4)
    {
      blinkStop(2);
    }
  }
  // gib den PIR wieder frei, wenn kein Zaehler aktiv
  state = false;
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    if (zaehler[b] != 0 || millis() - ledSwitchTime[2] < pirSperrTime) // edit!!
    {
      state = true;
    }
  }
}

void blinkStart(const byte ledNum)
{
  zaehler[ledNum] = 1;
  digitalWrite(ledPin[ledNum], HIGH);
  ledSwitchTime[ledNum] = millis();
}

void blinkStop(const byte ledNum)
{
  zaehler[ledNum] = 0;
  digitalWrite(ledPin[ledNum], LOW);
}

void blinken(const byte ledNum)
{
  if (millis() - ledSwitchTime[ledNum] >= ledSwitchIntervall[ledNum])
  {
    ledSwitchTime[ledNum] += ledSwitchIntervall[ledNum];
    digitalWrite(ledPin[ledNum], !digitalRead(ledPin[ledNum]));
    zaehler[ledNum]++;
  }
}

Ich bin da eine ganz schlechte Vergleichsmöglichkeit.
Ich baue Code nur nach Logik.
Da war deine Aufgabe schon echt gut formuliert.

Ich Staune :crazy_face: :hugs:

Wenn jetzt noch der Mini MP3 DFPlayer eingefügt wird der beim auslösen des Pir den Sound abfeuert habe ich bis Halloween zeit (und wahrscheinlich noch lange zeit mehr) mich intensiv mit den befehlen auseinander zu setzen um sie zu verstehen und deren Zusammenhang zu erkennen :v:

Mega, bin echt überaus dankbar :hugs: :hugs: :hugs:

// Forensketch Halloween Projekt der Kids, Pir, Mp3 und Nachtwächter?)
// https://forum.arduino.cc/t/halloween-projekt-der-kids-pir-mp3-und-nachtwachter/1178798
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

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



constexpr byte pirPin {5};
constexpr uint32_t pirSperrTime {5000};

constexpr byte ledPin[] {2, 3, 4};
constexpr uint32_t ledSwitchIntervall[sizeof(ledPin)] {200, 500, 300};
uint32_t ledSwitchTime[sizeof(ledPin)] = {0, 0, 0};

byte zaehler[sizeof(ledPin)] = {0};
bool pirSperre;

void setup()
{
  Serial.begin(115200);
  playerSerial.begin(9600);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
  delay(300);
#endif
  Serial.println(F("\r\nStart...\r\n"));
  pinMode(pirPin, INPUT);
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    pinMode(ledPin[b], OUTPUT);
    digitalWrite(ledPin[b], LOW);
  }
}

void  loop()
{
  if (digitalRead(pirPin) && !pirSperre)     // Der PIR wird nur einmal ausgelöst (retriggersperre)
  {
    blinkStart(0);
    dfPlayerStart();
  }
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    if (zaehler[b]) // Wenn Zaehler aktiv
    {
      blinken(b);   // dann switchen
    }
  }
  if (zaehler[0] == 3)      // Wenn
  {
    blinkStart(1);          // dann nächsten blinker Starten
  }
  else if (zaehler[0] >= 6) // Ende?
  {
    blinkStop(0);
  }
  if (zaehler[1] == 2)
  {
    blinkStart(2);
  }
  else if (zaehler[1] >= 4)
  {
    blinkStop(1);
  }
  if (zaehler[2] >= 4)
  {
    blinkStop(2);
  }
  // gib den PIR wieder frei, wenn kein Zaehler aktiv
  pirSperre = false;
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    if (zaehler[b] != 0 ||                          // Solange ein Zaehler aktiv ODER
        millis() - ledSwitchTime[2] < pirSperrTime) // nach dem letzeabgelaufen
    {
      pirSperre = true;                                 //
    }
  }
}


void dfPlayerStart()
{
  // Hier den DFplayer spielen lassen
  // Der gibt auch einen Status zurück, der angibt, wenn er nicht (mehr) spielt
  // Den kann man ebenfalls in die retriggersperre setzen
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}


void blinkStart(const byte ledNum)       // die Zuordnung ergibt sich aus ledPin[]
{
  zaehler[ledNum] = 1;                   // setzt den Merker fürs einschalten
  digitalWrite(ledPin[ledNum], HIGH);    //
  ledSwitchTime[ledNum] = millis();      // merkt sich die Einschaltzeit
}

void blinkStop(const byte ledNum)        // blinkSart
{
  zaehler[ledNum] = 0;                   // Merker löschen
  digitalWrite(ledPin[ledNum], LOW);     // gesichert aus machen
}

void blinken(const byte ledNum)
{
  if (millis() - ledSwitchTime[ledNum] >= ledSwitchIntervall[ledNum]) // Wenn Zeit abgelaufen
  {
    ledSwitchTime[ledNum] += ledSwitchIntervall[ledNum];              // Schaltzeitpunkt merken
    digitalWrite(ledPin[ledNum], !digitalRead(ledPin[ledNum]));       // toogelt den PIN
    zaehler[ledNum]++;                                                //
  }
}

kommst damit klar?

Ja, bis auf "// Der gibt auch einen Status zurück, der angibt, wenn er nicht (mehr) spielt".

Wie müsste es aussehen wenn die Pir Sperre, also die gesetzten 5sekunden erst ablaufen nachdem der Sound den Status "läuft nicht mehr" setzt?

also mp3 spielt "pir sperre ist ja währendessen aktiv", Mp3 endet - setzt Status Mp3 ende, dann Pir Sperre noch weitere 5sekunden aktiv nachdem Mp3 ende.

Nur so nebenbei, du rettest mir gerade massiv den Ar... :rofl: :rofl:

Nicht unbedingt funktionierend, aber eine Art Idee

// Forensketch Halloween Projekt der Kids, Pir, Mp3 und Nachtwächter?)
// https://forum.arduino.cc/t/halloween-projekt-der-kids-pir-mp3-und-nachtwachter/1178798
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial playerSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
constexpr uint32_t playerSperrTime {5000};
uint32_t playerStopTime;
bool dfState = false;

constexpr byte pirPin {5};
constexpr uint32_t pirSperrTime {5000};

constexpr byte ledPin[] {2, 3, 4};
constexpr uint32_t ledSwitchIntervall[sizeof(ledPin)] {200, 500, 300};
uint32_t ledSwitchTime[sizeof(ledPin)] = {0, 0, 0};

byte zaehler[sizeof(ledPin)] = {0};
bool pirSperre;

void setup()
{
  Serial.begin(115200);
  playerSerial.begin(9600);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
  delay(300);
#endif
  Serial.println(F("\r\nStart...\r\n"));
  pinMode(pirPin, INPUT);
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    pinMode(ledPin[b], OUTPUT);
    digitalWrite(ledPin[b], LOW);
  }
}

void  loop()
{
  if (digitalRead(pirPin) && !pirSperre)     // Der PIR wird nur einmal ausgelöst (retriggersperre)
  {
    blinkStart(0);
    dfPlayerStart();
    dfState = true;
  }
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    if (zaehler[b]) // Wenn Zaehler aktiv
    {
      blinken(b);   // dann switchen
    }
  }
  if (zaehler[0] == 3)      // Wenn
  {
    blinkStart(1);          // dann nächsten blinker Starten
  }
  else if (zaehler[0] >= 6) // Ende?
  {
    blinkStop(0);
  }
  if (zaehler[1] == 2)
  {
    blinkStart(2);
  }
  else if (zaehler[1] >= 4)
  {
    blinkStop(1);
  }
  if (zaehler[2] >= 4)
  {
    blinkStop(2);
  }
  // gib den PIR wieder frei, wenn kein Zaehler aktiv
  pirSperre = false;
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    if (zaehler[b] != 0 ||                            // Solange ein Zaehler aktiv ODER
        millis() - ledSwitchTime[2] < pirSperrTime || // nach dem letzeabgelaufen
        millis() - playerStopTime < playerSperrTime)  // player noch aktiv
    {
      pirSperre = true;                                 //
    }
  }
  dfPlayerAktive();
}
void dfPlayerStart()
{
  // Hier den DFplayer spielen lassen
  // Der gibt auch einen Status zurück, der angibt, wenn er nicht (mehr) spielt
  // Den kann man ebenfalls in die retriggersperre setzen
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}
void dfPlayerAktive()
{
  if (dfState)
  {
    if (myDFPlayer.available())
    {
      if (myDFPlayer.readType() == DFPlayerPlayFinished)
      {
        playerStopTime = millis();
        dfState = false;
      }
    }
  }
}
void blinkStart(const byte ledNum)       // die Zuordnung ergibt sich aus ledPin[]
{
  zaehler[ledNum] = 1;                   // setzt den Merker fürs einschalten
  digitalWrite(ledPin[ledNum], HIGH);    //
  ledSwitchTime[ledNum] = millis();      // merkt sich die Einschaltzeit
}
void blinkStop(const byte ledNum)        // blinkSart
{
  zaehler[ledNum] = 0;                   // Merker löschen
  digitalWrite(ledPin[ledNum], LOW);     // gesichert aus machen
}
void blinken(const byte ledNum)
{
  if (millis() - ledSwitchTime[ledNum] >= ledSwitchIntervall[ledNum]) // Wenn Zeit abgelaufen
  {
    ledSwitchTime[ledNum] += ledSwitchIntervall[ledNum];              // Schaltzeitpunkt merken
    digitalWrite(ledPin[ledNum], !digitalRead(ledPin[ledNum]));       // toogelt den PIN
    zaehler[ledNum]++;                                                //
  }
}

Noch ein Hinweis: Sollte das nicht gehen, müsstest Du sagen, Ob Du das Modul hast.

Der hat nen BUSY-Pin. Den würde ich dann nehmen, anstelle der softwareseitigen Abfrage.

Ja das müsst er sein, kann ich aber leider noch nicht 100 pro sagen da mir, na rate mal, genau der Mp3 Player noch nicht vorliegt. Bei AZ bestellt, kommt die tage, aber dem Bild und der Beschreibung nach müsste das der selbe sein.

GutenMorgen :wink:

Ich hab mich mal zwischendurch an das Ding gesetzt udn auf busyPin umgeschrieben.
Gleichzeitig aufgeräumt.
Du kannst das ganz einfach testen ohne Player.
Dazu müsste es reichen die auskommentierten Zeilen einfach einkommentieren.

Na denne.

// Forensketch Halloween Projekt der Kids, Pir, Mp3 und Nachtwächter?)
// https://forum.arduino.cc/t/halloween-projekt-der-kids-pir-mp3-und-nachtwachter/1178798
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

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

constexpr byte busyPin {6};                // Wenn der Player läuft, ist der PIN High
constexpr uint32_t playerSperrTime {5000};
uint32_t playerLastTime;

constexpr byte pirPin {5};
constexpr uint32_t pirSperrTime {5000};

constexpr byte ledPin[] {2, 3, 4};
constexpr uint32_t ledSwitchIntervall[sizeof(ledPin)] {200, 500, 300};
uint32_t ledSwitchTime[sizeof(ledPin)] = {0, 0, 0};

byte zaehler[sizeof(ledPin)] = {0};

enum class Status {warten, blitz, sperre};
Status zustand = Status::warten;

void setup()
{
  Serial.begin(115200);
  playerSerial.begin(9600);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
  delay(300);
#endif
  Serial.println(F("\r\nStart...\r\n"));
  pinMode(pirPin, INPUT);
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    pinMode(ledPin[b], OUTPUT);
    digitalWrite(ledPin[b], LOW);
  }
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  pinMode(busyPin, INPUT);
  digitalWrite(busyPin, LOW);
}
//
void  loop()
{
  zustandsAutomat();
  blitzlicht();
}
//
void zustandsAutomat()
{
  switch (zustand)
  {
    case Status::warten:
      if (digitalRead(pirPin))     // Der PIR wird nur einmal ausgelöst (retriggersperre)
      {
        blinkStart(0);
        dfPlayerStart();
        zustand = Status::blitz;
        // digitalWrite(busyPin, HIGH); // Zustandstest! -sonst auskomemntieren!
      }
      break;
    case Status::blitz:
      if (zaehler[2] >= 4)
      {
        blinkStop(2);
        zustand = Status::sperre;
        // digitalWrite(busyPin, LOW);  // Zustandstest -sonst auskommentieren!
      }
      // checkt, ob Player läuft
      if (digitalRead(!busyPin))                     // PIN ist schon LOW
      { playerLastTime = millis(); }    // Zeit merken
      break;
    case Status::sperre:
      if (digitalRead(busyPin))                      // PIN ist noch HIGH
      { playerLastTime = millis(); }    // Zeit merken
      // gib den PIR wieder frei, wenn Zeiten abgelaufen
      if (millis() - ledSwitchTime[2] > pirSperrTime && // nach dem letzen abgelaufen
          millis() - playerLastTime > playerSperrTime)  // player nicht aktiv
      {
        zustand = Status::warten;                       //
      }
      break;
  }
}
//
void blitzlicht()
{
  for (byte b = 0; b < sizeof(ledPin); b++)
  {
    if (zaehler[b]) // Wenn Zaehler aktiv
    {
      blinken(b);   // dann switchen
    }
  }
  if (zaehler[0] == 3)      // Wenn
  {
    blinkStart(1);          // dann nächsten blinker Starten
  }
  else if (zaehler[0] >= 6) // Ende?
  {
    blinkStop(0);
  }
  if (zaehler[1] == 2)
  {
    blinkStart(2);
  }
  else if (zaehler[1] >= 4)
  {
    blinkStop(1);
  }
}
//
void dfPlayerStart()
{
  // Hier den DFplayer spielen lassen
  // Der gibt auch einen Status zurück, der angibt, wenn er nicht (mehr) spielt
  // Den kann man ebenfalls in die retriggersperre setzen
  myDFPlayer.play(1);  //Play the first mp3
}
//
void blinkStart(const byte ledNum)       // die Zuordnung ergibt sich aus ledPin[]
{
  zaehler[ledNum] = 1;                   // setzt den Merker fürs einschalten
  digitalWrite(ledPin[ledNum], HIGH);    //
  ledSwitchTime[ledNum] = millis();      // merkt sich die Einschaltzeit
  digitalWrite(busyPin, HIGH);
}
//
void blinkStop(const byte ledNum)        // blinkStop für ledPin[]
{
  zaehler[ledNum] = 0;                   // Merker löschen
  digitalWrite(ledPin[ledNum], LOW);     // gesichert aus machen
}
//
void blinken(const byte ledNum)
{
  if (millis() - ledSwitchTime[ledNum] >= ledSwitchIntervall[ledNum]) // Wenn Zeit abgelaufen
  {
    ledSwitchTime[ledNum] += ledSwitchIntervall[ledNum];              // Schaltzeitpunkt merken
    digitalWrite(ledPin[ledNum], !digitalRead(ledPin[ledNum]));       // toogelt den PIN
    zaehler[ledNum]++;                                                //
  }
}

Tach, wenn ich das 1 zu 1 Übernehm sagt er das die bibliothek fur den player fehlt, ist ja klar, wenn ich "#include "DFRobotDFPlayerMini.h"" kommentier sagt er "DFRobotDFPlayerMini myDFPlayer; does not name a type", und so weiter. Ich glaub zum Test brauch ich dann doch den Player.

Und da kommt gleich die nächste frage :see_no_evil:
woher wissen die Led's wie oft sie blinken müssen? wie Ändere ich die Anzahl des Blinkens? kann die Anzahl variabel verändert werden? Die gleiche frage betrifft die Ausschaltzeit, denke aber sie ist an die Einschaltzeit gekoppelt da diese ja identisch sind.

Mir ist auch aufgefallen das die Led an pin 4 das zweite mal blinken nicht gleich lang ausführt wie das erste leuchten, als bim zweiten blink ist dies minimal kürzer, woran kann das liegen? Ich finde es vom gesamt Bild sogar recht gut, möchte aber gern verstehen weshalb das so ist.

Ich oute mich gerade als den Größten noop in Sachen Programmierung, dabei war ich so stolz auf mein einfaches blinken :sweat_smile:

iKanns nur immerwieder sagen, vielen dank für deine hilfe und die damit verbundene arbeit, zeit und aufwand :v:

Du kannst ind der IDE unter sketch bibliothejsverwalter nach der lib suchen oder dir von dem link das als ZIP runterladen und dann im bibloverwalter via .zip- Bibliothek hinzufügen einlesen.

Dann kompiliert es.

Die anzahl für das blinken ergibt sich aus dem Vergleich in der Funktion blinken.
Die könnte man als konstante nach oben holen, damit die einfacher anzupassen sind

Das mit den ein- und ausschaltzeuten gabe ich grad in einem anderen Projekt "flexibel" gezeigt. Schau mal in den zeitscgaluhr ghread.
Ich bin mitm Handy unterwegs .
Sag was du haben wkst und ich Bau dir das morgen....

Hi, Sorry hat etwas gedauert.

Aaaaalso, der Sketch mit dem Dfplayer funktioniert nicht, es tut sich gar nichts außer das die tx Led eine zeit lang leuchtet und dann erlischt. Habe einen Test Sketch laufen lassen und der Player spielt die mp3 ab. Der reine Blinksketch ohne den Player funktioniert auch, aber leider weder der ohne den busy pin, noch der mit. Arduino bootet, die tx Led leuchtet eine weile und mehr passiert leider nicht.

Weißt du woran es liegen kann?

Schaltung des Dfplayer: vcc 5v, Ground, busy pin - pin 6, rx - 1k ohm Wiederstand - pin 10, tx - pin 11

Grüße

Das ist der Sketch den ich zum testen verwendet habe ob die mp3 überhaupt abgespielt wird. Komischerweise muss ich allerdings rx an pin 11 legen und tx an pin 10, entgegen der zuweisung :man_shrugging:

/***************************************************
DFPlayer - A Mini MP3 Player For Arduino
 <https://www.dfrobot.com/product-1121.html>
 
 ***************************************************
 This example shows the basic function of library for DFPlayer.
 
 Created 2016-12-07
 By [Angelo qiao](Angelo.qiao@dfrobot.com)
 
 GNU Lesser General Public License.
 See <http://www.gnu.org/licenses/> for details.
 All above must be included in any redistribution
 ****************************************************/

/***********Notice and Trouble shooting***************
 1.Connection and Diagram can be found here
 <https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
 2.This code is tested on Arduino Uno, Leonardo, Mega boards.
 ****************************************************/

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  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){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

void loop()
{
  static unsigned long timer = millis();
  
  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }
  
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }
}

void printDetail(uint8_t type, int value){
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}