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