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...
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
}