#1 2022-01-19 14:03:57

athe
Учасник
Зареєстрований: 2022-01-13
Повідомлень: 13

Задержка на время проигрывания трека (TMRpcm)

Доброго времени суток уважаемые форумчане.
Продолжаю пилить свою "музыкальную шкатулку" (https://forum.arduino.ua/viewtopic.php?id=2632). Задумка такова что при открытии крышки свет попадает на модуль освещённости (LM393) и с SD карты начинает играть трек (~3 минуты). При закрытии крышки трек должен заглохнуть, а при новом открытии снова запуститься.
Код:

int pinA0 = A0;                    // Пин к которому подключен A0
int pinD0 = A1;                    // Пин к которому подключен D0
#include <EEPROM.h>
#include <SD.h> // Библиотека для SD Card.
#include <TMRpcm.h> // Библиотека TMRpcm 1.6.1 https://github.com/TMRh20/TMRpcm
TMRpcm tmrpcm; // create an object for use in this sketch.

void setup(){
  tmrpcm.speakerPin = 9; 
    if (!SD.begin(4)); 
    tmrpcm.volume(1); 
    attachInterrupt(0, DARK, CHANGE);
}
void DARK() {
  tmrpcm.disable();
}

void loop()
  {
 pinMode (pinD0, INPUT);          
 pinMode (pinA0, INPUT);                  
 int xA0, xD0;                     
xA0 = analogRead (pinA0);         
xD0 = digitalRead (pinD0);        
  if (xA0 < 500){      
    tmrpcm.play("rickroll.wav");
    delay (50000);    
  }
  }
 else {
   tmrpcm.disable(); 
  }    
  }
   

В общем и целом код работает, вот только пришлось добавить delay для того чтобы трек успевал поиграть какое-то время. Проблема состоит в том что при прерывании delay никуда не девается. Я пробовал использовать millis, но трек не играет. Такое впечатление что ардуино каждую секунду начинает трек заново.

unsigned long this_time;

...
...


 if (xA0 < 500){      
    tmrpcm.play("rickroll.wav");
    if(millis() - this_time > 50000) {
      this_time = millis(); 
  }
  }
 else {
   tmrpcm.disable(); 
  }  
  }

Подскажите пожалуйста, где я ошибся?
С уважением,
athe.

Неактивний

#2 2022-01-19 14:17:07

г0сть
Гість

Re: Задержка на время проигрывания трека (TMRpcm)

Начнем с того что где у вас в коде используется прерывание?

#3 2022-01-19 14:32:30

athe
Учасник
Зареєстрований: 2022-01-13
Повідомлень: 13

Re: Задержка на время проигрывания трека (TMRpcm)

г0сть пише:

Начнем с того что где у вас в коде используется прерывание?

Здравствуйте. До сего момента я искренне верил что вот это:
attachInterrupt(0, DARK, CHANGE);
Пин D2 ардуино покдлючен к DO на модуле освещённости. При закрытии модуля освещённости проигрывание трека действительно прекращается.

Неактивний

#4 2022-01-19 14:40:02

г0сть
Гість

Re: Задержка на время проигрывания трека (TMRpcm)

athe пише:

Пин D2 ардуино покдлючен к DO на модуле освещённости.

В приведенном вами коде я этого не вижу. Может я ослеп или вы приводите не тот код?

#5 2022-01-19 19:54:34

г0сть
Гість

Re: Задержка на время проигрывания трека (TMRpcm)

Вас понял. Заменил "int pinD0 = A1;" на "int pinD0 = 2;", правда на работоспособность это не повлияло. При использовании millis на свету в динамике слышен зумер, а в темноте тишина, но трек играть не хочет. На пин D2 я контакт вывел потому как вычитал что в arduino nano пины D2, D3 отвечают за прерывание.

#6 2022-01-19 20:21:22

г0сть
Гість

Re: Задержка на время проигрывания трека (TMRpcm)

Зачем там вообще прерывания? Или у вас там еще какой-то суперкод скрывается?

int pinA0 = A0;                    // Пин к которому подключен A0
#include <EEPROM.h>
#include <SD.h> // Библиотека для SD Card.
#include <TMRpcm.h> // Библиотека TMRpcm 1.6.1 https://github.com/TMRh20/TMRpcm
TMRpcm tmrpcm; // create an object for use in this sketch.
bool play_on = false;
unsigned long start_play;

void setup() {
  Serial.begin(9600);
  pinMode (pinD0, INPUT);
  pinMode (pinA0, INPUT);
  tmrpcm.speakerPin = 9;
  if (!SD.begin(4));
  tmrpcm.volume(1);
}

void loop()
{
  if (!play_on && analogRead(pinA0) < 500) {
    play_on = true;
    start_play = millis();
  }
  if (analogRead(pinA0) > 500) {
    play_on = false;
    tmrpcm.disable();
  }
  if (play_on && millis() - start_play <= 5000) tmrpcm.play("rickroll.wav");
  else tmrpcm.disable();
}

как-то так...

#7 2022-01-19 20:29:43

athe
Учасник
Зареєстрований: 2022-01-13
Повідомлень: 13

Re: Задержка на время проигрывания трека (TMRpcm)

г0сть пише:

Зачем там вообще прерывания? Или у вас там еще какой-то суперкод скрывается?

Не, я просто неделю назад начал с ардуино разбираться... roll
Пошёл курить ваш код. Спасибо за помощь.

Неактивний

#8 2022-01-19 22:00:50

athe
Учасник
Зареєстрований: 2022-01-13
Повідомлень: 13

Re: Задержка на время проигрывания трека (TMRpcm)

Хмм... Код вроде работает, но воспроизведения трека нет. Слышен только зумер при засветке фоторезистора. При закрытии оного зумер пропадает.

Неактивний

#9 2022-01-20 21:43:36

г0сть
Гість

Re: Задержка на время проигрывания трека (TMRpcm)

athe пише:

Не, я просто неделю назад начал с ардуино разбираться... roll

И сразу за такие вещи браться? С чего-нибудь попроще начинать надо.

athe пише:

но воспроизведения трека нет. Слышен только зумер при засветке фоторезистора.

Немного гуглинга выдало что выбранная вами библиотека для воспроизведения глючная. Не повезло вам как для новичка. Как советуют - помогает проверка на отсутствие воспроизведения if(tmrpcm.isPlaying()==0)
Собрал у себя на соплях (макетке), вроде работает.

int pinA0 = A0;                    // Пин к которому подключен A0
#include <EEPROM.h>
#include <SD.h> // Библиотека для SD Card.
#include <TMRpcm.h> // Библиотека TMRpcm 1.6.1 https://github.com/TMRh20/TMRpcm
TMRpcm tmrpcm; // create an object for use in this sketch.
bool play_on = false;
unsigned long start_play;
unsigned long time_play = 30000; //длительность проигрывания

void setup() {
  Serial.begin(9600);
  pinMode (pinA0, INPUT);
  tmrpcm.speakerPin = 9;
  if (!SD.begin(4))return;
  tmrpcm.volume(1);
}

void loop()
{
  if (!play_on && analogRead(pinA0) < 500) {
    play_on = true;
    start_play = millis();
  }
  if (analogRead(pinA0) > 500 ) {
    play_on = false;
    tmrpcm.stopPlayback();
  }

   if (play_on && millis() - start_play <= time_play && !tmrpcm.isPlaying()) tmrpcm.play("rickroll.wav");
  // if (play_on && !tmrpcm.isPlaying()) tmrpcm.play("rickroll.wav"); 

  if ((tmrpcm.isPlaying() && millis() - start_play > time_play) || !play_on) tmrpcm.stopPlayback();
}

p/s чисто ради спортивного интереса - попробуйте поиграться с 2 и 3-ей строками снизу. В таком виде у меня после остановки тишина. Если их поменять местами то после останова слышен фон. Возможно это как-то связано с моим железом на котором проверял.

#10 2022-01-21 17:44:33

athe
Учасник
Зареєстрований: 2022-01-13
Повідомлень: 13

Re: Задержка на время проигрывания трека (TMRpcm)

г0сть пише:

И сразу за такие вещи браться? С чего-нибудь попроще начинать надо.

Мне казалось что куда уж проще).

По поводу кода, работает. В исходном виде есть небольшой фон (вполне допустимый) после открытия и закрытия датчика. Если строки поменять местами- фон усиливается.
Получилось так что от моего кода ничего и не осталось  big_smile
Благодарю за помощь.

Неактивний

#11 2022-01-21 18:22:51

г0сть
Гість

Re: Задержка на время проигрывания трека (TMRpcm)

athe пише:

Мне казалось что куда уж проще).

Проще - это понажимать кнопки, поморгать тем же светодиодом в цикле, заданное количество раз, включить/выключить на заданный период. А потом уже за звуки браться.
В общем, было свободное время, поигрался немного и выяснил что если не отправлять команды постоянно, то можно обойтись без проверки if(tmrpcm.isPlaying()==0)

int pinA0 = A0;                    // Пин к которому подключен A0
#include <EEPROM.h>
#include <SD.h> // Библиотека для SD Card.
#include <TMRpcm.h> // Библиотека TMRpcm 1.6.1
TMRpcm tmrpcm; // create an object for use in this sketch.
bool play_on = false; 
bool play_on1 = false;
unsigned long start_play;
bool _stop = 0;
bool _open = 0;
bool _close = 0;

void setup() {
  Serial.begin(9600);
  pinMode (pinA0, INPUT);
  tmrpcm.speakerPin = 9;
  if (!SD.begin(4)) {
    Serial.println("ERROR");
    return;
  }
  // tmrpcm.volume(1);
  tmrpcm.disable();
}

void loop()
{
  if (!play_on && analogRead(pinA0) < 500) {
    play_on = true; 
    _open = 1;
  }
  
  if (!_close && analogRead(pinA0) > 500) {
    play_on = false;
    if (!_stop) {
      tmrpcm.disable();
      _stop = 1;
    }
  }

  if (_open ) {
    start_play = millis(); 
    tmrpcm.play("3.wav"); 
    _open = 0;
    play_on1 = 1; 
    _stop = 0;
  }

  if (play_on1 && millis() - start_play >= 30000) {
    play_on1 = false; 
    tmrpcm.disable();
  }

}

#12 2022-01-21 21:05:01

athe
Учасник
Зареєстрований: 2022-01-13
Повідомлень: 13

Re: Задержка на время проигрывания трека (TMRpcm)

г0сть пише:

Проще - это понажимать кнопки, поморгать тем же светодиодом...

Светодиодами я честно поморгал. Почитываю книжку "Программируем Arduino". Просто на  интересных проектах оно и разбираться веселей. ^^

Весьма вам благодарен.
Вопрос решён.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму