Elechhouse Mo3 Shield Play случайная песня

когда кто-то проходит мимо моего датчика расстояния, я получаю ошибку, одна и та же песня(трек 0001) играет каждый раз. Какой-нибудь совет?

#include <SoftwareSerial.h>
SoftwareSerial Geno(7,8); // Rx , Tx

unsigned char Data[10];
unsigned char i;

// defines pins numbers
const int trigPin = 8;
const int echoPin = 9;

// defines variables
long duration;
int distance;

void setup() {
  delay(1000);
  Geno.begin(9600);
  delay(1000);
  SetVolume(30);
  pinMode(trigPin, OUTPUT); //  Устанавливает тригПин в качестве выходного
  pinMode(echoPin, INPUT); // Устанавливает echoPin в качестве входного
  Serial.begin(9600); // Запуск последовательной связи
}

void playTrack(int num){

    delay(100);

    Data[0] = 0x7E;
    Data[1] = 0x04;
    Data[2] = 0xA0;
    Data[3] = 0x00;
    Data[4] = 0x00 + num;
    Data[5] = 0x7E;
   Command(Data,5);

    play_pause();

    delay(10000);

}

void SetVolume( int vol){
   Data[0] = 0x7E;          // СТАРТ
   Data[1] = 0x03; // Длина не 0x02
   Data[2] = 0xA7; // Команда
   Data[3] = vol; // новый том
   Data[4] = 0x7E; // КОНЕЦ
   Command(Data,5);
}

void play_pause(){
  Data[0] = 0x7E;          // СТАРТ
  Data[1] = 0x02; // Длина
  Data[2] = 0xA3; // Команда
  Data[3] = 0x7E; //Параметр Mode
  Command(Data,4);
}

void Command(unsigned char *Data, int length){
    for(int i=0; i<length; i++){
    Geno.write(Data[i]);
    }

    }

void loop() {
  //Присваивает случайное число
  int song = random(0,200);
  Serial.print("Song is:");
  Serial.print(song);
  Serial.print("\n");
  // Очищает trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

  // Устанавливает trigPin в HIGH состояние на 10 микросекунд
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Считывает echoPin, возвращает время прохождения звуковой волны в микросекундах
  duration = pulseIn(echoPin, HIGH);

  // Calculating the distance
  distance= duration*0.034/2;

  Serial.print("Distance: ");
  Serial.println(distance);
  if(distance < 20){
    playTrack(random(1,25));
  }
  //playTrack(1);
  //playTrack(2);
}

, 👍1

Обсуждение

в чем же ошибка?, @jsotola

Это была плохая фраза на моем aprt, ошибка в том, что он воспроизводит одно и то же снова и снова, @Pagaley 12

начните с базового кода ... никакого измерения расстояния, никакого случайного выбора трека ... только код, который воспроизводит трек 03 (что угодно, кроме 01) ... как только это сработает, добавьте случайный выбор ... когда это сработает, добавьте код датчика расстояния, @jsotola

сам по себе play random работает, но как только я добавляю код для расстояния, он воспроизводит ту же песню, что и раньше, есть идеи?, @Pagaley 12


2 ответа


0

Отказ от ответственности: Я ничего не знаю об этом медиаплеере, кроме того, о чем идет речь в этом вопросе. Я никогда раньше об этом не слышал. Следующее просто из наблюдения за кодом, который вы опубликовали.

Посмотрите на свою функцию play_pause (), в которой описаны значения всех элементов.

Data[0] = 0x7E;          // НАЧАЛО
Data[1] = 0x02;          // Длина
Data[2] = 0xA3;          // Команда
Data[3] = 0x7E;          //Параметр режима
Command(Data,4);

Похоже, сообщение начинается с 0x7E, за которым следует длина, затем команда и что-то еще, а затем еще 0x7E.

Поле "Длина" на 1 меньше общей длины, поэтому я думаю, что оно не включает "начало" или что - то еще-есть различные эквивалентные способы, которыми вы могли бы взглянуть на него.

В playTrack() вы задаете 6 элементов, но для элемента длины установлено значение 4. Затем вы сообщаете команде (), что их 5. Таким образом, последний элемент (0x7E) не будет отправлен, а отправленный вами элемент длины в любом случае неверен.

Полагаю, приемник впадет в какое-то странное состояние. Возможно, это объясняет проблему, которую вы видите.

,

Это почти определенно глупый вопрос, но я новичок в этом, где элемент длины и где он установлен на 4?, @Pagaley 12

Я более подробно объяснил это выше. Надеюсь, в этом больше смысла., @Mark Smith


0

случайная(1,25) является детерминированной. Это PRNG должен каждый раз производить одну и ту же последовательность выходов в одном и том же порядке. В какой-то момент вам нужно вызвать randomSeed (), передав ему непредсказуемое значение. Что-то вроде:

if(distance < 20){
  randomSeed(micros());
  playTrack(random(1,25));
} 
,