Музыка по движению, и управление по HC-SR04
- Войдите на сайт для отправки комментариев
Пт, 04/10/2019 - 09:58
Доброго времени суток
Схема простая - кто рыпнулся - на тебе музло. Если во время "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);
}
}
}
Все команды модуля перечислены в даташите со стр. №5. Эти команды передаются модулю методом библиотеки sendStack. Берёте нужную команду и отправляете. Если не уверены как именно отправлять, посмотрите, как библиотека это делает в своих методах (например, в play или в playFolder);