arduino cd waw нужна помощь с кодом

Тема в разделе "Arduino & Shields", создана пользователем xelboy, 3 фев 2017.

Метки:
  1. xelboy

    xelboy Нуб

    здравствуйте,пытаюсь освоить ардуино. суть проэкта воспроизвести аудиофайл waw с cd карты, есть 5 треков и 5 кнопок, при нажатии первой кнопки воспроизводится 1й трек и т.д. и важный момент воспроизведение должно продолжатся пока нажата кнопка. никак не разберусь как взаимодействуют библиотеки.
     
  2. Airbus

    Airbus Радиохулиган Модератор

    Последнее редактирование: 5 фев 2017
  3. xelboy

    xelboy Нуб

    Искал уже, перерыл весь нэт либо плееры с управлением восп. След.и т д
    Нашел только прошивку для атмеги но там трек воспроизводится полностью а мне нужно когда кнопку отпустишь чтобы останавливалось воспроизведение.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    А самому код подправить не?
     
  5. xelboy

    xelboy Нуб

    Я не волшебник , я только учусь, нашел кое что но выдаёт ошибку при компиляции, доработал выложу код
     
  6. sslobodyan

    sslobodyan Гик

    Как только ваш вопрос изменится на "я хочу вот так, для этого делаю вот это, не разобрался только в том месте" - сразу получите помощь. А пока все выглядит на "задали лабораторку - сделайте за меня, кто умеет"
     
  7. xelboy

    xelboy Нуб

    Код (Text):

    #include <SD.h>// sd kart kütüphanesi
    #define Sd_Chip_pin 10
    #include <TMRpcm.h>// melodi çalma kütüphanesi

    TMRpcm tmrpcm; // melodi fonksiyonu oluşturma
    int SW1;
    int SW2;
    int SW3;
    int SW4;
    int SW5;
    void setup() {
      Serial.begin(9600);
      pinMode(2, INPUT);
      pinMode(3, INPUT);
      pinMode(4, INPUT);
      pinMode(5, INPUT);
      pinMode(6, INPUT);
      tmrpcm.speakerPin = 9; //

      if (!SD.begin(Sd_Chip_pin)) { //
      }

    }

    void loop() {
      SW1 = digitalRead(2);
      SW1 = digitalRead(3);
      SW1 = digitalRead(4);
      SW1 = digitalRead(5);
      SW1 = digitalRead(6);

      if (SW1 == LOW) { //
        tmrpcm.play("1.wav");{
        } else (SW1 == HIGH);{
         tmrpcm.stopPlayback("1.wav");
     }
     }
    }
    }
     
  8. xelboy

    xelboy Нуб

    проблема в конце кода с кнопками никак не разберусь
     
  9. sslobodyan

    sslobodyan Гик

    1. Состояние всех входов считано в одну и ту же переменную.
    2. В if каша а не код. Разберитесь где какие скобки.
    3. Обязательно заведите себе переменную, хранящую состояние "воспроизводим/молчим". Иначе при нажатии на кнопку у вас будет постоянный старт, при отпускании - постоянный останов воспроизведения. А надо посылать одну команду при переключении состояния кнопки (и там еще дребезг будет, но об этом попозже)
     
  10. Arkad_snz

    Arkad_snz Гик

    Разберитесь, что означают эти две сточки в конце:
    -----
    } else (SW1 == HIGH);{
    tmrpcm.stopPlayback("1.wav");
    -----
    Что такое"else (SW1 == HIGH);"?
     
  11. xelboy

    xelboy Нуб

    3. Обязательно заведите себе переменную, хранящую состояние "воспроизводим/молчим". Иначе при нажатии на кнопку у вас будет постоянный старт, при отпускании - постоянный останов воспроизведения. А надо посылать одну команду при переключении состояния кнопки (и там еще дребезг будет, но об этом попозже)[/QUOTE]
    про это можно по подробней,это моя первая программа поэтому сильно не ругайте.
    вот что получилось у меня после танцев с бубном.
    Код (C++):
    #include <pcmConfig.h>
    #include <pcmRF.h>
    #include <SPI.h>
    #include <TMRpcm.h>
    #include <SD.h>
    #define SD_ChipSelectPin 10 //Определение 3го пина для управления адаптером флешки
    TMRpcm tmrpcm;
    const int buttonPin = 2;
    const int button1Pin = 3;// номер входа, подключенный к кнопке


    // переменные
    int buttonState = 0;
    int button1State = 0;// переменная для хранения состояния кнопки

    void setup() {
      tmrpcm.speakerPin = 9;
      if (!SD.begin(SD_ChipSelectPin)) { //Проверка инициализации флешки
        return;
      }
      tmrpcm.volume(4);
      // инициализируем пин, подключенный к кнопке, как вход
      pinMode(buttonPin, INPUT);
      pinMode(button1Pin, INPUT);
    }

    void loop() {
      // считываем значения с входа кнопки
      buttonState = digitalRead(buttonPin);
      button1State = digitalRead(button1Pin);

      // проверяем нажата ли кнопка
      // если нажата, то buttonState будет HIGH:
      if (buttonState == HIGH) {
         tmrpcm.play("1.wav");
        delay(1000);
        }
      else {
        tmrpcm.disable();
      }
      if (button1State == HIGH) {
        tmrpcm.play("2.wav");
        delay(1000);
    }
      else {
      tmrpcm.disable();
      }
    }
    без "delay" упорно не хочет работать,и так и не получается прервать воспроизведение при размыкании кнопки.
     
  12. sslobodyan

    sslobodyan Гик

    Ну давайте думать как будет поступать контроллер. Разбираем построчно ваш код.
    Код (C++):
      if (buttonState == HIGH) {
         tmrpcm.play("1.wav");
        delay(1000);
        }
      else {
        tmrpcm.disable();
      }
    Итак, построчно.
    1. Если на входе кнопки 5 вольт, то запускаем на воспроизведение файл 1 и ждем 1 секунду.
    2. Иначе отключаем воспроизведение.
    Согласны?
    И далее повтор для другой кнопки.
    А теперь представьте, что вы нажали 1 кнопку, началось воспроизведение, ожидаем 1 секунду и затем идем обрабатывать кнопку 2. Кнопка 2 не нажата, код идет по ветке else и останавливает воспроизведение 1 файла. Мысль понятна?
    Теперь как бы я решал данную задачу.
    Я бы убрал все ветки с else. Кнопки должны только запускать воспроизведение. А вот после нужна такая проверка
    Код (C++):
    if (buttonState == LOW && button1State == LOW) {
      tmrpcm.disable();
    }
    То есть если и первая и вторая кнопки не нажаты, то останавливаем воспроизведение.
    Весь код специально не пишу, думайте.