вот например хочу я чтобы воспроизводилась определенная мелодия а потом после нее крутился сервопривод и все это происходило после того как расстояние будет меньше 20см . я это делаю вот так if (distance_sm < 20) { mp3_play (1); // Воспроизвести файл "mp3/0001.mp3 myservo.write(180); delay (350); myservo.write(30); delay (300); } но файл воспроизводится и потом через секунду выключается. как сделать чтобы он не выключался до окончания файла?
"но файл воспроизводится и потом через секунду выключается. как сделать чтобы он не выключался до окончания файла?" Какая-то ахинея.Пять минут пытался въехать в смысле этих предложений и не получилось .
Все здесь понятно описано. Дело в том, что проверка на сближение постоянно вам дает сработку и вы снова и снова перезапускаете воспроизведение файла.
имею ввиду если файл длится минуту, то как сделать чтобы он звучал минуту а не 5 секунд. ну то есть чтобы до конца звучал
как тогда сделать чтобы проверка на сближение не делалась до тех пор пока не окончатся(не сделают то что нужно) команды?
Код (C++): #include <SoftwareSerial.h> #include <DFPlayer_Mini_Mp3.h> #include <Servo.h> const int Trig = 6; const int Echo = 7; Servo myservo; //int pos = 180; // variable to store the servo position void setup () { Serial.begin (9600); pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); myservo.attach(9); mp3_set_serial (Serial); delay (100); mp3_set_volume (26); delay (100); } unsigned int time_us = 0; unsigned int distance_sm = 0; void loop () { digitalWrite(Trig, HIGH); delayMicroseconds(10); digitalWrite(Trig, LOW); time_us = pulseIn(Echo, HIGH); distance_sm = time_us / 58; Serial.println(distance_sm); if (distance_sm < 20) { mp3_play (1); // Воспроизвести файл "mp3/0001.mp3 myservo.write(170); delay (300); myservo.write(0); delay (150); myservo.write(180); delay (100); myservo.write(0); delay (150); myservo.write(180); delay (100); myservo.write(0); delay (100); delay (1000); } }
Ну тогда подумайте, по каким признакам контроллер поймет, что можно дальше контролировать дистанцию. Это либо прошедшее время (сами определите сколько), или анализ ножки 16 Busy (0-играем, 1-ждем), или шлем запрос mp3_wait_state и анализируем ответ (попробуйте сами посмотреть что выдается в "глухом" и "говорящем" состоянии). После будем принимать решение как это запрограммировать.
Давайте сделаем через анализ ножки 16 Busy. Я еще поменяю дальномер на другой датчик движения, он будет работать как реле; есть движение - дает сигнал он, нету движение - нет сигнала
Нет проблем. Код (C++): if (distance_sm < 20 AND digitalRead(pinBusy)==HIGH) Естественно, вначале определите pinBusy и настройте на вход.
сделал так. так как на ваш код он ворчал. Код (C++): if ((distance_sm < 20) && (digitalRead(busyPin)==HIGH)) настроил, тоесть добавил вот это: Код (C++): int busyPin = 4; // busy pinMode(busyPin, INPUT); // busy это добавил в "void setup" все также не работает, работает но звуковой файл звучит только пол секунды а потом выключается. Пытался после "mp3_play (1); // Воспроизвести файл "mp3/0001.mp3" добавлять delay "(100);" но он только увеличивал немного продолжительность воспроизведение файла. может я не так настроил пин?
Я уже писал про кривизну библиотеки DFPlayer и публиковал тут код собственного производства, который не глючит и работает хоть в синхронном режиме с осмотром пина BUSY, хоть в асинхронном, хоть в смешанном. Поищите, месяца не прошло.
А вы подключили этот плеер на TX и RX хардварного усарта? Если да ( вот ведь mp3_set_serial (Serial); ), то ни в коем случае нельзя использовать Serial.println(distance_sm); . Если нужны отладочные сообщения, то только через SoftwareSerial, иначе реакция плеера не предсказуема.
Искал, не нашел Вы выложили его в этом форуме? Создали отделенную тему или в сообщение к теме выложили?
Сейчас попробовал без Serial.println(distance_sm);, разницы никакой. "А вы подключили этот плеер на TX и RX хардварного усарта?" Да, я подключил напрямую RX-TX и TX-RX
Проверьте только плеер Код (C++): int cnt=1; void loop () { if ( digitalRead(busyPin)==HIGH ) { mp3_play(cnt); cnt += 1; } } Должен последовательно проиграть 1.мр3, 2мр3, 3.мр3 и т.д.
плеер работает, я его до этого проверял. А может быть что из за того что все это(сервопривод, плеер, динамик, ардуино, дальномер) подключено к компьютеру и питается только он него, может быть то что не хватает плееру питание и он выключается?
Очень может быть. Чудес не бывает. Есть контакты, питание, внешние помехи, кривые программы. Плеер управляется по уарту, значит посылка по тому же уарту любых других данных может восприниматься ним как команда. Если вы убрали все другие Serial.print`ы, то остается только питание. Сервы в рывке могут отжирать до ампера тока. Просто отключите физически серву не меняя код.