Новое случайное число не сгенерировано

Я сделал teddybaer с кнопками, светодиодами и голосовым выводом для своего сына. Есть несколько кнопок с фотографиями нашей семьи со светодиодами сзади. Adruino подключен к DfPlayer mini. После нажатия кнопки (картинки) загорается светодиод сзади и начинается воспроизведение случайного трека, соответствующего картинке. Это все не проблема и работает хорошо... Но было немного скучно, не было возможности переключить трек до его завершения. Поэтому я перекомментировал это:

void MP3Player::playTrackNumber(int trackNumber, int volume, boolean waitPlayTerminated)
    {
        player.volume(volume);
        player.play(trackNumber);
        if (waitPlayTerminated)
        {
        
        //    waitPlayIsTerminated();
        }
    }

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

Если я снова нажму ту же кнопку, каждый раз будет воспроизводиться один и тот же трек.

#include "mp3tf16p.h"

long randNumber;
long randNumber2;
long randNumber3;
long randNumber4;
long randNumber5;

MP3Player mp3(2, 3 );

//марина
const int button1 = 4;
//миха
const int button2 = 6;
//мама
const int button3 = 8;
//галина
const int button4 = 10;
//Алекс
const int button5 = 12;
//марина
const int led1 = 5;
//МИХА
const int led2 = 7;
//мама
const int led3 = 9;
//галина
const int led4 = 11;
//Алекс
const int led5 = 13;
void setup() {
  // поместите сюда ваш код настройки для однократного запуска:
Serial.begin(9600);
pinMode(LED_BUILTIN , OUTPUT);

mp3.initialize();

 randomSeed(analogRead(A0) * analogRead(A1));

pinMode (button1,INPUT);
pinMode (button2,INPUT); 
pinMode (button3,INPUT);
pinMode (button4,INPUT);
pinMode (button5,INPUT);

pinMode (led1, OUTPUT);
pinMode (led2, OUTPUT);
pinMode (led3, OUTPUT);
pinMode (led4, OUTPUT);
pinMode (led5, OUTPUT);

}

void loop() {
  // поместите сюда свой основной код для многократного выполнения:
int reads = digitalRead(button1);
int reads2 = digitalRead(button2);
int reads3 = digitalRead(button3);
int reads4 = digitalRead(button4);
int reads5 = digitalRead(button5);




 randomSeed(analogRead(A0) * analogRead(A1));

// mp3.playTrackNumber(15, 30);
//марина
if (reads==1)
{

   randomSeed(analogRead(A0) * analogRead(A1));
  randNumber = random(1, 7);
   
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led1, HIGH);


 // mp3.playTrackNumber(30, 30);

  if (randNumber==1)
  {
  mp3.playTrackNumber(12, 30);  
  }
  
    if (randNumber==2)
  {
  mp3.playTrackNumber(13, 30);  
  }
  if (randNumber==3)
  {
  mp3.playTrackNumber(14, 30);  
  }

  if (randNumber==4)
  {
  mp3.playTrackNumber(16, 30);  
  }
if (randNumber==5)
  {
  mp3.playTrackNumber(17, 30);  
  }

if (randNumber==6)
  {
  mp3.playTrackNumber(18, 30);  
  }
  digitalWrite(led1, LOW);
}
else {

}

//миха
if (reads2==1)
{

  
   randomSeed(analogRead(A0) * analogRead(A1));
  randNumber2 = random(1, 7);
   randomSeed(analogRead(A0) * analogRead(A1));

  digitalWrite(led1, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led2, HIGH);

  if (randNumber2==1)
  {
  mp3.playTrackNumber(2, 30);  
  }
  
    if (randNumber2==2)
  {
  mp3.playTrackNumber(3, 30);  
  }
  if (randNumber2==3)
  {
  mp3.playTrackNumber(4, 30);  
  }

 if (randNumber2==4)
  {
  mp3.playTrackNumber(10, 30);  
  }

   if (randNumber2==5)
  {
  mp3.playTrackNumber(11, 30);  
  }

   if (randNumber2==6)
  {
  mp3.playTrackNumber(6, 30);  
  }

  digitalWrite(led2, LOW);
}
else {

}
//Александр
if (reads5==1)
{
 // mp3.playTrackNumber(6, 30);
  randomSeed(analogRead(A0) * analogRead(A1));
  randNumber3 = random(1, 10);
  randomSeed(analogRead(A0) * analogRead(A1));
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, HIGH);

  if (randNumber3==1)
  {
  mp3.playTrackNumber(6, 30);  
  }
  
    if (randNumber3==2)
  {
  mp3.playTrackNumber(5, 30);  
  }
  if (randNumber3==3)
  {
  mp3.playTrackNumber(6, 30);  
  }
  

 if (randNumber3==4)
  {
  mp3.playTrackNumber(7, 30);  
  }

   if (randNumber3==5)
  {
  mp3.playTrackNumber(8, 30);  
  
}
  if (randNumber3==6)
  {
  mp3.playTrackNumber(9, 30);  
  
}
 if (randNumber3==7)
  {
  mp3.playTrackNumber(15, 30);  
  
}

 if (randNumber3==8)
  {
  mp3.playTrackNumber(20, 30);  
  
}

 if (randNumber3==9)
  {
  mp3.playTrackNumber(21, 30);  
  
}
digitalWrite(led5, LOW);
}
else {

}


//галина
if (reads4==1)
{
   randomSeed(analogRead(A0) * analogRead(A1));
  randNumber4 = random(2, 9);
// randomSeed(analogRead(A0) * analogRead(A1));
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led4, HIGH);
if (randNumber4==2)
  {
  mp3.playTrackNumber(19, 30);  
  
}
if (randNumber4==3)
  {
  mp3.playTrackNumber(24, 30);  
  
}
if (randNumber4==4)
  {
  mp3.playTrackNumber(25, 30);  
  
}
if (randNumber4==5)
  {
  mp3.playTrackNumber(26, 30);  
  
}
if (randNumber4==6)
  {
  mp3.playTrackNumber(27, 30);  
  
}
if (randNumber4==7)
  {
  mp3.playTrackNumber(28, 30);  
  }

if (randNumber4==8)
  {
  mp3.playTrackNumber(29, 30);  
  

}
  digitalWrite(led4, LOW);
}
if (reads3==1)
{
    randomSeed(analogRead(A0) * analogRead(A1));
  randNumber5 = random(1, 8);
  randomSeed(analogRead(A0) * analogRead(A1));
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led5, LOW);
  digitalWrite(led3, HIGH);
    mp3.playTrackNumber(22, 30); 
}
else {

}
digitalWrite(led3, LOW);

mp3.serialPrintStatus(MP3_ALL_MESSAGE);


}

Почему возможно, что если я нажму другую кнопку во время воспроизведения трека, он будет воспроизводиться случайным образом. Но если я снова нажму ту же кнопку, которая уже воспроизводится, тот же трек начнется заново, как будто программа просто начнет трек заново, но без генерации нового случайного числа?

, 👍-1


1 ответ


0

Хватит переустанавливать генератор случайных чисел!

Вы должны задать его один раз (в настройках). Если вы повторно зададите его тем же самым значением, вы будете получать одно и то же число каждый раз.

Я был бы немного удивлен, если бы analogRead каждый раз выдавал один и тот же результат, но, скажем, A0 вернул ноль, потому что этот вывод был заземлен, тогда ноль, умноженный на любое число, будет нулём, поэтому вы всегда будете заполнять генератор случайных чисел нулем, а случайное число, которое вы запрашиваете, всегда будет одним и тем же.

Также попробуйте заняться арифметикой. Вместо:

 if (randNumber == 1)
    {
      mp3.playTrackNumber(12, 30);
    }

    if (randNumber == 2)
    {
      mp3.playTrackNumber(13, 30);
    }
    if (randNumber == 3)
    {
      mp3.playTrackNumber(14, 30);
    }

    if (randNumber == 4)
    {
      mp3.playTrackNumber(16, 30);
    }
    if (randNumber == 5)
    {
      mp3.playTrackNumber(17, 30);
    }

    if (randNumber == 6)
    {
      mp3.playTrackNumber(18, 30);
    }

Как насчет:

      mp3.playTrackNumber(11 + randNumber, 30);

Это намного короче, не правда ли? Или, если это вам не подходит (я не пропустил 15-й трек, как вы), вы можете прочитать, как работают операторы case.

,