Pages: [1]   Go Down
Author Topic: Como fazer com que o som pare ao soltar o botão?  (Read 1648 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá pessoal. Bom, eu criei um código que toca o tema do Mario no Arduino. Na verdade o meu código só dá "play" e altera os leds de verde para quando não foi pressionado o botão e a música não está tocando e vermelho para quando o botão foi pressionado e a música está tocando. A melodia, a pausa das notas e tals, eu copiei de um site.
A minha dúvida de noob é a seguinte, eu queria saber como eu posso fazer para que quando eu soltar o botão, a música pare de tocar.

Seria tipo "enquanto o botão estiver pressionado, toca. Quando o botão for solto, para". Eu sei que existe a função while, mas já tentei ela e várias outras. Até gambiarra com o if eu tentei.

Bom, como eu disse, sou noob, estou aprendendo ainda. Se alguma alma caridosa quiser me ajudar.


PS:

1- Botão é o simples, de 4 pernas, duas de cada lado.

2 - O som sai pelo piezo.


O código é este:

Code:
int ledred = 10; 
int ledgreen = 9;
int som = 11;
int botao = 8;   
int botaoestado = 0; 

//copiado
int melodia[] = {660,660,660,510,660,770,380,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,500,500,500,580,660,500,430,380,500,500,500,500,580,660,870,760,500,500,500,500,580,660,500,430,380,660,660,660,510,660,770,380};
int duracaodasnotas[] = {100,100,100,100,100,100,100,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,60,80,60,80,80,80,80,80,80,60,80,60,80,80,80,80,80,60,80,60,80,80,80,80,80,80,100,100,100,100,100,100,100};
//fim da cópia

void setup(){
  pinMode(ledred, OUTPUT); 
  pinMode(ledgreen, OUTPUT);
  pinMode(som, OUTPUT);
  pinMode(botao, INPUT);
}

void loop(){
  botaoestado = digitalRead(botao);
  if(botaoestado == HIGH){   
 
    digitalWrite(ledred, HIGH);
    digitalWrite(ledgreen, LOW);
    //copiado
    for (int nota = 0; nota < 156; nota++) {
              int duracaodanota = duracaodasnotas[nota];
              tone(som, melodia[nota],duracaodanota);
              int pausadepoisdasnotas[] ={150,300,300,100,300,550,575,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,150,300,350,150,350,150,300,150,600,150,300,350,150,150,550,325,600,150,300,350,150,350,150,300,150,600,150,300,300,100,300,550,575};
              delay(pausadepoisdasnotas[nota]);}
              //fim da cópia
  }else{
    digitalWrite(10, 0);
    digitalWrite(9, 1);   
  }
}
   


Abraços.
Logged

'round the world...
Online Online
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:


while (botao_pressionado == TRUE) {
    vira_o_disco();
    e_toca_o_mesmo();
    }

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:


while (botao_pressionado == TRUE) {
    vira_o_disco();
    e_toca_o_mesmo();
    }


Então, eu tentei várias vezes o while. Teria como você explicar melhor esse código que você postou, se possível? Abraços.
Logged

'round the world...
Online Online
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
int ledred = 10; 
int ledgreen = 9;
int som = 11;
int botao = 8;   
int botaoestado = 0; 

//copiado
const int melodia[] = {660,660,660,510,660,770,380,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,500,500,500,580,660,500,430,380,500,500,500,500,580,660,870,760,500,500,500,500,580,660,500,430,380,660,660,660,510,660,770,380};
const int duracaodasnotas[] = {100,100,100,100,100,100,100,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,60,80,60,80,80,80,80,80,80,60,80,60,80,80,80,80,80,60,80,60,80,80,80,80,80,80,100,100,100,100,100,100,100};
//fim da cópia

void setup(){
  pinMode(ledred, OUTPUT); 
  pinMode(ledgreen, OUTPUT);
  pinMode(som, OUTPUT);
  pinMode(botao, INPUT);
}

void loop(){
  botaoestado = digitalRead(botao);
  while(botaoestado == HIGH){ //AQUI... assim ele toca sempre um ciclo de música completo enquanto o botão estiver pressionado.   
 
    digitalWrite(ledred, HIGH);
    digitalWrite(ledgreen, LOW);
    //copiado
    for (int nota = 0; nota < 156; nota++) {  //se colocares o while aqui, ele só toca mesmo enquanto o botão estiver pressionado...
              int duracaodanota = duracaodasnotas[nota];
              tone(som, melodia[nota],duracaodanota);
              int pausadepoisdasnotas[] ={150,300,300,100,300,550,575,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,150,300,350,150,350,150,300,150,600,150,300,350,150,150,550,325,600,150,300,350,150,350,150,300,150,600,150,300,300,100,300,550,575};
              delay(pausadepoisdasnotas[nota]);}
              //fim da cópia
  }else{
    digitalWrite(10, 0);
    digitalWrite(9, 1);   
  }
}

Vê as notas no código.

Atenta que provavelmente estás a usar memória a mais com esses vectores. Tenta passar isso para código com o const como fiz nos dois primeiros vectores
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Jr. Member
**
Karma: 0
Posts: 51
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tente este

Code:
int ledred = 10; 
int ledgreen = 9;
int som = 11;
int botao = 8;   
int botaoestado = 0; 

//copiado
int melodia[] = {660,660,660,510,660,770,380,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,510,380,320,440,480,450,430,380,660,760,860,700,760,660,520,580,480,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,760,720,680,620,650,380,430,500,430,500,570,500,760,720,680,620,650,1020,1020,1020,380,500,760,720,680,620,650,380,430,500,430,500,570,585,550,500,380,500,500,500,500,500,500,500,580,660,500,430,380,500,500,500,500,580,660,870,760,500,500,500,500,580,660,500,430,380,660,660,660,510,660,770,380};
int duracaodasnotas[] = {100,100,100,100,100,100,100,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,80,100,100,100,80,50,100,80,50,80,80,80,80,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,150,200,80,80,80,100,100,100,100,100,150,150,100,100,100,100,100,100,100,100,100,100,100,100,100,60,80,60,80,80,80,80,80,80,60,80,60,80,80,80,80,80,60,80,60,80,80,80,80,80,80,100,100,100,100,100,100,100};
//fim da cópia

void setup(){
  pinMode(ledred, OUTPUT); 
  pinMode(ledgreen, OUTPUT);
  pinMode(som, OUTPUT);
  pinMode(botao, INPUT);
}

void loop(){
  botaoestado = digitalRead(botao);
  if(botaoestado == HIGH){   
 
    digitalWrite(ledred, HIGH);
    digitalWrite(ledgreen, LOW);
    //copiado
    for (int nota = 0; nota < 156; nota++) {
              int duracaodanota = duracaodasnotas[nota];
              tone(som, melodia[nota],duracaodanota);
              int pausadepoisdasnotas[] ={150,300,300,100,300,550,575,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,450,400,500,300,330,150,300,200,200,150,300,150,350,300,150,150,500,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,300,100,150,150,300,300,150,150,300,150,100,220,300,100,150,150,300,300,300,150,300,300,300,100,150,150,300,300,150,150,300,150,100,420,450,420,360,300,300,150,300,150,300,350,150,350,150,300,150,600,150,300,350,150,150,550,325,600,150,300,350,150,350,150,300,150,600,150,300,300,100,300,550,575};
              delay(pausadepoisdasnotas[nota]);
              if(digitalRead(botaoestado) == LOW){
                 noTone(som);
                 break;
              }
     }
              //fim da cópia

  }else{
    digitalWrite(ledred, 0);
    digitalWrite(ledgreen, 1);   
  }
}
   

No final de cada toque, ele vai verificar se o botão está LOW. Se estiver, ele vai "desligar" o som (apesar que este noTone não é muito necessário porque seu tone possui 3 argumentos) e vai fazer o break. O break faz com que ele saia do enlace "for".
Estou no trabalho e não testei. teste lá e veja se funciona. Deixe o feedback aqui.

PS.: Acho que variável pausadepoisdasnotas[] poderia ser considerada uma variável global. Toda vez que ele faz um "turno" do "for" esta variável gigantesca está sendo declarada, dando muito trabalho para o coitado do arduino. Ela realmente precisa ser declarada dentro do enlace for, e não lá em cima?

Abraços
Logged

'round the world...
Online Online
Faraday Member
**
Karma: 42
Posts: 3289
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

PS.: Acho que variável pausadepoisdasnotas[] poderia ser considerada uma variável global. Toda vez que ele faz um "turno" do "for" esta variável gigantesca está sendo declarada, dando muito trabalho para o coitado do arduino. Ela realmente precisa ser declarada dentro do enlace for, e não lá em cima?

Todas elas precisam é de ser declaradas como const... como está agora está a desperdiçar memória do Arduino.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 23
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Opa, desculpa a demora para responder.

Então, não deu certo. Pois ou ele tocava sem parar ou então tocava uma coisa estranha heheheh. Mas mesmo tocando uma coisa estranha, ele não parava quando eu soltava o botão de jeito nenhum.

Logged

Pages: [1]   Go Up
Jump to: