Olá a todos! Bom, sou iniciante em programação e pretendo desenvolver um programa onde, com um botão eu possa controlar vários (+ ou - 10) Leds independentemente. seria assim:

aciono um botão e um led se acende por 1min., aciono novamente o botão, outro led se acende por 1 min. também, não interferindo no tempo do led anterior e quando chegasse no último led começaria tudo novamente. Só que tem um detalhe, se o próximo led estiver aceso soma-se mais 1 min. no tempo restante. Já pesquisei muito na net, tentei combinar uns códigos mas sempre dá erro. Alguém pode me ajudar? Desde já agradeço!

Exibições: 3241

As respostas para este tópico estão encerradas.

Respostas a este tópico

E o Switch (botão) tá ligado como?

Eu liguei assim;

Pino 2 em um lado do Switch e o outro lado do Switch GND,

Rui

Mauricio, fiz um filminho.

veja.

http://labdegaragem.com/video/um-bot-o-varios-leds

Lembre-se do problema de bounce (ruido eletrico no botao) que pode fazer acender varios Leds ao mesmo tempo.

 Es ruido no filme é um ventilador aqui do meu lado. kkkk

Rui

Mauricio, esta versão acaba com o bounce.

Vou entender a nova logica que voce diz, e depois te conto.

Aqui em Fortaleza está um calorão.

Rui

http://pastebin.com/X9uVHgqu

Mauricio, o codigo eu tomei como base esta fraze:

"Só que tem um detalhe, se o próximo led estiver aceso soma-se mais 1 min. no tempo restante"

Pode descreve-la de outra forma?

Rui

Olá,

Tinha uns erros de "datilografia", kkkk

Segue o código corrigido.

// Liga led com tempos variados
// para uso educativo
// Esta versão utiliza tecnica multitarefa cuidando de cada detalhe a cada 10 milisegundos
// Não considerei a perda de processamento em cada loop pois considerei despresivel
// Eiju 20/05/2015

int botao = 2; // Botao tem que ser no pino 2
int led[] = {4,5,6,7,8,9,10,11,12,13}; // Array definindo os pinos dos 10 leds
int tempo[] = {0,0,0,0,0,0,0,0,0,0}; // Array com o tempo restante de cada led
// cada unidade de tempo corresponde a 10 milisegundos
int ledAtual = 0; // Led selecionado
int contadorBotaoAcionado = 0; // Contador para eliminar bounce

// ------------------------------- funcao principal Setup -------------------------------
void setup() {
pinMode(botao,INPUT); // botao entrada
digitalWrite(botao,HIGH); // Pull-up
for (unsigned j = 0; j < 10; j++) { // Repetir para cada led
pinMode(led[j],OUTPUT); // Definir pino dos leds como saida
}
}
// -------------------------------- funcao testaBotao -------------------------------
void testaBotao() { // Funcao de tratamento do botao
if(digitalRead(botao) == 1) { // Botao esta acionado
contadorBotaoAcionado++; // Incrementa o contador do botao acionado para evitar bounce
if(contadorBotaoAcionado == 3) { // Faz 30 milisegundos desde que o botao foi acionado e continuou
// acionado pois cada loop tem delay de 10 milisegundos
// se continuar a dar bounce, aumentar este valor
adicionaSegundo(); // Adiciona 1 segundo no LED seguinte
}
} else { // Botao nao esta acionado
contadorBotaoAcionado = 0; // Mantem o contador zerado
}
}
// -------------------------------- funcao adicionaSegundo -------------------------------
void adicionaSegundo() { // Funcao de adicao de 1 segundo ao proximo led
ledAtual++; // Incrementa led a ser tratado
if(ledAtual > 9) ledAtual = 0; // Certifica que o led 0 seja o proximo depois do led 9
tempo[ledAtual]=tempo[ledAtual]+100;// Adiciona 100 * 10 milisegundos ao led atual
}
// -------------------------------- funcao principal loop --------------------------------
void loop() {
testaBotao(); // Tratamento do botao
for(unsigned k = 0; k < 10; k++) { // Repetir para cada led
tempo[k]--; // Decrementa 10 milisegundos do led atual
if(tempo[k] < 0) tempo[k] = 0; // Se ficar negativo, zera
if(tempo[k] > 0) { // Se tiver tempo sobrando
digitalWrite(led[k], HIGH); // Acende o led
} else { // Se o tempo estiver zerado
digitalWrite(led[k], LOW); // Apaga o led
}
}
delay(10); // Espera os 10 milisegundos de cada loop
}

Valeu Mauricio,

obrigado pela resposta, é somente curiosidade mesmo, saudades de uma quermesse.... eita meus 20 anos.. rsrsrs

Abs.

Oi Mauricio, 

Entendi, vou modificar meu cod, outra coisa não existe a sintax  "int long", somente long.

Rui

Bom tarde, sou novo no fórum e no uso do arduino.

Eu trabalho como restaurador de obra de arte, e minha formação é em artes com especialização em restauro de elementos arquitetônico.

Fiz uso desse código para criar um mini velário eletrônico, onde a cada moeda acende um led, o código está todo feito e só mudei o botão por uma chave feita por dois leds IR. Construi  um protótipo e até agora está tudo funcionando perfeitamente (não verifiquei a questão dos tempos dos leds e acréscimos de tempo propostos pelo Mauricio no projeto).

Minha dúvida é:

É possível implementar mais leds?  gostaria de por  30 leds, se usar um CI 74HC595 ainda sim é possível aumentar as portas e utilizar o arduíno Uno ou o melhor seria trocar o arduíno para o mega?

Fiz o projeto montando o arduíno stand alone para economizar espaço, minha preferencia é pelo Uno, mas entendo se houver a inviabilidade ou mesmo uma limitação para alguém aprendendo como eu.

De qualquer forma qualquer orientação sua eu agradeço, e agradeço muito pelo código acima porque funcionou perfeitamente.

Mauricio,

Uma pergunta, tem algum proposito pratico de implementação, ou didático, esse projeto, é simples curiosidade minha mesmo apenas.

Abs.

Um conselho:

1 - Não utilizar a função delay.

2 - Crie 10 variáveis int como contadora de tempo, sendo uma para cada led.

3 - Faça uma interrupção de um timer a cada 10ms.

4 - Utilizar a interrupção do timer para decrementar as variáveis contadoras até zero. 1min = 60s, 60/10ms = 6000.

5 - Para ligar a variável de tempo de cada led, basta testar o estado do pino ligado a este led.

6 - Quando a variável do led especifíco chegar a zero, este desliga o led.

7 - Utilize esta interrupção para ler o estado do botão também.

Esta é a minha sugestão.

Hehehehe. Bom que deu certo, agora com o vídeo deu pra entender melhor seu objetivo,

Mauricio, se considerar que esta solucionado seu tópico, faça um favor a todos, antes do titulo atual do tópico, coloque a palavra RESOLVIDO, assim ajuda a outros que podem buscar por cases solucionados, servindo de base de dados para pesquisa, afinal sempre haverá outra quermesse :-)

Abs.

Realizei um projeto usando os códigos  estou publicando esse link do vídeo. Gostaria de agradecer a todos pelo excelente material aqui publicado.

https://www.youtube.com/watch?v=lTJAYDjQwsg

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço