Музыка по движению, и управление по 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);