Pages: [1]   Go Down
Author Topic: Botão - Arduino  (Read 1068 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá  smiley
Estou a aprender a usar o Arduino (eu sei que é muito raro para uma rapariga smiley-razz) 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!  smiley-grin

Obrigada
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
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: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-confuse

Obrigada mais uma vez  smiley-grin
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3108
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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();
}
}
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: 6
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Funcionou!! smiley-grin
Problema resolvido, muito obrigada  smiley
Logged

Pages: [1]   Go Up
Jump to: