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

Я сделал 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

Обсуждение

Где остальная часть кода?, @VE7JRO

Я бы поместил случайное семя в настройку, а не в ваш основной цикл. Кроме этого, возможно, есть ошибка в той части кода, которую вы не показали., @Nick Gammon

Извините, я сейчас выложил весь код., @Micha

Зачем вы постоянно перезагружаете генератор случайных чисел? Вам это нужно один раз при настройке., @Delta_G

Теперь это решено. Вы правы, только с randomseed в настройках все работает отлично. Лучше бы понять инструкцию перед использованием. Спасибо!, @Micha

ваш код чрезмерно повторяется .... используйте массивы для определения переменных ... например, определите const int track[] = {6, 5, 6, 7, 8, 9, 15, 20, 21};, а затем воспроизводите треки без необходимости использования операторов if, mp3.playTrackNumber(track[random], 30);, @jsotola

Вы также можете определить список треков в двумерном массиве, а затем иметь только один оператор воспроизведения во всей программе mp3.playTrackNumber(track[button][random], 30);, @jsotola


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.

,

Я не понял, как работает randomseed, и подумал, что мне нужно снова его использовать, чтобы получить другое число. Я вставил его только в настройку, и теперь все работает отлично! :-), @Micha

Большое спасибо и спасибо за другие подсказки тоже!, @Micha