Buona sera a tutti, sto cercando aiuto per quando riguarda la costruzione di un dissuasore per uccelli nocivi alle coltivazioni.... il progetto è stato fatto con un Arduino Uno e un DfPlayerMini mp3.... nella scheda sd ho inserito 8 tracce mp3 che devono essere attivati in maniera Random e con una pausa Random l'una dall'altra.... il problema è che ho fatto un array di millis corrispondenti a minuti che vanno da 1 a 15 minuti, ma quando arduino sceglie i millis non sceglie quelli che ho impostato io, ma numeri a caso.... per quando riguarda i canti li sceglie a caso ma spesso si ripete il numero di traccia scelto il passaggio prima.
Qualcuno mi può aiutare a venirne a capo?
Vi ringrazio anticipatamente.
Ps. allego sketch
#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"
#if (defined(ARDUINO_AVR_UNO) || defined(ESP8266)) // Using a soft serial port
#include <SoftwareSerial.h>
SoftwareSerial softSerial(/*rx =*/6, /*tx =*/7);
#define FPSerial softSerial
#else
#define FPSerial Serial1
#endif
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);
// Definisci un array con i numeri desiderati
int canti[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; // 8 canti nella sd
int pausa[] = { 60000, 120000, 180000, 240000, 300000, 420000, 480000, 540000, 600000, 660000, 720000, 780000, 840000, 900000 }; // Pause tra una traccia ed un'altra da 1 a 15 Minuti
// Numero di elementi nell'array
int cantiElements = sizeof(canti) / sizeof(canti[0]);
int pausaElements = sizeof(pausa) / sizeof(pausa[0]);
void setup() {
#if (defined ESP32)
FPSerial.begin(9600, SERIAL_8N1, /*rx =*/D3, /*tx =*/D2);
#else
FPSerial.begin(9600);
#endif
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(FPSerial, /*isACK = */ true, /*doReset = */ true)) { //Use serial 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(30); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
randomSeed(analogRead(0));
randomSeed(analogRead(1));
}
void loop() {
int randomIndex = random(cantiElements);
int randomCanti = canti[randomIndex];
int randomIndexPausa = random(pausaElements);
int randomPausa = pausa[randomIndexPausa];
static unsigned long timer = millis();
if (millis() - timer > 15000) {
Serial.println(randomCanti);
Serial.println(randomPausa);
myDFPlayer.play(randomCanti);
timer = millis();
}
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;
}
}