Подскажите пожалуйста, в этом коде - нажимая соответсвующую кнопку на пду - мелодия проигрывается, но нажимая другую мелодия соответсвующая этой кнопке не проигрывается - где копать? Код (C++): if ( irrecv.decode( &results )) { // если данные пришли switch ( results.value ) { case 0xFF926D: // Jingle Bells Qb_PLAY ("MNT255L4O2DBAGL2D.L8DDL4DBAGL2E.L4EE>C<BAL1F+L4>DDC<A"); Qb_PLAY ("L1BL4DBAGL2D.L8DDL4DBAGL2E.L4EE>C<BA>DDDDEDC<AL2G.P4L4B"); Qb_PLAY ("BL2BL4BBL2BL4B>D<G.L8AL1BL4>CCC.L8CL4C<BBL8BBL4BAABL2A"); break; case 0xFF12ED: //The Ghostbusters Theme Qb_PLAY ("MNT150L8O3CCL16D+EL8GL4A+AL8CCL16D+EL8GL4A+AP8L16CCL8E"); Qb_PLAY ("CD<A+P2>CL16CCL8<A+>CL4<AP4L16>CCL8D+CD<A+P8L4A+L8A+>C"); Qb_PLAY ("P2L16CCL8D+CL4D+P4P8L16C<A+L8>CCL4CP2L16D+CD+CL4D+P4<A+"); break; } irrecv.resume(); // принимаем следующую команду } ;
это часть кода - таких мелодий 7 штук, первый раз проигрывает любую выбирай - потом нажимаю и тишина!!
@рокки1945, у вас при компиляции не ругается, что библиотеки Qb_PLAY и IRremote используют один и тот же таймер(TIMER2)?
Попробуйте в файле Arduino\libraries\IRremote\IRremoteInt.h строки 224-225 изменить так Код (C++): #else #define IR_USE_TIMER1 // tx = pin 9 //#define IR_USE_TIMER2 // tx = pin 3 #endif т.е. первую раскомментировать, а вторую закомментировать.
Библиотеку Qb_PLAY брали тут? http://forum.amperka.ru/threads/%D0%9C%D0%B5%D0%BB%D0%BE%D0%B4%D0%B8%D0%B8-%D0%B4%D0%BB%D1%8F-%D0%BF%D1%8C%D0%B5%D0%B7%D0%BE%D0%BF%D0%B8%D1%89%D0%B0%D0%BB%D0%BA%D0%B8.272/#post-6035 ? Приведите весь код скетча.
совершенно верно! Спойлер: 1 часть кода #include "IRremote.h" IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; int IN1 = 5; // Input1 подключен к выводу 8 int IN2 = 6; int freq[7][12] = { {65, 69, 73, 78, 82, 87, 92, 98, 104, 110, 117, 123}, //0 = Большая октава {131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247}, //1 = Малая октава {262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494}, //2 = 1-я октава {523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988}, //3 = 2-я октава {1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1976}, //4 = 3-я октава {2093, 2218, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 3520, 3729, 3951}, //5 = 4-я октава {4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902}, //6 = 5-я октава }; int SoundPin=11; int extractNumber(int& myNumber, char Muz[], int& curPosition) { int digitsNumber=0; int curDigit=0; myNumber=0; do { if ((Muz[curPosition]> 47) && (Muz[curPosition]<58)) // Коды ASCII цифр '0' == 48 , "9' == 57 { curDigit=Muz[curPosition]-48; digitsNumber++; myNumber=myNumber*10+curDigit; } else { return digitsNumber; } curPosition++; }while(Muz[curPosition]!= '\0'); return digitsNumber; } int pointsCount(char Muz[], int& curPosition) { int pointsNumber=0; do { if (Muz[curPosition]== '.') { pointsNumber++; } else { return pointsNumber; } curPosition++; }while(Muz[curPosition]!= '\0'); return pointsNumber; } void Qb_PLAY(char Muz[]) { static int generalOktava; int oktava; static int tempo=120; // Задание темпа или четвертных нот, которые исполняются в минуту. n от 32 до 255. По умолчанию 120 int Nota=0; int curPosition, curNota4; unsigned long currentNotaPauseDuration; unsigned long currentNotaDuration; unsigned long pauseDuration; int takt=240000/tempo; bool isNota; bool isPause; int pointsNum=0; float generalNotaMultipl=0.875; static float NotaLong; float curMultipl; float tempFlo; float curPause; unsigned long tempLong; int i=0; do { isNota=false; isPause=false; oktava=generalOktava; switch(Muz){ case '\0':{ return; } break; case 'C':{ Nota=0; isNota=true; } break; case 'D':{ Nota=2; isNota=true; } break; case 'E':{ Nota=4; isNota=true; } break; case 'F':{ Nota=5; isNota=true; } break; case 'G':{ Nota=7; isNota=true; } break; case 'A':{ Nota=9; isNota=true; } break; case 'B':{ Nota=11; isNota=true; } break; case 'N':{// Nнота Играет определенную ноту (0 - 84) в диапазоне семи октав (0 - пауза). curPosition=i+1; if (extractNumber(curNota4, Muz, curPosition)){ i=curPosition-1; if (curNota4){ curNota4--; oktava=curNota4 / 12; Nota=curNota4 % 12; isNota=true; } else{ isPause=true; } } } break; case 'O':{ //Oоктава Задает текущую октаву (0 - 6). curPosition=i+1; if (extractNumber(oktava, Muz, curPosition)){ i=curPosition-1; generalOktava=oktava; } } break; case '>':{ generalOktava++; } break; case '<':{ generalOktava--; } break; case 'M':{ switch(Muz[i+1]){ case 'N':{ //MN Нормаль. Каждая нота звучит 7/8 времени, заданного в команде L generalNotaMultipl=0.875; // =7/8 i++; } break; case 'L':{ //ML Легато. Каждая нота звучит полный интервал времени, заданного в команде L generalNotaMultipl=1.0; i++; } break; case 'S':{ //MS Стаккато. Каждая нота звучит 3/4 времени, заданного в команде L generalNotaMultipl=0.75; // =3/4 i++; } break; case 'F':{ //MF Режим непосредственного исполнения. Т.е. на время проигрывания ноты программа приостанавливается. Используется по умолчанию i++; //Сдвигаем точку чтения и ничего не делаем. } break; case 'B':{ //MB проигрывние в буффер i++; //Сдвигаем точку чтения и ничего не делаем. } break; } } break; case 'L':{ //Lразмер Задает длительность каждой ноты (1 - 64). L1 - целая нота, L2 - 1/2 ноты и т.д. curPosition=i+1; if (extractNumber(curNota4, Muz, curPosition)){ i=curPosition-1; tempFlo=float(curNota4); NotaLong=1/tempFlo; } } break; case 'T':{ //Tтемп Задает темп исполнения в четвертях в минуту (32-255).По умолчанию 120 curPosition=i+1; if (extractNumber(tempo, Muz, curPosition)){ i=curPosition-1; takt=240000/tempo; // миллисекунд на 1 целую ноту. 240000= 60 сек * 1000 мсек/сек *4 четвертей в ноте } } break; case 'P':{ //Pпауза Задает паузу (1 - 64). P1 - пауза в целую ноту, P2 - пауза в 1/2 ноты и т.д. curPosition=i+1; if (extractNumber(curNota4, Muz, curPosition)){ tempFlo=float(curNota4); curPause=1/tempFlo; i=curPosition-1; isPause=true; } } break; case ' ':{ //Есть в некоторых текстах. Вероятно это пауза длительностью в текущую ноту curPause= NotaLong; isPause=true; } break; } if (isNota){ switch(Muz[i+1]){ case '#':{ // диез Nota++; i++; } break; case '+':{ // диез Nota++; i++; } break; case '-':{ // бемоль Nota--; i++; } break; } curPosition=i+1; if (extractNumber(curNota4, Muz, curPosition)){ currentNotaDuration=takt/curNota4; i=curPosition-1; } } if (oktava<0) oktava=0; if (oktava>6) oktava=6; if (isNota || isPause){ curPosition=i+1; pointsNum=pointsCount(Muz, curPosition); if (pointsNum) i=curPosition-1; curMultipl=1.0; for (int j=1; j<=pointsNum; j++) { curMultipl= curMultipl * 1.5; } currentNotaPauseDuration=(takt*NotaLong); } if (isNota){ curMultipl=curMultipl*generalNotaMultipl; currentNotaDuration= (currentNotaPauseDuration*curMultipl); if (Nota<0) Nota=0; if (Nota>11) Nota=11; tempLong= freq[oktava][Nota]; tone(SoundPin,tempLong,currentNotaDuration); delay(currentNotaPauseDuration); } if (isPause){ pauseDuration=takt*curPause*curMultipl; delay(pauseDuration); } i++; } while (Muz!= '\0'); } Спойлер: 2 часть void setup() { irrecv.enableIRIn(); // запускаем прием pinMode (IN2, OUTPUT); pinMode (IN1, OUTPUT); pinMode(SoundPin, OUTPUT); } void loop() { if ( irrecv.decode( &results )) { // если данные пришли switch ( results.value ) { case 0xFF3AC5: analogWrite( IN1, 255 ); break; case 0xFFBA45: analogWrite( IN2, 255 ); break; case 0xFF827D: analogWrite( IN1, 0 ); analogWrite( IN2, 0 ); break; case 0xFF28D7: for (int i=0; i <= 255; i++) { analogWrite(IN1, i); delay(10); } break; case 0xFF08F7: for (int x=255; x > 0; x--) { analogWrite(IN1, x); delay(10); } break; case 0xFF2AD5: // Bach 1 Qb_PLAY ("MNT150L8O3AL16>C<AL8EL16AEL8CL16ECL4<AL16EA>C<ABABAG+"); Qb_PLAY ("B>D<B>C<B>C<AL8>AL16>C<AL8EL16AEL8CL16ECL4<AL16>C<BL8>C"); Qb_PLAY ("L16C<BL8>CAL16C.L32DL8C<BL16>ED+L8EL16ED+L8E>CL16<E.L32F"); break; case 0xFFAA55: // KATIUSHA Qb_PLAY ("MST255L2O2E.L4F+L2G.L4EGGF+EL2F+L4<BP4L2>F+.L4GL2A.L4F+"); Qb_PLAY ("AAGF+L1EL2B>EDL4EDCC<BAL2BEP4>CL4<AL2B.L4GF+<B>GF+L1E"); Qb_PLAY ("L2B>EDL4EDCC<BAL2BEP4>CL4<AL2B.L4GF+<B>GF+L1E"); break; case 0xFF926D: // Jingle Bells Qb_PLAY ("MNT255L4O2DBAGL2D.L8DDL4DBAGL2E.L4EE>C<BAL1F+L4>DDC<A"); Qb_PLAY ("L1BL4DBAGL2D.L8DDL4DBAGL2E.L4EE>C<BA>DDDDEDC<AL2G.P4L4B"); Qb_PLAY ("BL2BL4BBL2BL4B>D<G.L8AL1BL4>CCC.L8CL4C<BBL8BBL4BAABL2A"); break; case 0xFF12ED: //The Ghostbusters Theme Qb_PLAY ("MNT150L8O3CCL16D+EL8GL4A+AL8CCL16D+EL8GL4A+AP8L16CCL8E"); Qb_PLAY ("CD<A+P2>CL16CCL8<A+>CL4<AP4L16>CCL8D+CD<A+P8L4A+L8A+>C"); Qb_PLAY ("P2L16CCL8D+CL4D+P4P8L16C<A+L8>CCL4CP2L16D+CD+CL4D+P4<A+"); break; case 0xF0AF5: // HABANERA Qb_PLAY ("MNT150L4O1D.L16A.L8>F.<A.L4D.L16A.L8>F.<A.L4D.L16A.L8>F."); Qb_PLAY ("<A.L4D.L16A.L8O4D.C+.L4C.L16C.L8<B.A+.L4A.L16A.L8G+.G."); Qb_PLAY ("L16FGFE.F.L8G.F.L32DL4E.L8>D.C+.L4C.L16C.L8<B.A+.L4A."); break; case 0xFF8A75: // Ave Maria Qb_PLAY ("MLT100L16O1A+.>D.F.<A+.>D.F.<A+.>D.F.<A+.>D.F.A+.D.F.<A+.>D.F.<A+.>"); Qb_PLAY ("D.E.A.D.A+.>D.<D.F.<F.A+.>D.<F.A.>D+.<F.A.O3C.<A+.<A+.>D.<G.A+.>D.<"); Qb_PLAY ("G.A+.>D.<G.A+.>D.>C.O1G.>C.<D+.G.>C.>DC<A+.C.A.G.C.A.A+.D.F.<A+.>D."); break; case 0xFFB24D: //REM The Toriador Qb_PLAY ("MNT150L4O3CL8D.L16CL8<AL16AP16L4AL8A.L16GL8A.L16A+L4A"); Qb_PLAY ("L8AP8L4A+L8G.L16>CL4<A.P8FL8D.L16GL4C.P8L2GL8G>DC<A+A"); Qb_PLAY ("GAA+L4A.P8EAAL8G+BL1>EL8EL16DEDL8C+D<GAA+P8L16AA+AL8F"); break; case 0xFF32CD: //Нас утро tone(11, 700, 300); delay(600); tone(11, 700, 300); delay(600); tone(11, 780, 150); delay(300); tone(11, 700, 150); delay(300); tone(11, 625, 450); delay(600); tone(11, 590, 150); delay(300); tone(11, 520, 150); delay(300); tone(11, 460, 450); delay(600); tone(11, 350, 450); delay(600); tone(11, 350, 450); delay(600); tone(11, 460, 450); delay(600); tone(11, 520, 150); delay(300); tone(11, 590, 150); delay(300); tone(11, 625, 450); delay(600); tone(11, 590, 150); delay(300); tone(11, 520, 150); delay(300); tone(11, 700, 1350); delay(1800); tone(11, 700, 300); delay(600); tone(11, 700, 300); delay(600); tone(11, 780, 150); delay(300); tone(11, 700, 150); delay(300); tone(11, 625, 450); delay(600); tone(11, 590, 150); delay(300); tone(11, 520, 150); delay(300); tone(11, 460, 450); delay(600); tone(11, 350, 450); delay(600); tone(11, 350, 450); delay(600); tone(11, 625, 450); delay(600); tone(11, 590, 150); delay(300); tone(11, 520, 150); delay(300); tone(11, 700, 450); delay(600); tone(11, 590, 150); delay(300); tone(11, 520, 150); delay(300); tone(11, 460, 1350); break; case 0xFF38C7: //марио tone(11,1318,150); delay(150); tone(11,1318,300); delay(300); tone(11,1318,150); delay(300); tone(11,1046,150); delay(150); tone(11,1318,300); delay(300); tone(11,1568,600); delay(600); tone(11,784,600); delay(600); tone(11,1046,450) ; // 2й такт delay(450); tone(11,784,150); delay(450); tone(11,659,300); delay(450); tone(11,880,300); delay(300); tone(11,987,150); delay(300); tone(11,932,150); delay(150); tone(11,880,300); delay(300); tone(11,784,210); // 3й такт delay(210); tone(11,1318,210); delay(210); tone(11,1568,150); delay(150); tone(11,1750,300); delay(300); tone(11,1396,150); delay(150); tone(11,1568,150); delay(300); tone(11,1318,300); delay(300); tone(11,1046,150); delay(150); tone(11,1174,150); delay(150); tone(11,987,450); delay(450); tone(11,1046,450); // 4й такт delay(450); tone(11,784,150); delay(450); tone(11,659,300); delay(450); tone(11,880,300); delay(300); tone(11,987,150); delay(300); tone(11,932,150); delay(150); tone(11,880,300); delay(300); tone(11,784,210); // 5й такт delay(210); tone(11,1318,210); delay(210); tone(11,1568,150); delay(150); tone(11,1750,300); delay(300); tone(11,1396,150); delay(150); tone(11,1568,150); delay(300); tone(11,1318,300); delay(300); tone(11,1046,150); delay(150); tone(11,1174,150); delay(150); tone(11,987,450); delay(600); tone(11,1568,150); // 6ой Спуск вниз delay(150); tone(11,1480,150); delay(150); tone(11,1396,150); delay(150); tone(11,1244,300); delay(300); tone(11,1318,150); delay(300); tone(11,830,150); delay(150); tone(11,880,150); delay(150); tone(11,1046,150); delay(300); tone(11,880,150); delay(150); tone(11,1046,150); delay(150); tone(11,1174,150); delay(150); delay(300); // 7ой tone(11,1568,150); delay(150); tone(11,1480,150); delay(150); tone(11,1396,150); delay(150); tone(11,1244,300); delay(300); tone(11,1318,150); delay(300); tone(11,2093,300); delay(300); tone(11,2093,150); delay(150); tone(11,2093,600); delay(600); tone(11,1568,150); // 6ой Спуск вниз ПОВТОР delay(150); tone(11,1480,150); delay(150); tone(11,1396,150); delay(150); tone(11,1244,300); delay(300); tone(11,1318,150); delay(300); tone(11,830,150); delay(150); tone(11,880,150); delay(150); tone(11,1046,150); delay(300); tone(11,880,150); delay(150); tone(11,1046,150); delay(150); tone(11,1174,150); delay(450); tone(11,1244,300); delay(450); tone(11,1174,450); delay(450); tone(11,1046,600); delay(1200 ); tone(11,1568,150); // 6ой Спуск вниз delay(150); tone(11,1480,150); delay(150); tone(11,1396,150); delay(150); tone(11,1244,300); delay(300); tone(11,1318,150); delay(300); tone(11,830,150); delay(150); tone(11,880,150); delay(150); tone(11,1046,150); delay(300); tone(11,880,150); delay(150); tone(11,1046,150); delay(150); tone(11,1174,150); delay(150); delay(300); // 7ой tone(11,1568,150); delay(150); tone(11,1480,150); delay(150); tone(11,1396,150); delay(150); tone(11,1244,300); delay(300); tone(11,1318,150); delay(300); tone(11,2093,300); delay(300); tone(11,2093,150); delay(150); tone(11,2093,600); delay(600); tone(11,1568,150); // 6ой Спуск вниз ПОВТОР delay(150); tone(11,1480,150); delay(150); tone(11,1396,150); delay(150); tone(11,1244,300); delay(300); tone(11,1318,150); delay(300); tone(11,830,150); delay(150); tone(11,880,150); delay(150); tone(11,1046,150); delay(300); tone(11,880,150); delay(150); tone(11,1046,150); delay(150); tone(11,1174,150); delay(450); tone(11,1244,300); delay(450); tone(11,1174,450); delay(450); break; case 0xFFB847: //звёздные войны tone(11, 392, 350); delay(350); tone(11, 392, 350); delay(350); tone(11, 392, 350); delay(350); tone(11, 311, 250); delay(250); tone(11, 466, 100); delay(100); tone(11, 392, 350); delay(350); tone(11, 311, 250); delay(250); tone(11, 466, 100); delay(100); tone(11, 392, 700); delay(700); tone(11, 587, 350); delay(350); tone(11, 587, 350); delay(350); tone(11, 587, 350); delay(350); tone(11, 622, 250); delay(250); tone(11, 466, 100); delay(100); tone(11, 369, 350); delay(350); tone(11, 311, 250); delay(250); tone(11, 466, 100); delay(100); tone(11, 392, 700); delay(700); tone(11, 784, 350); delay(350); tone(11, 392, 250); delay(250); tone(11, 392, 100); delay(100); tone(11, 784, 350); delay(350); tone(11, 739, 250); delay(250); tone(11, 698, 100); delay(100); tone(11, 659, 100); delay(100); tone(11, 622, 100); delay(100); tone(11, 659, 450); delay(450); tone(11, 415, 150); delay(150); tone(11, 554, 350); delay(350); tone(11, 523, 250); delay(250); tone(11, 493, 100); delay(100); tone(11, 466, 100); delay(100); tone(11, 440, 100); delay(100); tone(11, 466, 450); delay(450); tone(11, 311, 150); delay(150); tone(11, 369, 350); delay(350); tone(11, 311, 250); delay(250); tone(11, 466, 100); delay(100); tone(11, 392, 750); delay(750); break; } irrecv.resume(); // принимаем следующую команду } } там еще управление двигателем, спасибо за внимание соль в том, что после проигрывания мелодии, ни на одну кнопку - программа не реагирует - не могу понять в чём дело мне понравилось про таймеры, ну где копать может в функции мелодии закинуть и вызывать их
Так, проверил ваш пример в Arduino IDE - 1. в функции void Qb_PLAY была ошибка (опечатка) Код (C++): //было switch(Muz){ //должно быть switch(Muz[i]){ 2. после исправления первой ошибки, компилятор выдал ожидаемую ошибку повторного определения таймера - multiple definition of `__vector_7' 3. В библиотеке МоиДокументы\Arduino\libraries\IRremote\IRremoteInt.h (брал в https://github.com/z3t0/Arduino-IRremote) изменил строки Код (C++): // Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc #else #define IR_USE_TIMER1 // tx = pin 9 //#define IR_USE_TIMER2 // tx = pin 3 #endif т.е. первую раскомментировал, а вторую закомментировал.
Для полного порядка стоит еще мелодии в стиле tone-delay-tone переписать на Qb_PLAY. И строки мелодий разместить во Flash.