Uso de potenciômetro

Estou fazendo um Genius… tenho um código do RBTech, que funcionou perfeitamente. Agora estou implementando um potenciômetro, para definir qual o nível do usuário. Minha intenção é colocar 4 níveis de dificuldade.
Não estou consguindo fazer a leitura do potenciômetro… parece que está sendo lido somente o primeiro “if”…
Sou novato (no arduino e no forum)… vou passar o código, para que deêm uma olhada…
Obrigado…

int vezes = 0;
int intervalo = 0;
int duracao = 0;
int potenciometro = 0;

#define NOTE_B0 31

#define NOTE_C1 33

#define NOTE_CS1 35

#define NOTE_D1 37

#define NOTE_DS1 39

#define NOTE_E1 41

#define NOTE_F1 44

#define NOTE_FS1 46

#define NOTE_G1 49

#define NOTE_GS1 52

#define NOTE_A1 55

#define NOTE_AS1 58

#define NOTE_B1 62

#define NOTE_C2 65

#define NOTE_CS2 69

#define NOTE_D2 73

#define NOTE_DS2 78

#define NOTE_E2 82

#define NOTE_F2 87

#define NOTE_FS2 93

#define NOTE_G2 98

#define NOTE_GS2 104

#define NOTE_A2 110

#define NOTE_AS2 117

#define NOTE_B2 123

#define NOTE_C3 131

#define NOTE_CS3 139

#define NOTE_D3 147

#define NOTE_DS3 156

#define NOTE_E3 165

#define NOTE_F3 175

#define NOTE_FS3 185

#define NOTE_G3 196

#define NOTE_GS3 208

#define NOTE_A3 220

#define NOTE_AS3 233

#define NOTE_B3 247

#define NOTE_C4 262

#define NOTE_CS4 277

#define NOTE_D4 294

#define NOTE_DS4 311

#define NOTE_E4 330

#define NOTE_F4 349

#define NOTE_FS4 370

#define NOTE_G4 392

#define NOTE_GS4 415

#define NOTE_A4 440

#define NOTE_AS4 466

#define NOTE_B4 494

#define NOTE_C5 523

#define NOTE_CS5 554

#define NOTE_D5 587

#define NOTE_DS5 622

#define NOTE_E5 659

#define NOTE_F5 698

#define NOTE_FS5 740

#define NOTE_G5 784

#define NOTE_GS5 831

#define NOTE_A5 880

#define NOTE_AS5 932

#define NOTE_B5 988

#define NOTE_C6 1047

#define NOTE_CS6 1109

#define NOTE_D6 1175

#define NOTE_DS6 1245

#define NOTE_E6 1319

#define NOTE_F6 1397

#define NOTE_FS6 1480

#define NOTE_G6 1568

#define NOTE_GS6 1661

#define NOTE_A6 1760

#define NOTE_AS6 1865

#define NOTE_B6 1976

#define NOTE_C7 2093

#define NOTE_CS7 2217

#define NOTE_D7 2349

#define NOTE_DS7 2489

#define NOTE_E7 2637

#define NOTE_F7 2794

#define NOTE_FS7 2960

#define NOTE_G7 3136

#define NOTE_GS7 3322

#define NOTE_A7 3520

#define NOTE_AS7 3729

#define NOTE_B7 3951

#define NOTE_C8 4186

#define NOTE_CS8 4435

#define NOTE_D8 4699

#define NOTE_DS8 4978

#define CHOICE_OFF 0 //Usado para controlar LEDs

#define CHOICE_NONE 0 //Usado para verificar botões

#define CHOICE_RED (1 << 0)

#define CHOICE_GREEN (1 << 1)

#define CHOICE_BLUE (1 << 2)

#define CHOICE_YELLOW (1 << 3)

#define LED_RED 10

#define LED_GREEN 3

#define LED_BLUE 13

#define LED_YELLOW 5

// Definições dos pinos de botão

#define BUTTON_RED 9

#define BUTTON_GREEN 2

#define BUTTON_BLUE 12

#define BUTTON_YELLOW 6

// Definições dos pinos do Buzzer

#define BUZZER1 4

#define BUZZER2 7

// Parâmetros do jogo

//#define ROUNDS_TO_WIN 13 // Número de rodadas para vencer o Jogo.

//#define ENTRY_TIME_LIMIT 3000 // Tempo para pressionar um botão antes que o jogo acabe. 3000ms = 3 seg

#define MODE_MEMORY 0

#define MODE_BATTLE 1

#define MODE_BEEGEES 2

// Variáveis de estado do jogo

byte gameMode = MODE_MEMORY; //Por padrão, vamos jogar o jogo da memória

byte gameBoard[32]; //Salva a combinação de botões à medida que avançamos

byte gameRound = 0; //Conta o número de rodadas de sucesso que o jogador fez

void setup()

{

Serial.begin(9600);

// Configuração dos pinos de entradas e saídas

// Ativa pull ups em entradas

pinMode(BUTTON_RED, INPUT_PULLUP);

pinMode(BUTTON_GREEN, INPUT_PULLUP);

pinMode(BUTTON_BLUE, INPUT_PULLUP);

pinMode(BUTTON_YELLOW, INPUT_PULLUP);

pinMode(LED_RED, OUTPUT);

pinMode(LED_GREEN, OUTPUT);

pinMode(LED_BLUE, OUTPUT);

pinMode(LED_YELLOW, OUTPUT);

pinMode(BUZZER1, OUTPUT);

pinMode(BUZZER2, OUTPUT);

// Verificação de modo

gameMode = MODE_MEMORY; // Por padrão, vamos jogar o jogo da memória

// Verifique se o botão inferior direito está pressionado

if (checkButton() == CHOICE_YELLOW) play_beegees();

// Verifique se o botão superior direito está pressionado

if (checkButton() == CHOICE_GREEN)

{

gameMode = MODE_BATTLE; // Coloque o jogo no modo de batalha



//Ligue o LED superior direito (verde)

setLEDs(CHOICE_GREEN);

toner(CHOICE_GREEN, 150);



setLEDs(CHOICE_RED | CHOICE_BLUE | CHOICE_YELLOW); // Ligue os outros LEDs até você soltar o botão



while(checkButton() != CHOICE_NONE) ; // Aguarde até que o usuário pare de pressionar o botão



//Agora não faça nada. O modo de batalha esta ativado

}

play_winner(); // Após a conclusão da configuração, diga olá ao mundo

}

void loop()

{

potenciometro = (analogRead(A0)); //lê o valor do potenciometro
if (potenciometro < 500) { //seta nível 1 e atribui valores
vezes = 3;
intervalo = 3000;
duracao = 1000;
}
else if (potenciometro > 499){ //seta nível 2 e atribui valores
vezes = 5;
intervalo = 2000;
duracao = 500;
}

//else {                                 //seta nível 3 e atribui valores
//  vezes = 13;
//   intervalo = 1000;
//   duracao = 150;   
//}

attractMode(); // Pisca luzes enquanto aguarda o usuário apertar um botão

// Indique o início do jogo

setLEDs(CHOICE_RED | CHOICE_GREEN | CHOICE_BLUE | CHOICE_YELLOW); // Ativar todos os LEDs

delay(1000);

setLEDs(CHOICE_OFF); // Desligue os LEDs

delay(250);

if (gameMode == MODE_MEMORY)

{

// Play no jogo de memória e recebe com resultado

if (play_memory() == true) 

  play_winner(); // Ganhou, toca som vitória

else 

  play_loser(); // Perdeu, toca som derrota

}

if (gameMode == MODE_BATTLE)

{

play_battle(); // Jogue o jogo até que alguém perca



play_loser(); // Perdeu, toca som derrota

}

}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

//As seguintes funções estão relacionadas apenas ao jogo

// Jogue o jogo regular da memória

// Retorna 0 se o jogador perde ou 1 se o jogador ganhar

boolean play_memory(void)

{

randomSeed(millis()); // Gerador aleatório

gameRound = 0; // Redefinir o jogo para o começo

while (gameRound < vezes )//ROUNDS_TO_WIN)

{

add_to_moves(); // Adicione um botão aos movimentos atuais e reproduza-os



playMoves(); // Jogue de volta o tabuleiro do jogo atual



// Em seguida, solicite ao jogador que repita a sequência.

for (byte currentMove = 0 ; currentMove < gameRound ; currentMove++)

{

  byte choice = wait_for_button(); // Veja o botão que o usuário pressiona



  if (choice == 0) return false; // Se a espera expirar, o jogador perde



  if (choice != gameBoard[currentMove]) return false; // Se a escolha estiver incorreta, o jogador perde

}



delay(1000); // O jogador estava correto, espera antes de jogar

}

return true; // O jogador cumpriu todas as rodadas para ganhar!

}

// Jogue o modo de batalha especial de 2 jogadores

// Um jogador começa pressionando um botão e entregando ao outro jogador

// Esse jogador repete o botão e adiciona um, depois passa de volta.

// Esta função retorna quando alguém perde

boolean play_battle(void)

{

gameRound = 0; // Redefinir o quadro do jogo de volta para um quadro

while (1) // Loop até alguém falhar

{

byte newButton = wait_for_button(); // Aguarde até que o usuário insira o próximo passo

gameBoard[gameRound++] = newButton; // Adicionar este novo botão ao array do jogo



// Em seguida, solicite ao jogador que repita a sequência.

for (byte currentMove = 0 ; currentMove < gameRound ; currentMove++)

{

  byte choice = wait_for_button();



  if (choice == 0) return false; // Se a espera expirar, o jogador perde.



  if (choice != gameBoard[currentMove]) return false; // Se a escolha estiver incorreta, o jogador perde.

}



delay(100); // Dê ao usuário 100ms extras para entregar o jogo ao outro jogador

}

return true; // Nós nunca devemos chegar aqui

}

// Reproduz o conteúdo atual dos movimentos do jogo

void playMoves(void)

{

for (byte currentMove = 0 ; currentMove < gameRound ; currentMove++)

{

toner(gameBoard[currentMove], duracao);



// Aguarde algum tempo entre a reprodução do botão

 // Encurtar isso para tornar o jogo mais difícil

delay(150); // 150 funciona bem. 75 fica rápido.

}

}

// Adiciona um novo botão aleatório à sequência do jogo

void add_to_moves(void)

{

byte newButton = random(0, 4); //min (incluido), max (excluido)

// Temos que converter esse número, 0 até 3, para CHOICEs

if(newButton == 0) newButton = CHOICE_RED;

else if(newButton == 1) newButton = CHOICE_GREEN;

else if(newButton == 2) newButton = CHOICE_BLUE;

else if(newButton == 3) newButton = CHOICE_YELLOW;

gameBoard[gameRound++] = newButton; // Adicionar este novo botão ao array do jogo

}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

// As seguintes funções controlam o hardware

// ilumina um determinado LEDs

// Passar em um byte composto de CHOICE_RED, CHOICE_YELLOW, etc

void setLEDs(byte leds)

{

if ((leds & CHOICE_RED) != 0)

digitalWrite(LED_RED, HIGH);

else

digitalWrite(LED_RED, LOW);

if ((leds & CHOICE_GREEN) != 0)

digitalWrite(LED_GREEN, HIGH);

else

digitalWrite(LED_GREEN, LOW);

if ((leds & CHOICE_BLUE) != 0)

digitalWrite(LED_BLUE, HIGH);

else

digitalWrite(LED_BLUE, LOW);

if ((leds & CHOICE_YELLOW) != 0)

digitalWrite(LED_YELLOW, HIGH);

else

digitalWrite(LED_YELLOW, LOW);

}

// Aguarde até que um botão seja pressionado.

// Retorna uma das cores do LED (LED_RED, etc.) se for bem-sucedida, 0 se expirar

byte wait_for_button(void)

{

long startTime = millis(); // Lembre-se da hora em que começamos o loop

while ( (millis() - startTime) < intervalo)//ENTRY_TIME_LIMIT) // Faz um loop até que passe muito tempo

{

byte button = checkButton();



if (button != CHOICE_NONE)

{ 

  toner(button, duracao); // Reproduzir o botão que o usuário acabou de pressionar



  while(checkButton() != CHOICE_NONE) ;  // Agora vamos esperar que o usuário libere o botão



  delay(10); // Isso ajuda com toques duplos acidentais



  return button;

}

}

return CHOICE_NONE; // Se chegarmos aqui, expiramos!

}

// Retorna um bit ‘1’ na posição correspondente a CHOICE_RED, CHOICE_GREEN, etc.

byte checkButton(void)

{

if (digitalRead(BUTTON_RED) == 0) return(CHOICE_RED);

else if (digitalRead(BUTTON_GREEN) == 0) return(CHOICE_GREEN);

else if (digitalRead(BUTTON_BLUE) == 0) return(CHOICE_BLUE);

else if (digitalRead(BUTTON_YELLOW) == 0) return(CHOICE_YELLOW);

return(CHOICE_NONE); // Se nenhum botão for pressionado, não retorne nenhum

}

// Acenda um LED e toque o tom

// Vermelho, superior esquerdo: 440Hz - 2.272ms - 1.136ms de pulso

// Verde, superior direito: 880Hz - 1.136ms - pulso de 0.568ms

// Azul, inferior esquerdo: pulso de 587.33Hz - 1.702ms - 0.851ms

// Amarelo, inferior direito: 784Hz - 1,276ms - pulso de 0,638ms

void toner(byte which, int buzz_length_ms)

{

setLEDs(which); // Ligue um dado LED

// Reproduz o som associado ao LED fornecido

switch(which)

{

case CHOICE_RED:

buzz_sound(buzz_length_ms, 1136); 

break;

case CHOICE_GREEN:

buzz_sound(buzz_length_ms, 568); 

break;

case CHOICE_BLUE:

buzz_sound(buzz_length_ms, 851); 

break;

case CHOICE_YELLOW:

buzz_sound(buzz_length_ms, 638); 

break;

}

setLEDs(CHOICE_OFF); // Desligue todos os LEDs

}

// Alterna o buzzer a cada buzz_delay_us, por uma duração de buzz_length_ms.

void buzz_sound(int buzz_length_ms, int buzz_delay_us)

{

// Converter tempo total de reprodução de milissegundos para microssegundos

long buzz_length_us = buzz_length_ms * (long)1000;

// Faz um loop até que o tempo restante de reprodução seja menor que um único buzz_delay_us

while (buzz_length_us > (buzz_delay_us * 2))

{

buzz_length_us -= buzz_delay_us * 2; // Diminui o tempo de jogo restante



// Alterna a campainha em várias velocidades

digitalWrite(BUZZER1, LOW);

digitalWrite(BUZZER2, HIGH);

delayMicroseconds(buzz_delay_us);



digitalWrite(BUZZER1, HIGH);

digitalWrite(BUZZER2, LOW);

delayMicroseconds(buzz_delay_us);

}

}

// Reproduzir o som e as luzes do vencedor

void play_winner(void)

{

setLEDs(CHOICE_GREEN | CHOICE_BLUE);

winner_sound();

setLEDs(CHOICE_RED | CHOICE_YELLOW);

winner_sound();

setLEDs(CHOICE_GREEN | CHOICE_BLUE);

winner_sound();

setLEDs(CHOICE_RED | CHOICE_YELLOW);

winner_sound();

}

// Som vencedor

// Este é apenas um som (chato) único que criamos, não há mágica nisso

void winner_sound(void)

{

// Alterna a campainha em várias velocidades

for (byte x = 250 ; x > 70 ; x–)

{

for (byte y = 0 ; y < 3 ; y++)

{

  digitalWrite(BUZZER2, HIGH);

  digitalWrite(BUZZER1, LOW);

  delayMicroseconds(x);



  digitalWrite(BUZZER2, LOW);

  digitalWrite(BUZZER1, HIGH);

  delayMicroseconds(x);

}

}

}

// Jogue o som perdedor / luzes

void play_loser(void)

{

setLEDs(CHOICE_RED | CHOICE_GREEN);

buzz_sound(255, 1500);

setLEDs(CHOICE_BLUE | CHOICE_YELLOW);

buzz_sound(255, 1500);

setLEDs(CHOICE_RED | CHOICE_GREEN);

buzz_sound(255, 1500);

setLEDs(CHOICE_BLUE | CHOICE_YELLOW);

buzz_sound(255, 1500);

}

// Mostra uma tela de “modo de atração” enquanto aguarda o usuário pressionar o botão.

void attractMode(void)

{

while(1)

{

setLEDs(CHOICE_RED);

delay(100);

if (checkButton() != CHOICE_NONE) return;



setLEDs(CHOICE_BLUE);

delay(100);

if (checkButton() != CHOICE_NONE) return;



setLEDs(CHOICE_GREEN);

delay(100);

if (checkButton() != CHOICE_NONE) return;



setLEDs(CHOICE_YELLOW);

delay(100);

if (checkButton() != CHOICE_NONE) return;

}

}

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

// As seguintes funções estão relacionadas apenas ao Easter Egg de Beegees

// Notas na melodia. Cada nota é sobre uma nota 1/8, “0” são descansos.

int melody = {

NOTE_G4, NOTE_A4, 0, NOTE_C5, 0, 0, NOTE_G4, 0, 0, 0,

NOTE_E4, 0, NOTE_D4, NOTE_E4, NOTE_G4, 0,

NOTE_D4, NOTE_E4, 0, NOTE_G4, 0, 0,

NOTE_D4, 0, NOTE_E4, 0, NOTE_G4, 0, NOTE_A4, 0, NOTE_C5, 0};

int noteDuration = 115; // Isso essencialmente define o ritmo, 115 é quase certo para um groove disco :slight_smile:

int LEDnumber = 0; // Mantém o controle de qual LED estamos ligados durante o ciclo de beegees

// Não faça nada além de tocar beegees ruins

// Esta função é ativada quando o usuário segura o botão inferior direito durante a energização

void play_beegees()

{

// Ligue o LED inferior direito (amarelo)

setLEDs(CHOICE_YELLOW);

toner(CHOICE_YELLOW, 150);

setLEDs(CHOICE_RED | CHOICE_GREEN | CHOICE_BLUE); // Ligue os outros LEDs até você soltar o botão

while(checkButton() != CHOICE_NONE) ; // Aguarde até que o usuário pare de pressionar o botão

setLEDs(CHOICE_NONE); // Desligue os LEDs

delay(1000); // Espere um segundo antes de tocar música

digitalWrite(BUZZER1, LOW); // configure o lado “BUZZER1” da campainha para ficar baixo, enquanto tocamos o tom no outro pino.

while(checkButton() == CHOICE_NONE) // Reproduzir música até você pressionar um botão

{

// iterar sobre as notas da melodia:

for (int thisNote = 0; thisNote < 32; thisNote++) {

  changeLED();

  tone(BUZZER2, melody[thisNote],noteDuration);

    // para distinguir as notas, defina um tempo mínimo entre elas.

   // a duração da nota + 30% parece funcionar bem:

  int pauseBetweenNotes = noteDuration * 1.30;

  delay(pauseBetweenNotes);

  // pare o tom tocando:

  noTone(BUZZER2);

}

}

}

// Cada vez que esta função é chamada, a placa se move para o próximo LED

void changeLED(void)

{

setLEDs(1 << LEDnumber); // Mude o LED

LEDnumber++; // Ir para o próximo LED

if(LEDnumber > 3) LEDnumber = 0; // Enrole o balcão, se necessário

}