Delays diferentes simultaneamente

Olá a todos, sou iniciante em Arduino, e estou querendo fazer um sistema para ficar piscando 4 leds simultaneamente, porem, cada 1 deles com um delay diferente, por exemplo, ao pressionar um botão, todos os leds acendem, e começam a piscar, porem, 1 com delay de 300ms, 600ms, 900ms e 1200ms, e se possível, gostaria de colocar um potenciometro para cada led, para alterar o tempo de cada, mas não estou conseguindo fazer com que cada led tenha seu delay diferente, e que possa ser modificado. Gostaria da ajuda dos amigos que ja trabalham a mais tempo com este sistema.

Hoje estou inspirado e vou dar uma dica que utilizo para criar o que pretendes (embora o faca em PLCs).

O que deves por comecar a fazer é estudar timer interrupts. São fáceis de colocar a funcionar no Arduino, tens até esta libraria (Arduino Playground - Timer1 ou este site http://popdevelop.com/2010/04/mastering-timer-interrupts-on-the-arduino/).
Como queres múltiplos de 300 ms, aconselho-te a criares uma interupcão de 300 em 300 ms.

Depois de teres isso a funcionar, crias uma variável global de tipo unsigned char (ou byte) e dentro da funcão de interrupcão do Arduino fazes algo como isto:

byte contador; 

ISR(Timer1) {   //interrupcão do timer1
contador ++;
}

setup()  {
contador = 0; 
//Serial
//Setup counters
//definir pinos de entrada e saída. 
}

loop(){
//imaginemos que vais colocar os LEDs no porto C, ou seja, 23,24,25,26. 
//isto é um exemplo simples. Deves depois estudar máscaras de bits para apenas escreveres nos bits que pretendes. Mas esta é a maneira mais simples. 
PORTC = contador; 
}

Quando o código comecar a correr a variável contador vai ter estes valores:

1 - 00000001
2 - 00000010
3 - 00000011
4 - 00000100
5 - 00000101
6 - 00000110
7 - 00000111
8 - 00001000

and so on, and so on...

Como vês dentro da variável os bits vão alterando consoante a temporizacão que tens... :slight_smile:

Se pretenderes mexer em bits diferentes, podes fazer assim:

//defines estes bits nos pinos de saída que pretenderes
saida_300 = (contador & 0x1);//usei notacão hexadecimal, mas podes usar binária  0b00000001
saida_600 = (contador & 0x2);//0b00000010
saida_900 = (contador & 0x4);//0b00000100
saida_1200 =(contador & 0x8); //0b00001000

Percebido?

Edit:

Se quiseres usar a libraria do Timer 1, fica assim no setup()

#include "Timer1" //ou algo do género
Timer1 timedInterrupt;

incrementaContador() {
contador++;
}

setup(){
timedInterrupt.attachInterrupt(incrementaContador, 300000UL);//são microssegundos 300000 us = 300ms
}