Aquino Uno Arduino - DFPlayer Mini PIR Sensor HC-SR501

Hallo zusammen!

Ich bin neu hier weil ich versucht habe mit dem Arduino Uno einen kleinen MP3 Player mit eingebautem Bewegungsmelder zu bauen, allerdings bin ich beim Code auf ein Problem gestoßen.

Der Arduino spielt zwar nach dem Drücken des Reset Buttons für ca. 30 Minuten, immer wenn jemand vorbei geht bzw eine Bewegung erkannt wurde den Soing auf der SD Karte. Wird allerdings für eine längere Zeit keine Bewegung erkannt, geht der Arduino in einen Art Schlafmodus und kann nur wieder durch das Drücken des Reset Knopfes gestartet werden.

Könnte mir jemand bei dem Code behilflich sein?

#include "DFRobotDFPlayerMini.h"

#if !defined(UBRR1H)
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // DFPlayer RX, TX
#endif

DFRobotDFPlayerMini myDFPlayer;


int PIRPin = 2;               // HC-SR501 Pin
int pirState = LOW;             // beim Start wird keine Bewegung erkannt
int val = 0;                    // Variable zum Auslesen des Status



//
void setup () {
  Serial.begin(115200); //Serielle Kommunikation initalisieren
  mySerial.begin(9600);
  myDFPlayer.begin(mySerial);
  
#if !defined(UBRR1H)
  mySerial.begin(9600);
  myDFPlayer.begin(mySerial);
  
#else
  Serial.begin(9600);
  myDFPlayer.begin(Serial1);
#endif
  Serial.println("Volume set");
  myDFPlayer.volume(12);
  
  
 


                                                                    

 pinMode(PIRPin, INPUT);     // HC-SR501 Pin als Input deklarieren
}


//
void loop () 



{
                   
    
  val = digitalRead(PIRPin);  // HC-SR501 Pin auslesen
  if (val == HIGH) {            // Prüfe ob der Pin "High" ist     



  if (pirState == LOW) {
      // Start
      Serial.println("Bewegung erkannt!");
      // Output-Veraenderung ausgeben
      pirState = HIGH;
      Serial.println("Spiele Sound-Datei ab");
      delay(2000);
      myDFPlayer.play(1); // Spiele die erste Datei ab
      delay(30000) ;
    
      
 

}
} else {


if (pirState == HIGH){
      // Ende
      Serial.println("Bewegung beendet!");
      // Output-Veraenderung ausgeben
      pirState = LOW;
        
        
 
       
}
}
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Wie man dieses Forum benutzt - bitte lesen


Wo finde ich den Beitrag nun? Mit freundlichen Grüßen Niclas

Im deutschen Bereich.

Es gibt nichts in Ihrem Code, das Ihren Arduino UNO in den 'Schlafmodus' versetzt.

Sie haben es gefunden :slight_smile:

Ah super! :slight_smile: An was könnte das Verhalten des Arduino´s sonst noch liegen? Oder wüssten Sie einen "Work Arround" für das Problem

Warum glauben Sie, dass das Arduino-Board in den Schlafmodus geht? Wie wird es mit Strom versorgt? (Mit einer Powerbank für Handys?)

Der Arduino steckt mit einem Netzteil an der Steckdose. Verdächtig ist für mich einfach dass er nach einer gewissen Zeit mit unerkannter Bewegung sich nur durch den Reset Button wieder starten lässt.

Das board mit Lautsprechern sollte eigentlich fix eingebaut werden.

Formatiere mal den code ordendlich und daann schau' was passiert wenn der PIRPin auf LOW geht.

Es scheint mir eher, dass Ihr Arduino abgestürzt ist...

Das ist nicht korrekt in Ihrem setup().

  Serial.begin(115200); //Serielle Kommunikation initalisieren
  mySerial.begin(9600);
  myDFPlayer.begin(mySerial);

#if !defined(UBRR1H)
  mySerial.begin(9600);
  myDFPlayer.begin(mySerial);
#else
  Serial.begin(9600);
  myDFPlayer.begin(Serial1);
#endif

Sie müssen Ihren Code aufräumen.

#include "DFRobotDFPlayerMini.h"
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // DFPlayer RX, TX
DFRobotDFPlayerMini myDFPlayer;
const byte PIRPin = 2;  // HC-SR501 Pin
int pirState = LOW;     // beim Start wird keine Bewegung erkannt

void setup () {
  pinMode(PIRPin, INPUT);     // HC-SR501 Pin als Input deklarieren
  Serial.begin(115200); //Serielle Kommunikation initalisieren
  mySerial.begin(9600);
  myDFPlayer.begin(mySerial);
  Serial.println("Volume set");
  myDFPlayer.volume(12);
}

void loop () {
  if (digitalRead(PIRPin) == HIGH) {            // Prüfe ob der Pin "High" ist
    if (pirState == LOW) {
      // Start
      Serial.println("Bewegung erkannt!");
      // Output-Veraenderung ausgeben
      pirState = HIGH;
      Serial.println("Spiele Sound-Datei ab");
      delay(2000);
      myDFPlayer.play(1); // Spiele die erste Datei ab
      delay(30000) ;
    }
  } else {
    if (pirState == HIGH) {
      // Ende
      Serial.println("Bewegung beendet!");
      // Output-Veraenderung ausgeben
      pirState = LOW;
    }
  }
}

Ein Problem mit Ihrem Code ist, dass Sie nicht alle Fälle behandeln.


void loop () {
  if (digitalRead(PIRPin) == HIGH) {            // Prüfe ob der Pin "High" ist
    if (pirState == LOW) {
      pirState = HIGH;
      ....
    } else {  // <<======= ?????
      ???
    }
  }
} else {
  if (pirState == HIGH) {
    pirState = LOW;
    ....
  } else {  // <<======= ?????
    ???
  }
}

Da passiert genau einmal das löschen des pirState.
Und nur wenn pirState LOW ist, kann ein HIGH gezogener pirPin den DF-Player wieder auslösen.
Und setzt den pirState als Wiederholsperre wieder HIGH.

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