#include #include "DFRobotDFPlayerMini.h" #define pirPin 34 #define ledPin 2 #define RELAY_PIN 15 HardwareSerial dfSerial(2); DFRobotDFPlayerMini myDFPlayer; // Create variables: int val = 0; bool motionState = false; // We start with no motion detected. unsigned long lastRelayTime = 0; // Track when relay was last used void animation(); void setup() { dfSerial.begin(9600, SERIAL_8N1, 16, 17); Serial.begin(9600); Serial.println("Initializing DFPlayer..."); delay(2000); if (!myDFPlayer.begin(dfSerial)) { Serial.println("DFPlayer failed!"); while(true) delay(1000); } Serial.println("DFPlayer online"); myDFPlayer.volume(15); // Configure the pins as input or output: pinMode(ledPin, OUTPUT); pinMode(pirPin, INPUT); // pinMode(BUTTON_PIN, INPUT_PULLDOWN); pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN, HIGH); } void loop() { // Read out the pirPin and store as val: val = digitalRead(pirPin); // If motion is detected (pirPin = HIGH), do the following: if (val == HIGH) { digitalWrite(ledPin, HIGH); // Turn on the on-board LED. // Change the motion state to true (motion detected): // Add cooldown period after relay use to prevent false triggers if (motionState == false && (millis() - lastRelayTime > 2000)) { Serial.print("["); Serial.print(millis()); Serial.println("ms] Motion detected!"); animation(); lastRelayTime = millis(); // Update relay usage time motionState = true; } } // If no motion is detected (pirPin = LOW), do the following: else { digitalWrite(ledPin, LOW); // Turn off the on-board LED. // Change the motion state to false (no motion): if (motionState == true) { Serial.println("Motion ended!"); motionState = false; } } } void animation(){ // Add timestamp Serial.print("["); Serial.print(millis()); Serial.print("ms] Starting animation - Relay ON"); digitalWrite(RELAY_PIN, LOW); delay(100); // Small delay to let relay settle int track = random(2,6); Serial.print(" - Playing track: "); Serial.println(track); myDFPlayer.play(track); delay(5000); digitalWrite(RELAY_PIN, HIGH); delay(100); // Small delay to let relay settle Serial.print("["); Serial.print(millis()); Serial.println("ms] Animation complete - Relay OFF"); return; }