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
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).

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();
}
}
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).

Arwenz

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

Go Up
 

Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Note: this post will not display until it's been approved by a moderator.
Name:
Email:

shortcuts: alt+s submit/post or alt+p preview