Piscar LED baseado em Variável

Pessoas, boa tarde.

Preciso de uma ajuda.. Estou iniciando agora no arduino e não consegui achar um modo de fazer o que tenho em mente. Fiz um circuito simples com um push button e dois LED, que quando aperta o push button ele acende o primeiro e depois de um tempo acende o segundo. Em paralelo ele conta quantas vezes o botão foi pressionado.

A minha dúvida agora é a seguinte, eu quero fazer que o segundo LED pisque para indicar o a quantidade de vezes que o botão foi pressionado e isso será convertido para o delay() em segundos.

Por exemplo, se pressionar 4 vezes, o segundo LED precisa piscar 4 vezes e gerar um delay de 4 segundos para uma função delay(). O meu código inicialmente está assim:


const int buttonPin = 2;
const int ledPin = 4;
const int ledazul = 3;

int contador = 0;

int buttonState = 0;

void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(ledazul, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop(){
buttonState = digitalRead(buttonPin);

if (buttonState == HIGH) {
Serial.println(contador);
contador++;
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
digitalWrite(ledazul, HIGH);
delay(250);
digitalWrite(ledazul, LOW);
} else {
// turn LED off:
}
}

Alguém tem alguma dica de como fazer isso funcionar?

Obrigado pela ajuda!!

[]'s

Uma dica é esqueceres que o delay existe. Para temporizações vai ver o exemplo blink without delay.

O código seguinte é para colocar o segundo LED a piscar consoante o número de vezes que pressionas o botão, só pisca se o botão for pressionado.
Código:

void loop(){
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {     
    Serial.println(contador);
    contador++;
    for(int i=contador;i>0;i--){
    digitalWrite(ledazul, HIGH); 
    delay(1000);//Tempo que o led esta ligado
    digitalWrite(ledazul, LOW); 
     }

Teste o código e vesse ajuda no teu problema.Não usei o delay como referiste mas penso que é a solução mais fácil.

bubulindo:
Uma dica é esqueceres que o delay existe. Para temporizações vai ver o exemplo blink without delay.

vasr:
void loop(){
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
Serial.println(contador);
contador++;
for(int i=contador;i>0;i--){
digitalWrite(ledazul, HIGH);
** delay(1000);//Tempo que o led esta ligado**
digitalWrite(ledazul, LOW);
}

Qual é a parte de "esquece que o delay existe" que não percebeste?

Vou tentar explicar te porque deves seguir o conselho do Bubulindo.

delay(1000);//Tempo que o led esta ligado

Com isto o microcontrolador fica parado sem fazer rigorosamente nada, o que é mau pois tu podes querer carregar no botão para mudares o teu delay.
Teres isto no codigo vai fazer com que por vezes tu carregues no botao e nada aconteça.Existe uma soluçao simples e podes descobri-la procurando por "Blink Without delay".
Outra coisa que deves procurar e que terá impacto no teu codigo é o "Debouncing" do botão.
Quando pressionas o botão ocorrem "saltos" rápidos provocados pela própria natureza do botão, no qual a entrada do Arduino ira contar indevidamente como um impulso, causando que por vezes quando carregas apenas uma vez no botão conte mais que uma vez.

HugoPT:
Vou tentar explicar te porque deves seguir o conselho do Bubulindo.

delay(1000);//Tempo que o led esta ligado

Com isto o microcontrolador fica parado sem fazer rigorosamente nada, o que é mau pois tu podes querer carregar no botão para mudares o teu delay.
Teres isto no codigo vai fazer com que por vezes tu carregues no botao e nada aconteça.Existe uma soluçao simples e podes descobri-la procurando por "Blink Without delay".
Outra coisa que deves procurar e que terá impacto no teu codigo é o "Debouncing" do botão.
Quando pressionas o botão ocorrem "saltos" rápidos provocados pela própria natureza do botão, no qual a entrada do Arduino ira contar indevidamente como um impulso, causando que por vezes quando carregas apenas uma vez no botão conte mais que uma vez.

+1 karma pela paciência que tens.

Obrigado colega XD

Obrigado pela explicação HugoPT, esta percebido.

Porem, caso queira utilizar o delay . Pode deixar o botão em um pino attach.

Caros,

Acho que houve uma confusão.. O que não estou conseguindo fazer é o led piscar na quantidade de vezes que eu pressiono o botão..

Por exemplo:
Pressionei 1 vez, o led pisca 1 vez
Pressionei 5 vezes, o led pisca 5 vezes

Pretendo usar isso como interface para o usuário, assim ele sabe que quando tempo terá de delay em outro pino. Nessa segunda fase, se o led piscou 5 vezes outro pino irá enviar um pulso a cada 5 segundos...

Obrigado

Porem, caso queira utilizar o delay . Pode deixar o botão em um pino attach.

???
O que é um pino attach?

Acho que houve uma confusão.. O que não estou conseguindo fazer é o led piscar na quantidade de vezes que eu pressiono o botão..[/quote
Nao o estas a conseguir porque a soluçao para o teu problema como te ja foi dito consiste em:
Remover o delay(resolves a possivel falha de o cpu estar parado no momento que alguem carrega no botao)
Usar tecnica de debounce no botao(evitar que se tu carregares uma vez apenas o arduino nao interprete como umas 3 ou 4 vezes)
Sabendo isto consegues escrever o codigo?

ViniciusTech:
Porem, caso queira utilizar o delay . Pode deixar o botão em um pino attach.

Suponho que queiras dizer configurar o pino como uma interrupcão. E ao fazer isso, não resolveste um problema, criaste outro.