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
|
|
| |
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 и так далее - работают как надо.
Пока всё, надеюсь кому-то поможет.
Сообщение отредактировал Dima - Суббота, 22.12.2012, 01:14 |
|
| |
Serg | Дата: Пятница, 21.12.2012, 23:32 | Сообщение # 12 |
Ампер
Группа: Модераторы
Сообщений: 510
Репутация: 28
Статус: Offline
| Поздравляю с победой! Можете даже выложить свой код сюда, вдруг это кому то облегчит жизнь
|
|
| |
GRACH | Дата: Суббота, 22.12.2012, 02:27 | Сообщение # 13 |
dvrobot.ru
Группа: Администраторы
Сообщений: 111
Репутация: 16181
Статус: Offline
| Dima, отличный материал !!! Serg, обязательно облегчит
|
|
| |
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 тут явно не подходящая команда. Может кто подскажет решение?
Сообщение отредактировал 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 его состояние-воспроизводит ли он в данный момент мелодию и на время воспроизведения запретить опрос кнопок. Но наврряд ли модуль на такое способен
|
|
| |
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
| аномалия объясняется тем, что вы просто не можете нажать обе кнопки одновременно. какая то раньше, какая то позже. дребезг онтактов тоже еще пока никто не отменял. нужно предусмотреть в программе небольшую задержку, в течении которой успеть нажать обе кнопки и тольуо после этого считывать состояние кнопок.
|
|
| |