Ви не увійшли.
Доброго времени суток уважаемые форумчане.
Продолжаю пилить свою "музыкальную шкатулку" (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.
Неактивний
Начнем с того что где у вас в коде используется прерывание?
Начнем с того что где у вас в коде используется прерывание?
Здравствуйте. До сего момента я искренне верил что вот это:
attachInterrupt(0, DARK, CHANGE);
Пин D2 ардуино покдлючен к DO на модуле освещённости. При закрытии модуля освещённости проигрывание трека действительно прекращается.
Неактивний
Пин D2 ардуино покдлючен к DO на модуле освещённости.
В приведенном вами коде я этого не вижу. Может я ослеп или вы приводите не тот код?
Вас понял. Заменил "int pinD0 = A1;" на "int pinD0 = 2;", правда на работоспособность это не повлияло. При использовании millis на свету в динамике слышен зумер, а в темноте тишина, но трек играть не хочет. На пин D2 я контакт вывел потому как вычитал что в arduino nano пины D2, D3 отвечают за прерывание.
Зачем там вообще прерывания? Или у вас там еще какой-то суперкод скрывается?
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();
}
как-то так...
Зачем там вообще прерывания? Или у вас там еще какой-то суперкод скрывается?
Не, я просто неделю назад начал с ардуино разбираться...
Пошёл курить ваш код. Спасибо за помощь.
Неактивний
Не, я просто неделю назад начал с ардуино разбираться...
И сразу за такие вещи браться? С чего-нибудь попроще начинать надо.
но воспроизведения трека нет. Слышен только зумер при засветке фоторезистора.
Немного гуглинга выдало что выбранная вами библиотека для воспроизведения глючная. Не повезло вам как для новичка. Как советуют - помогает проверка на отсутствие воспроизведения 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-ей строками снизу. В таком виде у меня после остановки тишина. Если их поменять местами то после останова слышен фон. Возможно это как-то связано с моим железом на котором проверял.
И сразу за такие вещи браться? С чего-нибудь попроще начинать надо.
Мне казалось что куда уж проще).
По поводу кода, работает. В исходном виде есть небольшой фон (вполне допустимый) после открытия и закрытия датчика. Если строки поменять местами- фон усиливается.
Получилось так что от моего кода ничего и не осталось
Благодарю за помощь.
Неактивний
Мне казалось что куда уж проще).
Проще - это понажимать кнопки, поморгать тем же светодиодом в цикле, заданное количество раз, включить/выключить на заданный период. А потом уже за звуки браться.
В общем, было свободное время, поигрался немного и выяснил что если не отправлять команды постоянно, то можно обойтись без проверки 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();
}
}
Проще - это понажимать кнопки, поморгать тем же светодиодом...
Светодиодами я честно поморгал. Почитываю книжку "Программируем Arduino". Просто на интересных проектах оно и разбираться веселей. ^^
Весьма вам благодарен.
Вопрос решён.
Неактивний