Arduino Mega + 2 push buttons + buzzer.

Olá pessoal.
Estou tentando desenvolver com os seguintes materiais :um Arduino mega, 2 push button e um buzzer. A seguinte aplicação ao pressionar e soltar o primeiro push button o buzzer irá tocar a nota Dó até que o segundo push button seja pressionado e solto para desligar o buzzer. Ai o sistema fica aguardando apertar novamente o primeiro push button para começar novamente o ciclo.
Observação: Ao pressionar e soltar o primeiro push a nota dó deve ficar pulsando, apita o dó da um intervalo apita novamente até que o segundo push seja pressionado e solto.

Tentei varias formas nenhuma tive sucesso. Meu colega me falou para utilizar interrupção que ficaria melhor, porém este teste que estou fazendo para 2 push buttons e um buzzer, será replicado varias vezes na mesma aplicação, no total serão 20 push buttons realizando o mesmo trabalho dos dois que descrevi acima por isso estou utilizando o Arduino mega e o mesmo só tem 6 entradas de interrupção o que não é o suficiente também devido ao grande numero de push buttons que vou utilizar.

Outro problema que estou tendo é que nem todas as vezes o micro está identificando que o primeiro push foi pressionado e solto.

O código que cheguei mais próximo foi o seguinte eu pressiono e solto o primeiro push button ele começa a apitar da forma que eu quero porém ele não está saindo desse loop. O código feito foi o seguinte:

// codigo dos botoes com buzzer 2 push. Usando  while
const int buzzer=10;
const int botao1=22;
const int botao2=23;
int statusbotao=0;
int ver1=0;
int ver2=0;


void setup(){
  Serial.begin(9600);
  pinMode(buzzer,OUTPUT);
  pinMode(botao1,INPUT);
  digitalWrite(botao1,1); //ativa resistor pull up (resistor de elevação)
  //fisicamente o botão é ligado no terra e o resistor um terminal vai 
  //entre o botão e a entrada e o outro terminal é ligado no 5v.
  pinMode(botao2,INPUT);
  digitalWrite(botao2,1);
}
void loop(){

  if(((digitalRead(botao1)==LOW)&&(ver2==0))){
    delay(0.00001);
      if(digitalRead (botao1)==HIGH){
        statusbotao=1;
        ver1=1;  
    }}
       while(ver1==1){
        tone(buzzer,262,200); //DO
        delay(1000);
       
          if((statusbotao==1)&&(digitalRead(botao2)==LOW)){
            delay(0.00001);
              if(digitalRead (botao2)==HIGH){
                statusbotao=0;
                ver1=0;
              }
    }
  }
    
}

Alguém pode me ajudar? Por favor.

teste9.ino (996 Bytes)

Primeiro problema:

O delay não aceita valores com virgula flutuante… para que é que precisas dum intervalo de 0.00001 milisegundos ???
Sabes o que isso é??!?!??!!?!?

Depois para fazer o que queres, não podes usar o delay… um dos problemas é que enquanto o teu programa está a processar o delay, não está a ver se o botão foi pressionado, dando a sensação que não está a funcionar.

Tira os delays e voltamos a falar do assunto.

e como faço para pusar sem o delay? não conheço outra forma. tem outro geito?

progra:
e como faço para pusar sem o delay? não conheço outra forma. tem outro geito?

Tem, basta procurar. Por exemplo o IDE traz 2 exemplos. O “Blink” em que é usado “delay” e o “Blink Without Delay” em que, como próprio nome indica, faz o mesmo que o “Blink” mas não usa a função “delay”.
Boa Sorte!