A
Arduino2mo ago
sen

help with ir, pir motion, and dfplayer logic

im a 4th year student with no prior knowledge on robotics/arduino programming, however i do have basic knowledge on c++ im trying to make a system: 2 pir sensors (pir1 and pir2) 2 ir sensors (ir1 and ir2) 1 dfplayer (mp3 player) - (rx, tx) - (3, 2) if pir 1 detects, audio 1 will play. ir pir 2 detects, audio 5 will play. if pir1 and ir1 both detect, audio 2 will play if ir2 detects, all audio will stop OR all pir sensors will turn off while its detecting. #include <SoftwareSerial.h> #include "DFRobotDFPlayerMini.h" const int pir1 = 4; const int pir2 = 6; const int ir1 = 5; const int ir2 = 8; SoftwareSerial mp3Serial(3, 2); DFRobotDFPlayerMini mp3; unsigned long lastplay1 = 0, lastplay2 = 0, lastplay3 = 0; const unsigned long cd1 = 3500; const unsigned long cd2 = 2000; const unsigned long cd3 = 3500; void setup() { pinMode(pir1, INPUT); pinMode(pir2, INPUT); pinMode(ir1, INPUT_PULLUP); pinMode(ir2, INPUT_PULLUP); Serial.begin(9600); mp3Serial.begin(9600); if (mp3.begin(mp3Serial)) { mp3.volume(25); Serial.println("DFPlayer ready"); } else { Serial.println("DFPlayer not found"); } delay(2000); } void playIfCooldown(int track, unsigned long &last, unsigned long cd) { unsigned long now = millis(); if (now - last >= cd) { mp3.play(track); last = now; Serial.print("Playing track: "); Serial.println(track); } } void loop() { bool zone1 = digitalRead(pir1) == HIGH; bool zone2 = digitalRead(pir2) == HIGH; bool trainin = digitalRead(ir1) == LOW;
bool trainstop = digitalRead(ir2) == LOW;
if (trainstop) { mp3.stop(); Serial.println("Train stopped -> stop audio"); } else if (zone1) { if (trainin) { playIfCooldown(2, lastplay3, cd3); } else { playIfCooldown(1, lastplay1, cd1); } } else if (zone2) { playIfCooldown(3, lastplay2, cd2); } } issue: the pir somehow just keeps detecting?
3 Replies
sen
senOP2mo ago
here, i changed the code. but what happens is that pir2 is constantly switching from 0 to 1 and 0 to 1. its acting independently. even if theres motion in front of the sensor, it just keeps printing 01010101 #include <SoftwareSerial.h> #include "DFRobotDFPlayerMini.h" // Pin assignments const int PIR1 = 4; const int PIR2 = 6; const int IR1 = 8; const int IR2 = 5; SoftwareSerial mp3Serial(3, 2); // RX, TX DFRobotDFPlayerMini mp3; bool isPlaying = false; void setup() { Serial.begin(9600); mp3Serial.begin(9600); // Use INPUT_PULLUP so idle = HIGH, triggered = LOW pinMode(PIR1, INPUT); pinMode(PIR2, INPUT); pinMode(IR1, INPUT_PULLUP); pinMode(IR2, INPUT_PULLUP); if (mp3.begin(mp3Serial)) { mp3.volume(25); Serial.println("DFPlayer ready"); } else { Serial.println("DFPlayer not found"); while (true); } } void loop() { // Read sensors int pir1 = digitalRead(PIR1); int pir2 = digitalRead(PIR2); int ir1 = digitalRead(IR1); int ir2 = digitalRead(IR2); // Debugging Serial.print("PIR1: "); Serial.print(pir1); Serial.print(" PIR2: "); Serial.print(pir2); Serial.print(" IR1: "); Serial.print(ir1); Serial.print(" IR2: "); Serial.println(ir2); // DFPlayer event handling if (mp3.available()) { uint8_t type = mp3.readType(); if (type == DFPlayerPlayFinished) { Serial.println("Track finished → ready for next trigger"); isPlaying = false; } } if (ir2 == LOW) { // IR2 active → stop audio if (isPlaying) { mp3.stop(); Serial.println("IR2 active → Audio stopped"); isPlaying = false; } } else if (ir1 == LOW && ir2 == HIGH) { // IR1 ON, IR2 OFF if (pir1 == LOW && !isPlaying) { mp3.play(2); isPlaying = true; Serial.println("Audio2 (IR1 + PIR1)"); } else if (pir1 == HIGH && !isPlaying) { mp3.play(5); isPlaying = true; Serial.println("Audio5 (IR1 only)"); } } else if (ir1 == HIGH && ir2 == HIGH) { // Both IR OFF if (pir1 == LOW && !isPlaying) { mp3.play(1); isPlaying = true; Serial.println("Audio1 (PIR1 only)"); } else if (pir1 == HIGH && !isPlaying) { mp3.play(5); isPlaying = true; Serial.println("Audio5 (Idle default)"); } } delay(100); // small delay for stability }
sen
senOP2mo ago
sen
senOP2mo ago
alright man my bad but i did put in the logic i wanted, i had a brief c++ code fragment of the if else logic i wanted, and i did ask ai to help me implement that into the code and check for errors because as i said i dont have any prior knowledge in arduino/robotics programming. i checked the code too and i thought it looked fine and i havent been programming long enough to really see errors, so thats why im asking for help here alright man

Did you find this page helpful?