Botão - Arduino

Olá :slight_smile:
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! :smiley:

Obrigada

Bem-vinda.

Não é assim tão raro. Olha um exemplo aqui: Entrepreneur of 2012: Limor Fried | Entrepreneur

Quando ao teu problema.

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

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:

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

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:

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

Funcionou!! :smiley:
Problema resolvido, muito obrigada :slight_smile: