Музыка по движению, и управление по HC-SR04

EugeneLVB
EugeneLVB аватар
Offline
Зарегистрирован: 04.10.2019
Доброго времени суток
 
Схема простая - кто рыпнулся - на тебе музло. Если во время "unsigned int interval = 15000;" еще рыпнулся, отсчет до выключения начинается сначала.
Соль вот в чем; используется либа "DFRobotDFPlayerMini", которая, как мне показалось, самая богатая на функционал по управлению DFPlayer'ом. При окончании проигрывания трека нечего не происходит (пробовал разные функции доступные в либе (закомментированы в *овнокоде ниже)). Треки плата видит, так как при перелистывании все проблем нет.
Вопрос в том, возможно ли сделать последовательное проигрывание?
 
 
#define Trig 9                  // Дальномер выход
#define Echo 8                  // Дальномер вход

#include <SoftwareSerial.h>     // Библиотека для для обмена данными 
#include <DFRobotDFPlayerMini.h>
#define IRSensor 7              // Датчик движения

SoftwareSerial mySoftwareSerial(2, 4); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

const int ledPin =  13;         // Диод на плате
int ledState = LOW;             // Этой переменной устанавливаем состояние светодиода "Выкл"

unsigned int impulseTime = 0;   //
unsigned int distance_sm = 0;   //

unsigned int interval = 15000;  // Интервал ожидания движения для продления, или отключения музыки
unsigned long sensorActionTime;  // Последняя активность датчика движения

bool sensorActive = false;
bool privValueActive = true;

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

  pinMode(Trig, OUTPUT);        // Инициируем как выход (Дольномер)
  pinMode(Echo, INPUT);         // Инициируем как вход (Дольномер)

  pinMode(IRSensor, INPUT);     // Инициируем датчик движения
  pinMode(ledPin, OUTPUT);      // Инициируем диод

  myDFPlayer.begin(mySoftwareSerial);
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
}

void loop() {

  unsigned long timeRun = millis();
  int sensorAction = digitalRead(IRSensor);

  if (sensorAction == HIGH) {
    sensorActionTime = timeRun;
    sensorActive = true;
  }
  
  if (sensorActive == true && privValueActive == true) {
    myDFPlayer.volume(10);
    myDFPlayer.next();      // Запускаем проигрывание   
    //  myDFPlayer.enableLoopAll(); // При проигрывании всего трека, останавливается.

    //  myDFPlayer.start();   // При установке на паузу начинает воспроизводить трек сначала.   При проигрывании всего трека, останавливается.
    privValueActive = false;
    digitalWrite(ledPin, HIGH);
  }
  
  if (sensorActive == false) {
    digitalWrite(ledPin, LOW);
    myDFPlayer.pause();
  }

  if (timeRun - sensorActionTime > interval && sensorActive == true) {
    sensorActive = false;
    privValueActive = true;
  }

  if (sensorActive == true) {
    privValueActive = false;
  }
  
  if (sensorActive == true) {
    digitalWrite(Trig, HIGH);
    delayMicroseconds(10);                // равный 10 микросекундам
    digitalWrite(Trig, LOW);              // Отключаем
    impulseTime = pulseIn(Echo, HIGH);    // Замеряем длину импульса
    distance_sm = impulseTime / 58;       // Пересчитываем в сантиметры
    if (distance_sm > 30 && distance_sm < 35) {               // Если расстояние менее 30 сантиметром
      myDFPlayer.previous();                  // Светодиод горит
      delay(500);
    }
    if (distance_sm > 10 && distance_sm < 15) {               // Если расстояние менее 30 сантиметром
      myDFPlayer.next();                  // Светодиод горит
      delay(500);
    }
  }

}

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Все команды модуля перечислены в даташите со стр. №5. Эти команды передаются модулю методом библиотеки sendStack. Берёте нужную команду и отправляете. Если не уверены как именно отправлять, посмотрите, как библиотека это делает в своих методах (например, в play или в playFolder);