Как использовать занятый контакт в df player для arduino

Мне нужна помощь в том, как использовать занятый контакт в проигрывателе df для arduino.... пока воспроизводится один звук или проигрыватель df занят, я не хочу запускать проигрыватель df с помощью ультразвуковых датчиков для воспроизведения другой песни. вот мой код без использования вывода в df player

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

#include "DFRobotDFPlayerMini.h"

const byte SENSOR_COUNT = 5;
byte triggerPins[SENSOR_COUNT] = {2,4,6,8,10};
byte echoPins[SENSOR_COUNT]    = {3,5,7,9,11};


SoftwareSerial mySoftwareSerial(12, 13); // прием, передача

DFRobotDFPlayerMini myDFPlayer;

void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);

  for( byte i=0; i<SENSOR_COUNT; i++ )
  {
    pinMode(triggerPins[i], OUTPUT);
    pinMode(echoPins[i], INPUT);
  }

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Используйте softwareSerial для связи с 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);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(10);  //Установить значение громкости. От 0 до 30

}

int currentSound = -1;
void loop()
{

  for( byte i=0; i<SENSOR_COUNT; i++ ) // цикл по всем датчикам расстояния
  {
    if( detectPresence(i) ) // проверяем, есть ли рядом объект
    {
      if(currentSound!=i) // проверяем, что это другой датчик, чем тот, который сработал последним
      {
        Serial.print("play song number ");
        Serial.println(i);
        myDFPlayer.play(i+1); // воспроизвести песню под номером `i+1`
      }
      currentSound = i;
    }
  }


  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); // Распечатать подробное сообщение от DFPlayer для обработки различных ошибок и состояний.
  }

}

//detectPresence вернет TRUE, если рядом с ним есть объект.
bool detectPresence(byte sensorNr)
{
  if( sensorNr>=SENSOR_COUNT )
    return false;
  long duration, distance;
  //digitalWrite(triggerPins[sensorNr], LOW); // Добавил эту строку
  // задержка в микросекундах (10); // Добавил эту строку
  digitalWrite(triggerPins[sensorNr], HIGH);
  delayMicroseconds(15); // Добавил эту строку
  digitalWrite(triggerPins[sensorNr], LOW);
  duration = pulseIn(echoPins[sensorNr], HIGH);
  distance = duration/58;

  return distance<30;// здесь выберите свое значение, с какого расстояния должен срабатывать звук
}

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 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;
  }
}

, 👍1

Обсуждение

какая помощь тебе нужна? ... каков ваш конкретный вопрос?, @jsotola


1 ответ


1

Занятый контакт — это просто контакт, на который подается НИЗКИЙ уровень, когда воспроизводится песня, и ВЫСОКИЙ уровень, когда ничего не воспроизводится. Поэтому подключите его к свободному цифровому выводу ввода-вывода на вашем Arduino и установите этот вывод для ввода с помощью:

pinMode(busy_pin, INPUT);

(Примечание: Вы должны сами определить busy_pin, так как я не знаю, куда Вы его будете подключать). Затем просто прочитайте этот вывод в операторе if вместе с detectPresence(i):

if(!digitalRead(busy_pin) && detectPresence(i))

! должен сделать выражение истинным, когда digitalRead(busy_pin) возвращает 0 (НИЗКИЙ). Таким образом, код даже не будет проверять присутствие, когда в данный момент играет песня.

,