Go Down

Topic: Botão - Arduino (Read 1 time) previous topic - next topic

Arwenz

Olá  :)
Estou a aprender a usar o Arduino (eu sei que é muito raro para uma rapariga :P) e tenho um dúvida...
Estou a usar um botão que faz tocar uma música. No setup escrevi isto:
  pinMode(7, INPUT);
  digitalWrite(7, HIGH);
Depois fiz um:  if(digitalRead(7)==1) - a música toca.
O botão funciona na perfeição, mas o problema é que tenho de estar com o dedo pressionado para que o digitalRead continue a ser igual a 1 e a música continue a tocar. Gostaria de arranjar uma forma de, ao clicar uma vez no botão, a música começa a dar e ao clicar novamente a música pára, sem haver necessidade de pressioanar o botão.

Espero que me possam ajudar!  :D

Obrigada

bubulindo

Bem-vinda.

Não é assim tão raro. Olha um exemplo aqui: http://www.entrepreneur.com/article/225213

Quando ao teu problema.

O que tens de fazer é criar uma variável que muda de estado quando pressionas o botão. Algo assim:

Code: [Select]

unsigned char musica_on = 0;

void loop() {

if (LOW == digitalRead(7)) { //carregaste no botão
   while (LOW == digitalRead(7)); //fica aqui parado até tirares o dedo do botão
   musica_on ^= 1<<1;
}

if (musica_on) { //se musica_on estiver diferente de 0.
   toca_musica();
}
}


Assim, sempre que tiras o dedo do botão, a variável musica_on muda de estado e liga ou desliga a música.
Para veres o que são aqueles caracteres esquisitos que coloquei depois do while, dá uma olhada aqui:
http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c
This... is a hobby.

Arwenz

Olá, obrigada pelo ajuda!
Mas penso que esse código que me deste não faz exatamente o que eu pretendo...
Vou explicar melhor:
Eu tenho 2 Arduinos a comunicar um com o outro por rádios. Quando carrego no botão, ele faz um Radio.write(); para o outro arduino. Esse arduino, ao receber a mensagem põe então a tocar um música. Tu disseste ali algures "fica aqui parado até tirares o dedo do botão". Mas o que eu pretendo é carregar 1 segundo no botão (em que ele fica HIGH), deixar de o pressionar, e ele continuar a enviar os dados. Acontece que para ele se manter HIGH eu tenho de estar sempre a pressioná-lo. Suponhamos que a música tem 10 segundos. Para ela tocar eu não quero estar os 10 segundos a pressionar o botão.
Penso que me fiz entender, e secalhar até foi isso que me quiseste mostrar, mas eu não entendi  :~

Obrigada mais uma vez  :D

bubulindo

Com o código que escrevi não precisas de ficar 10 segundos... Mas em vez da música começar mal tocas no botão, começa quando soltas o botão. Não precisas de carregar no botão durante um segundo... basta um toque instantâneo.
É apenas porque torna o código mais simples.

Senão seria algo assim:

Code: [Select]

unsigned char musica_on = 0;
unsigned char flanco = 0;

void loop() {

if (LOW == digitalRead(7) && flanco == 0) { //carregaste no botão
   flanco = 1; //faz isto uma vez.
   musica_on ^= 1<<1;
}

if (HIGH == digitalRead(7)) {
   flanco = 0; //botão foi solto, volta a activar a detecção de flanco.
}

if (musica_on) { //se musica_on estiver diferente de 0.
   toca_musica();
}
}
This... is a hobby.

Arwenz

Funcionou!! :D
Problema resolvido, muito obrigada  :)

Go Up