Arduino MP3-ЩИТ. Примеры кода. - ФОРУМ ДВ Робот dvrobot.ru
Пятница, 15.12.2017, 08:42
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    Страница 1 из 212»
    Модератор форума: GRACH, Serg 
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Arduino MP3-ЩИТ. Примеры кода. (Запускаем МР-3 щит в работу.)
    Arduino MP3-ЩИТ. Примеры кода.
    SergДата: Воскресенье, 30.09.2012, 20:12 | Сообщение # 1
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Вот такой модуль позволяет прослушивать музыку с флешки и SD-карты.

    Для инициализации и управления модулем применяем такой код:
    Code
    #include <MP3.h>

    /** define mp3 class */
    MP3 mp3;

    void setup()
    {
           /** установка функций */
           mp3.begin();
           /** установка мощности усилителя на максимум */
           mp3.volume(0x1F);
           /** проигрывание всей музыки по кругу  */
           mp3.set_mode(MP3::CYCLE);
           /** проигрывание с sd-карты */
           mp3.play_sd(0x0001);
           //**раскомменируйте нужную функцию */      
           /** проигрывание с  USB-флешки */      
           //mp3.play_usb_disk(0x0001);
                
           /** проигрывание с внутренней памяти SPI FLASH */      
           //mp3.play_spi_flash(0x0001);
    }

    void loop()
    {
          /** здесь можно Ваш код */
    }


    Прилагаемый ZIP-файл скопируйте в папку libraries
    Прикрепления: MP3Shileld.zip(3Kb)
     
    GRACHДата: Понедельник, 01.10.2012, 01:02 | Сообщение # 2
    dvrobot.ru
    Группа: Администраторы
    Сообщений: 111
    Репутация: 16181
    Статус: Offline
    Serg, вот ссылка на сайт производителя Открыть, и еще вот тут По поводу маркировки, спрошу как дела обстоят на других платах, если так же, буду уже узнавать на заводе в чем причина. В любом случае отпишусь.
     
    SergДата: Воскресенье, 07.10.2012, 10:08 | Сообщение # 3
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    выкладываю рабочий скетч для управления МР-3 щита от любого совместимого инфракрасного пульта управления. например от телевизора. уровень громкости выбирается цифровыми клавишами на пульте. музыка проигрывается в случайном порядке с карты памяти. уровень громкости при включении установлен на минимум. скетч разбит на две части из за ограничений форума. принимается любая конструктивная критика и предложения..

    Code
    #include <MP3.h>
    // коды клавиш ИК пульта )Коды указаны условно.сюда нужно вписать коды, полученные в терминале при отладке  из 19 строки
    #define PAUSE           0x00000000    //ИГРА-ПАУЗА
    #define NEXT            0x40BF807F    //СЛЕДУЩАЯ
    #define STOP            0x0000011B    //СТОП
    #define PLAY_SD         0x0A000B11    //ИГРАЕМ С КАРТЫ
    #define PLAY_USB_DISK   0xA00001B1    //ИГРАЕМ С ЮСБ-ФЛЕШКИ
    #define VOLUME_10       0x40BF00FF    //ГРОМКОСТЬ 10 %
    #define VOLUME_20       0xAAAAAAAA    //ГРОМКОСТЬ 20 %
    #define VOLUME_30       0xAAAA1AAA    //ГРОМКОСТЬ 30 %
    #define VOLUME_40       0xAAA1AAAA    //ГРОМКОСТЬ 40 %
    #define VOLUME_50       0x1AAAAAAA    //ГРОМКОСТЬ 50 %
    #define VOLUME_60       0xAAAAAAA1    //ГРОМКОСТЬ 60 %
    #define VOLUME_70       0xAAAAAA1A    //ГРОМКОСТЬ 70 %
    #define VOLUME_80       0xAAAAA1AA    //ГРОМКОСТЬ 80 %
    #define VOLUME_90       0xAA11AAAA    //ГРОМКОСТЬ 90 %
    #define VOLUME_100      0xAAAAA11A    //ГРОМКОСТЬ 100 %
    MP3 mp3;
    volatile unsigned long IR_KEY;  //код кнопки на пульте
    int inByte = 0;
    void setup() {
         /** begin function */
        mp3.begin();
        /** set volum to the MAX */
        mp3.volume(0x06);
        /** set MP3 Shield CYCLE mode */
        mp3.set_mode(MP3::CYCLE);
        /** play music in sd */
        mp3.play_sd(0x0001);    
        /** play music in USB-disk */   
       // mp3.play_usb_disk(0x0001);
        //Serial.begin(9600);
        pinMode(2, INPUT);    // ИК приемник подключим сюда
        IR_KEY = 0;
        attachInterrupt(0,IRinterrupt,FALLING); // назначим прерывание
    }

     
    SergДата: Суббота, 13.10.2012, 19:41 | Сообщение # 4
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Code

        void loop() {
          if(IR_KEY) {
          //Serial.println(IR_KEY,HEX); //выводим код кнопки в терминал при отладке .
            IR_KEY = 0;
          }
        }
         
    /* обработчик прерывания*/
    void IRinterrupt(){
        static unsigned long key, prevTime;
        int I=0;
        unsigned long currTime, d;
        currTime = micros();
        d = currTime - prevTime;
        if(d < 1100) return;        // "дребезг"
        if(d < 1400){              // "0"
          key = key << 1;
          prevTime = currTime;
          return; }
        if(d < 2400){              // "1"
          key = key << 1;
          key++;
          prevTime = currTime;
          return;}
        if(d < 13000) IR_KEY = key; // код кнопки получен
        prevTime = currTime; // ПОЛУЧЕНИЕ КОДА С ПУЛЬТА
         
        switch (IR_KEY)
    {
    case NEXT:
    mp3.next();// СЛЕДУЩИЙ ТРЭК
       {   
         break;
       }
    case PAUSE:
    mp3.pause(); // пауза
       {
        break;
       }
    case STOP:
    mp3.stop(); // стоп
       {
        break;
       }
    case PLAY_SD:
    mp3.play_sd(0x0001); // ПЕРЕКЛЮЧАЕМ НА КАРТУ
       {
        break;
       }
    case PLAY_USB_DISK:
    mp3.play_usb_disk(0x0001); // ПЕРЕКЛЮЧАЕМ НА ФЛЕШКУ
       {
        break;
       }   
    case VOLUME_10:
       mp3.volume(0x16);// УРОВЕНЬ ГРОМКОСТИ
       {   
         break;
       }
    case VOLUME_20:
       mp3.volume(0x17);// УРОВЕНЬ ГРОМКОСТИ
       {   
         break;
       }
    case VOLUME_30:
       mp3.volume(0x18);// УРОВЕНЬ ГРОМКОСТИ
       {   
         break;
       }
    case VOLUME_40:
       mp3.volume(0x19);// УРОВЕНЬ ГРОМКОСТИ
       {   
         break;
       }
    case VOLUME_50:
       mp3.volume(0x1A);// УРОВЕНЬ ГРОМКОСТИ
       {   
         break;
       }
    case VOLUME_60:
       mp3.volume(0x1B);// УРОВЕНЬ ГРОМКОСТИ
       {   
         break;
       }
    case VOLUME_70:
       mp3.volume(0x1C);// УРОВЕНЬ ГРОМКОСТИ
       {   
         break;
       }
    case VOLUME_80:
       mp3.volume(0x1D);// УРОВЕНЬ ГРОМКОСТИ
       {   
         break;
       }
    case VOLUME_90:
       mp3.volume(0x1E);// УРОВЕНЬ ГРОМКОСТИ
       {   
         break;
       }
    case VOLUME_100:
       mp3.volume(0x1F);// УРОВЕНЬ ГРОМКОСТИ
       {   
         break;
       }
    }
    }

     
    DimaДата: Пятница, 14.12.2012, 14:07 | Сообщение # 5
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 16
    Репутация: 0
    Статус: Offline
    Здравствуйте!
    Подскажите, можно ли воспроизводить по номеру трэка?
    Допустим,чтоб при одних условиях играл трэк номер 5, а при других трэк номер 8 ?
    Есть мысль, что можно создать цикл, который будет переходить по 5 и по 8 раз до нужного трэка, а как при этом возвращаться началу списка?
     
    SergДата: Пятница, 14.12.2012, 17:34 | Сообщение # 6
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Да, можно. Но нужно нумеровать треки в ручную.
     
    DimaДата: Пятница, 14.12.2012, 18:21 | Сообщение # 7
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 16
    Репутация: 0
    Статус: Offline
    через Check Current Playing File 0xC6 ?
    Если вам не трудно, приведите пример пожалуйста.
     
    SergДата: Пятница, 14.12.2012, 20:15 | Сообщение # 8
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    команда 0xC6 -воспроизведение содержимого карты памяти по кругу.
    в библиотеке есть команда воспроизведения трека с определенным номером.
    сделайте цикл воспроизведения с нужными номерами треков
     
    DimaДата: Суббота, 15.12.2012, 00:50 | Сообщение # 9
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 16
    Репутация: 0
    Статус: Offline
    void MP3::play_sd(u16 num)
    {
    cmd_buf[1]=0x04;
    cmd_buf[2]=0xA0;
    cmd_buf[3]=(u8)(num>>8);
    cmd_buf[4]=(u8)num;
    send_cmd(cmd_buf);
    }

    mp3.play_sd(0x0001);

    Правильно мыслю ?
    ещё бы вкурить значение в скобках, я новичок в программировании.
     
    SergДата: Суббота, 15.12.2012, 01:11 | Сообщение # 10
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    значения в скобках- это последовательность команд, которая выполняется, если в программе будет указана команда mp3.play_sd - включить воспроизведение с sd-карты.
     
    DimaДата: Пятница, 21.12.2012, 22:39 | Сообщение # 11
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 16
    Репутация: 0
    Статус: Offline
    Хочется поделиться опытом общения с этим mp3-щитом.
    После недели разбирательств, кое-что начал понимать.

    Щит не поддерживает горячего включения CD-карты или Флэшки, по этому отключать питания, потом производить действия с картой. (написано где-то в инструкции по английски). Так на всякий случай...

    При первой попытке залить скетч, отладчик выдал мне ошибку - avrdude: stk500_getsync(): not in sync: resp=0x80
    Оказалось, что надо предварительно усыпить щит нажатием на кнопку sleep.
    Если пользоваться наушниками, то отчетливо слышно, при усыплении один щелчок, а при пробуждении другой.
    По началу, нажатие кнопки sleep вызывало недоумение, плата засыпала и тут же просыпалась.
    Оказалось дело в пальцах, кнопка реагирует на емкость. Стал нажимать "не пальцами" - прекрасно всё работает.

    Дальше было труднее.
    Мне требовался запуск mp3-файлов по номеру, нажимаешь кнопку 1 раз - играет трэк номер 1, 2 раза - номер 2, и т.п.
    Оказалось, что для запуска трэка по номеру, достаточно набрать:
    mp3.play_sd(1); - трэк №1
    mp3.play_sd(2); - трэк №2
    mp3.play_sd(3); - трэк №3
    и т.п.

    Мучения на этом не закончились...
    Удалось воспроизводить разные файлы, но не по порядку. Выдаешь команду mp3.play_sd(1);, а играет вообще не первый трэк из списка. Закономерность была, а порядка не было.

    В инструкции написано, что щит играет с SD-карты файлы, в порядке их занесения туда, мол какой был залит раньше, тот и первый. И если обозвать файлы:
    0000-file_name.mp3
    0001-file_name.mp3
    0002-file_name.mp3

    и т.п. - то проблема будет решена.

    Не получилось у меня так просто.
    С трэка № 0000 он играть не хочет, только с 0001.
    Но это пол беды, сначала он вообще игнорировал последовательность, например, начинал играть с 0007.
    Потом я обратил внимание, на какой-то номер в окне с файлами (приложил картинку).
    Оказывается это номер в теге ID3v2.
    Я скопировал эти mp3 файлы с разных мест, номера были всякие разные, в связи с этим играло как попало.
    Как только я сровнял номера - 0001 и 1, 0002 и 2... последовательность заработала.

    Чтоб такого не было, надо стереть все эти значения.
    Приложил картинку из Windows 7. В свойствах файла, можно разом всё стереть.
    Чистые файлы обозванные с 0001 и так далее - работают как надо.

    Пока всё, надеюсь кому-то поможет.




    Прикрепления: 2949948.jpg(87Kb) · 0590261.jpg(118Kb) · 3874547.jpg(130Kb)


    Сообщение отредактировал Dima - Суббота, 22.12.2012, 01:14
     
    SergДата: Пятница, 21.12.2012, 23:32 | Сообщение # 12
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Поздравляю с победой!
    Можете даже выложить свой код сюда, вдруг это кому то облегчит жизнь smile
     
    GRACHДата: Суббота, 22.12.2012, 02:27 | Сообщение # 13
    dvrobot.ru
    Группа: Администраторы
    Сообщений: 111
    Репутация: 16181
    Статус: Offline
    Dima, отличный материал !!!
    Serg, обязательно облегчит smile
     
    DimaДата: Понедельник, 24.12.2012, 17:05 | Сообщение # 14
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 16
    Репутация: 0
    Статус: Offline
    Скетч дверного звонка на основе mp3-щита,
    Некоторые элементы взяты из кода Стива Хофера - http://grathio.com/2009/11/secret_knock_detecting_door_lock/

    Код

    #include <MP3.h>
    MP3 mp3;

    const int clickSensor = 6;             // создам константу clickSensor с значением 6

    const int maximumClicks = 10;          // создам константу maximumClicks с значением 10
    const int clickFadeTime = 250;         // аналогично
    const int clickComplete = 1200;        // аналогично
                      
    int numberOfClicks = 1;               // создаем переменную numberOfClicks, со обычным значением 1.

    void setup() {
          pinMode (clickSensor, INPUT);       // цифровой порт №6 определяется как INPUT
              
          mp3.begin();                        // запуск функции mp3
          mp3.volume(0x1F);                   // установка громкости
          mp3.set_mode(MP3::SINGLE);          // Режим проигрывания: играет 1 нужный файл и замолкает.
              
          Serial.begin(9600);                 // Мониторинг через порт, для отладки.
          Serial.println("Program start.");     
    }

    void loop() {                          // Функция ждёт нажатия на кнопку.
          if (digitalRead(clickSensor)) { // Сокращенное написание. Если значение порта HIGH,выполняется функция listenToClick.
            listenToClick();                  // Запуск функции listenToClick.
          }                    // если кнопка не нажат (порт LOW) - ничего не происходит,
    }

    void listenToClick() {                 // создаем функцию listenToClick.
          Serial.println("click.");          // пишет в мониторе, что нажатие было.
          int startTime = millis();          // создаем переменную, которая = количеству миллисекунд с начала включения Arduino.
          int now = millis();                // аналогично
          delay(clickFadeTime);              // задержка, помогает правильно считать нажатие.
          do {                    // Запуск цикла, который оканчивается, пока не наступят нужные условия.
            if (digitalRead(clickSensor)) {  // Смотрим значение порта 6, если HIGH, делает ниже перечисленное.
              Serial.println("click.");      // пишет в мониторе, что кнопка опять нажата.
              now = millis();                // переменной now присваивается значение количества миллисекунд с момента запуска.     
              startTime = now;               // переменная startTime = now.
              numberOfClicks++;              // переменная numberOfClicks увеличивается на 1.
              delay(clickFadeTime);          // задержка, помогает правильно считать нажатие.
            }
            now = millis();                  // опять засекается время, для определения задержки.

    /*Ниже, команда while определяет, надо ли продолжать цикл, если оба условия выполняются, цикл повторяется.
    (now - startTime > clickComplete) - нажатия не было более 1200 миллисекунд - цикл окончен.
    или (numberOfClicks > maximumClicks) - количество нажатий превысило 10 - цикл окончен.*/

          } while ((now - startTime < clickComplete) && (numberOfClicks < maximumClicks));
          playMusic();                      // запуск функции проигрывания mp3 файла.
    }

    void playMusic() {                   // создаем функцию playMusic.
          if (numberOfClicks <= 3) {        // Если нажатий было от 1 до 3, проигрывается мелодия №1.
            mp3.play_sd(1);
          } else { mp3.play_sd(numberOfClicks - 2);  // Если нажатий было больше, например- (4 - 2)= mp3.play_sd(2), трек №2
    }                    // Это для тех кто знает, и звонок будет звонить нужную мелодию.
          Serial.println("Play");                    // Пишет в мониторе, что мелодия запущена.
          numberOfClicks = 1;                        // Возвращает значение переменной в исходное.
    }


    Добавлено (24.12.2012, 17:05)
    ---------------------------------------------
    Не хватает картинки подключения, добавлю.


    Сообщение отредактировал Dima - Понедельник, 24.12.2012, 19:56
     
    DimaДата: Понедельник, 24.12.2012, 17:56 | Сообщение # 15
    3.5 Вольт
    Группа: Пользователи
    Сообщений: 16
    Репутация: 0
    Статус: Offline
    Содержание проекта:
    1. ARUINO или аналог.
    2. mp3-щит.
    3. Кнопка.
    4. Резистор 10кОм.



    Забыл написать, что есть один недостаток.
    Если зажимать кнопку, то цикл слежения будет выполнятся как будто на кнопку нажимают.
    Пока не знаю, как это решить.

    И ещё есть одна идея.
    После нажатия кнопки звонка, сразу зажигать подсветку на 1 минуту, чтоб подсветить того, кто нажал на кнопку.
    Delay тут явно не подходящая команда.
    Может кто подскажет решение?
    Прикрепления: 5623007.jpg(195Kb)


    Сообщение отредактировал Dima - Понедельник, 24.12.2012, 19:23
     
    waterlouДата: Воскресенье, 09.02.2014, 20:50 | Сообщение # 16
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 1
    Репутация: 0
    Статус: Offline
    Здравствуйте.
    Dima, подскажите, пожалуйста, хватит ли набора составляющих, который вы использовали в своем проекте (1. ARUINO или аналог. 2. mp3-щит. 3. Кнопка. 4. Резистор 10кОм.) для реализации следующей штуки:
    при  нажатии на кнопку с карты памяти проигрывается случайный mp3-файл (через какие-нить подключенные колонки), проиграв файл воспроизведение прекращается до следующего нажатия кнопки (при котором проигрывается уже др.файл)? Просто задумал штуку, работающую на таком принципе, но вся проблема в том, что не имею ни малейшего опыта и даже знания как работать с arduino и вообще со всей этой электроникой. Время для реализации поджимает, а я даже не знаю как ко всему этому подступить и с чего начать.
     
    SergДата: Понедельник, 10.02.2014, 18:11 | Сообщение # 17
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Цитата waterlou ()
    хватит ли набора составляющих

    Хватит!
     
    SutsukoДата: Воскресенье, 10.08.2014, 07:30 | Сообщение # 18
    5 Вольт
    Группа: Пользователи
    Сообщений: 42
    Репутация: 0
    Статус: Offline
    Подскажите пожалуйста как (кроме как через UART) подсоединить этот MP3Sheild к Arduino Pro mini ??????

    Сообщение отредактировал Sutsuko - Четверг, 04.09.2014, 05:04
     
    SutsukoДата: Пятница, 31.10.2014, 07:26 | Сообщение # 19
    5 Вольт
    Группа: Пользователи
    Сообщений: 42
    Репутация: 0
    Статус: Offline
    Какя-то ошибка стала возникать при подключении MP3 библиотеки...:
    Arduino: 1.5.8 (Windows 7), Board: "Arduino Pro or Pro Mini, ATmega328 (5V, 16 MHz)"

    In file included from MP3.ino:1:0:
    C:\Program Files\Arduino\libraries\MP3Shileld/MP3.h:22:18: error: conflicting declaration 'typedef uint16_t u16'
    Показать полностью..
    typedef uint16_t u16;
    ^
    In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:224:0,
    from C:\Program Files\Arduino\libraries\MP3Shileld/MP3.h:12,
    from MP3.ino:1:
    C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/USBAPI.h:30:24: error: 'u16' has a previous declaration as 'typedef short unsigned int u16'
    typedef unsigned short u16;
    ^
    Ошибка компиляции.

    This report would have more information with
    "Show verbose output during compilation"
    enabled in File > Preferences.
     
    SergДата: Пятница, 31.10.2014, 13:49 | Сообщение # 20
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Нужно вернуться к предыдущей версии Arduino IDE.
     
    SutsukoДата: Понедельник, 10.11.2014, 00:33 | Сообщение # 21
    5 Вольт
    Группа: Пользователи
    Сообщений: 42
    Репутация: 0
    Статус: Offline
    Цитата Serg ()
    Нужно вернуться к предыдущей версии Arduino IDE.


    Так сначала-то не было такой ошибки на этой же самой версии....
     
    SutsukoДата: Понедельник, 10.11.2014, 08:10 | Сообщение # 22
    5 Вольт
    Группа: Пользователи
    Сообщений: 42
    Репутация: 0
    Статус: Offline
    Цитата
    #include <MP3.h>MP3 mp3;int val = 0;void setup()
    {
    mp3.begin();
    mp3.volume(0x1F);
    mp3.set_mode(MP3::SINGLE);
    pinMode( 12 , INPUT_PULLUP);
    pinMode( 11 , INPUT_PULLUP);
    }void loop()
    {
    if (val = digitalRead(11))
    {
    case mp3.play_spi_flash(0x0001);
    {
    break;
    }
    }
    if (val = digitalRead(12))
    {
    case mp3.play_spi_flash(0x0002);
    {
    break;
    }
    }
    if (val = digitalRead(11)||(12))
    {
    case mp3.play_spi_flash(0x0003);
    {
    break;
    }
    }
    }


    Что-то не так...., помогите пожалуйста....


    Сообщение отредактировал Sutsuko - Четверг, 13.11.2014, 02:41
     
    SergДата: Понедельник, 10.11.2014, 19:48 | Сообщение # 23
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Цитата Sutsuko ()
     void MP3::play_spi_flash(u16 num)

    это как то можете объяснить?
     
    SutsukoДата: Вторник, 11.11.2014, 05:52 | Сообщение # 24
    5 Вольт
    Группа: Пользователи
    Сообщений: 42
    Репутация: 0
    Статус: Offline
    Цитата Serg ()
    это как то можете объяснить?
    Это я из этого сообщения http://forumdvrobot.ru/forum/3-3-681-16-1355493024 выдрал....
    Как мне запустить воспроизведение мелодии 001, 002, 003 в spi_flash....???


    Сообщение отредактировал Sutsuko - Вторник, 11.11.2014, 06:35
     
    SutsukoДата: Суббота, 15.11.2014, 23:22 | Сообщение # 25
    5 Вольт
    Группа: Пользователи
    Сообщений: 42
    Репутация: 0
    Статус: Offline
    
    Код
    #include <MP3.h>
    MP3 mp3;
    int val = 0;
    void setup()
    {
         mp3.begin();
         mp3.volume(0x1F);
         mp3.set_mode(MP3::SINGLE);
         pinMode( 12 , INPUT_PULLUP);
         pinMode( 11 , INPUT_PULLUP);
    }
    void loop()
    {
         if (val == digitalRead(11))
         {
         mp3.play_spi_flash(0x0001);
         delay(1000);
         }
         if (val == digitalRead(12))
         {
         mp3.play_spi_flash(0x0002);
         delay(1000);
         }
         if (val == digitalRead(11)//тут должна быть функция//(12))
         {
         mp3.play_spi_flash(0x0003);
         delay(1000);
         }
    }


    Вот в этом варианте нужная мелодия запускается, но проигрывается с задержкой 1сек до момента PinMode (INPUT_PULLUP).
    Какую команду нужно добавить или изменить, чтобы  проигрывание было однократным даже при продолжительном val = digitalRead ???


    Сообщение отредактировал Sutsuko - Воскресенье, 16.11.2014, 01:58
     
    SergДата: Воскресенье, 16.11.2014, 00:52 | Сообщение # 26
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Самый простой способ- увеличить задержку с 1000 до 10000-20000, в зависимости от длины мелодии. Еще можно попытаться считать с модуля МР3 его состояние-воспроизводит ли он в данный момент мелодию и на время воспроизведения запретить опрос кнопок. Но наврряд ли модуль на такое способен wink
     
    SutsukoДата: Воскресенье, 16.11.2014, 01:09 | Сообщение # 27
    5 Вольт
    Группа: Пользователи
    Сообщений: 42
    Репутация: 0
    Статус: Offline
    Цитата Serg ()
    Самый простой способ- увеличить задержку с 1000 до 10000-20000, в зависимости от длины мелодии.
    Длинна мелодии как раз 1000.
    Увеличивать задержку пробовал - мелодия начинает воспроизводиться только после истечении этой задержки. Не приемлемо.

    ...p.s.......нужно так же что бы при одновременном val == digitalRead(11) и (12)) запускалась мелодия 003.


    Сообщение отредактировал Sutsuko - Воскресенье, 16.11.2014, 02:01
     
    SergДата: Воскресенье, 16.11.2014, 08:41 | Сообщение # 28
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Примените логическое И
    if (Val == digitalRead(12)  && digitalRead(11))  // считывает состояние двух портов
     
    SutsukoДата: Понедельник, 17.11.2014, 22:48 | Сообщение # 29
    5 Вольт
    Группа: Пользователи
    Сообщений: 42
    Репутация: 0
    Статус: Offline
    Цитата Serg ()
    Примените логическое И if (Val == digitalRead(12) && digitalRead(11)) // считывает состояние двух портов
    Как ни странно.., но при этом происходит странная аномалия... Происходит поочерёдное воспроизведение 001 и 002 мелодий. Даже при if (val == digitalRead(11)) происходит поочерёдное воспроизведение 001 и 002 мелодий.
     
    SergДата: Понедельник, 17.11.2014, 23:05 | Сообщение # 30
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    аномалия объясняется тем, что вы просто не можете нажать обе кнопки одновременно. какая то раньше, какая то позже. дребезг онтактов тоже еще пока никто не отменял. нужно предусмотреть в программе небольшую задержку, в течении которой успеть нажать обе кнопки и тольуо после этого считывать состояние кнопок.
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Arduino MP3-ЩИТ. Примеры кода. (Запускаем МР-3 щит в работу.)
    Страница 1 из 212»
    Поиск:

    ДВ Робот - Чат