Saudaçoes,
Gostaria q alguem me ajudasse a mudar esse circuito de Pic para Arduino, no caso só mudar a programação, esse circuito irei usar no meu trabalho ja venho a uns 6 meses tentando, sou hobista e o que sei aprendi tentando montar esse circuito.
No caso queria usar o Arduino Mini, pis vou precisar de no minimo 30 circuito.
Os leds sao só para facilitar a visao no proteus, o circuito vai trabalhar com 18v, mas essa parte depois dos leds ja esta resolvida com ULN2803.
Agradeceria muito pela ajuda.
Tags:
ola Rui,
tem umc ara que criou uma biblioteca para aumentar as saidas, de uma olhada.
http://www.efeitonerd.com.br/2012/09/ampliar-saidas-do-arduino-libr....
Obrigado por enquanto
Oi Carlos,
A coisa é bem mais simples que este programa apontado por voce fornece.
Estou estudando qual implementação é melhor CD 4017 ou 74HC595.
Estou achando melhor a solução 595, e estou testando.
Rui
Rui,
boa noite,
não esqueça depois de postar aqui posso depois desenhar para deixar na bibioteca de todos.
Abçs
Ok, Rui
Vou compila agora o programa q vc me passou.
Meus parabens pela criatividade do Natal ,muito bom, ja pensou em comercializar ou vc ja o faz?
Obrigado.
Oi Carlos,
Seguem os
desenhos e o sketch.
Não sei se tem bugs, mas não tive problema para rodar.
Testei no UNO, mas não vejo razão para não funcionar no mini.
Não tenho e numca futuquei no mega, mas, o sketch para o UNO não roda no Mega?
Boa sorte.
Rui
PS. Acho que tem um erro:
Eu testei com os LEDs diretamente no 74HC595.
Acho que o ULN2803 inverte o sinal,
e aí todos LEDs acendem e só um fica apagado.
Vou procurar um e testar.
e do controle:
/* LED sequencial
Seguencia LEDs usando o CI 74HC595
O numero de saídas do 74HC595 és definido no valor do for do 2 loop
O valor deverá ser igual número de porta -1. Não tem limite de portas a serem usadas.
Os 74HC595 devem ser encadeados ligando a saída do pino 9 à entrada do próximo
no pino 14, e os pinos rst, clock, latch, ligados em paralelo.
Rui
*/
#include <LiquidCrystal.h>
word Tempo = 50; // Variável de 2 Bytes para guardar tempo de delay
// Switchs
int SW1 = 0; // Variável para guardar informação switch de incremetar tempo de delay
int SW2 = 0; // Variável para guardar informação switch de decrementar tempo de delay
int SW3 = 0; // Variável para guardar informação switch de inici da sequência
int analogPin0 = 0; // Porta analógica para SW1
int analogPin1 = 1; // Porta analógica para SW2
int analogPin2 = 2; // Porta analógica para SW3
// 74HC595
int const clock = 0; // Conectar ao pino 11 dos 74HC595
int const latch = 1; // Conectar ao pino 12 dos 74HC595
int const data = 2; // Conectar ao pino 14 dos 74HC595
int const rst = 3; // Conectar ao pino 10 dos 74HC595
// LCD
LiquidCrystal lcd(9, 8, 7, 6, 5, 4); // Ordem dos pinos RS EN D4 D5 D6 D7
// Pino LCD 4 6 11 12 13 14
// ********************************************************************
void setup() {
lcd.begin(16, 2); // Inicializa LCD
pinMode(clock,OUTPUT); // Port D2 saída
pinMode(latch,OUTPUT); // Port D3 saída
pinMode(data,OUTPUT); // Port D4 saída
pinMode(rst,OUTPUT); // Port D5 saída
}
// ********************************************************************
void loop()
{
lcd.setCursor(0, 0); // Posiciona curso do LCD posicão 1 (0) da linha 1 (0)
lcd.print("LED Sequencial");
lcd.setCursor(0, 1); // Posiciona curso do LCD posicão 1 (0) da linha 2 (1)
lcd.print("SW 1+ 2- 3 Start");
do // Loop de teste dos switchs
{
digitalWrite(rst,LOW);
SW1 = analogRead(analogPin0); // read the input pin
SW2 = analogRead(analogPin1); // read the input pin
SW3 = analogRead(analogPin2); // read the input pin
if (SW1 <500) // verifica se o switch1 está apertado
{ // Se estiver..
lcd.setCursor(0, 1); // Posiciona curso do LCD posicão 1 (0) da linha 2 (1)
Tempo = Tempo + 50; // Incrementa variável tempo em 50
if (Tempo > 1000) Tempo = 1000; // Se variável tempo for maior que 1000, faça igual a 1000
lcd.print(" Delay de "); // Imprime no LCD
lcd.print(Tempo); // Imprime no LCD
lcd.print(" ms "); // Imprime no LCD
delay(500); // Tempo de display do tempo
}
if (SW2 <500) // verifica se o switch2 está apertado
{ // Se estiver..
lcd.setCursor(0, 1); // Posiciona curso do LCD posicão 1 (0) da linha 2 (1)
Tempo = Tempo - 50; // Decrementa variável tempo em 50
if (Tempo < 50) Tempo = 50; // Se variável tempo for menor que 50, faça igual a 50
lcd.print(" Delay de "); // Imprime no LCD
lcd.print(Tempo); // Imprime no LCD
lcd.print(" ms "); // Imprime no LCD
delay(500); // Tempo de display do tempo
}
if (SW3 <500) // verifica se o switch3 está apertado
do // Se estiver..
{
digitalWrite(rst,LOW); // rest 74HC595
digitalWrite(rst,HIGH); //
digitalWrite(latch,LOW); // transfere dados dos regs para os latchs e saídas
digitalWrite(data,HIGH); // Data bit ON acende 1o. LED
digitalWrite(clock,HIGH); // Liga clock para entra dado
digitalWrite(clock,LOW); // Desiga clock
digitalWrite(data,LOW); // Data Bit OFF
digitalWrite(latch,HIGH); // Desatica transferencia
delay(Tempo); // Tempo de LED aceso
for (int i = 0; i<15; i++) // numeros de LED a serem acendidos Preencher com o valor de LED - 1
{ // Acende os outros LEDs
digitalWrite(latch,LOW); // transfere dados dos regs para os latchs e saídas
digitalWrite(clock,HIGH); // Liga clock para entra dado
digitalWrite(clock,LOW); // Desiga clock
digitalWrite(latch,HIGH); // Desatica transferencia
delay(Tempo); // Tempo de LED aceso
}
}while(1); // End do forever 2
}while(1); // End do forever 1
} // End loop
Obrigado, Rui
Vou comprar os 595 amanha e montar, vamos ver se consigo rsrsrs
Rui, nao consegui compilar akele no hi-tech, primeira vez q usei ele, deu problema do lcd, usei 3 bilblioteca e nenhuma deu certo.
Depois posto os erros q deram.
Rui te Agradeço muitissimo pela ajuda, que Deus te ajude.
Vou montar o circuito e amanha ponho os 595.
Obrigado de novo.
Oi Carlos,
Nào tem erro não, funcionou ok com ULN2803,
ele não inverte não
Rui
Carlos,
para usar o mini, voce precisa mudar as saídas que estão de D0 até D9 para D2 até D11.
Testei e funcionou.
Aliás pode trocar no UNO tb.
Rui
Boa noite, Rui
Ainda nao montei o circuito pois nao achei o 595, sexta estou em sampa e compro na sta efigenia, tenho o UNO mas comprei um MINI do José Antonio do Nascimento vai entregar na sexta.
Bom montei no proteus e nao consegui fazer funcionar, alias ele manda os sinais certinhos só nao acende os leds, mas tudo bem, só encontrei um probleminha e o seguinte:
Ele esta em loop, e nao preciso, só preciso que execute a rotina uma vez, mudei " while(1); // End do forever 2 " para " while(0); // End do forever 2 " e funcionou ele executa uma vez, só nao apaga o ultimo led.
Outra coisa, ai acho q foi eu q nao especifiquei, queria q ficasse gravado o ultimo delay mesmo q desligasse o circuito.
Bom , vou ver se domingo esta td ok ja testado fisicamente.
Obrigado, Rui
Fique na paz de Deus.
OI Carlos, se você quer que ele execute uma vez somente,
o correto é apagar o
"do" na linha 74,
a "{" na linha 75
e o "}while(1); "na linha 95.
Como ele vai executar somente uma vez, para que apague o último LED, some 1 ao "for" da linha 86.
Qto a salvar o valor do delay, deve usar uma rotina que grava na EEPROM.
Como a minha experiencia é em PIC, nunca usei a do Arduino, mas vou ver se faço.
Boa sorte.
Carlos, segue a nova versão com:
Só roda uma vez;
Apaga o último LED ;
Grava o valor do último delay.
A versão anterior eu testei montada, mas esta eu não testei montada, pois já desmontei tudo e estou usando protboard para outra coisa.
Uma curiosidade: Onde voce vai usar isto?
Não precisa disser se for confidencial.
Boa sorte.
Rui
/* LED sequencial
Seguencia LEDs usando o CI 74HC595
O numero de saídas do 74HC595 és definido no valor do for do 2 loop
O valor deverá ser igual número de porta -1. Não tem limite de portas a serem usadas.
Os 74HC595 devem ser encadeados ligando a saída do pino 9 à entrada do próximo
no pino 14, e os pinos rst, clock, latch, ligados em paralelo.
Rui
*/
#include <LiquidCrystal.h>
#include <EEPROM.h>
word Tempo = 50; // Variável de 2 Bytes para guardar tempo de delay
// Switchs
int SW1 = 0; // Variável para guardar informação switch de incremetar tempo de delay
int SW2 = 0; // Variável para guardar informação switch de decrementar tempo de delay
int SW3 = 0; // Variável para guardar informação switch de inici da sequência
int analogPin0 = 0; // Porta analógica para SW1
int analogPin1 = 1; // Porta analógica para SW2
int analogPin2 = 2; // Porta analógica para SW3
// 74HC595
int const clock = 0; // Conectar ao pino 11 dos 74HC595
int const latch = 1; // Conectar ao pino 12 dos 74HC595
int const data = 2; // Conectar ao pino 14 dos 74HC595
int const rst = 3; // Conectar ao pino 10 dos 74HC595
// LCD
LiquidCrystal lcd(9, 8, 7, 6, 5, 4); // Ordem dos pinos RS EN D4 D5 D6 D7
// Pino LCD 4 6 11 12 13 14
// ********************************************************************
void setup() {
lcd.begin(16, 2); // Inicializa LCD
pinMode(clock,OUTPUT); // Port D2 saída
pinMode(latch,OUTPUT); // Port D3 saída
pinMode(data,OUTPUT); // Port D4 saída
pinMode(rst,OUTPUT); // Port D5 saída
}
// ********************************************************************
void loop()
{
Tempo = EEPROM.read(0);
Tempo = Tempo*2;
lcd.setCursor(0, 0); // Posiciona curso do LCD posicão 1 (0) da linha 1 (0)
lcd.print("LED Sequencial");
lcd.setCursor(0, 1); // Posiciona curso do LCD posicão 1 (0) da linha 2 (1)
lcd.print("SW 1+ 2- 3 Start");
do // Loop de teste dos switchs
{
digitalWrite(rst,LOW);
SW1 = analogRead(analogPin0); // read the input pin
SW2 = analogRead(analogPin1); // read the input pin
SW3 = analogRead(analogPin2); // read the input pin
if (SW1 <500) // verifica se o switch1 está apertado
{ // Se estiver..
lcd.setCursor(0, 1); // Posiciona curso do LCD posicão 1 (0) da linha 2 (1)
Tempo = Tempo + 50; // Incrementa variável tempo em 50
if (Tempo > 1000) Tempo = 1000; // Se variável tempo for maior que 1000, faça igual a 1000
lcd.print(" Delay de "); // Imprime no LCD
lcd.print(Tempo); // Imprime no LCD
lcd.print(" ms "); // Imprime no LCD
delay(500); // Tempo de display do tempo
EEPROM.write(0, Tempo/2);
}
if (SW2 <500) // verifica se o switch2 está apertado
{ // Se estiver..
lcd.setCursor(0, 1); // Posiciona curso do LCD posicão 1 (0) da linha 2 (1)
Tempo = Tempo - 50; // Decrementa variável tempo em 50
if (Tempo < 50) Tempo = 50; // Se variável tempo for menor que 50, faça igual a 50
lcd.print(" Delay de "); // Imprime no LCD
lcd.print(Tempo); // Imprime no LCD
lcd.print(" ms "); // Imprime no LCD
delay(500); // Tempo de display do tempo
EEPROM.write(0, Tempo/2);
}
if (SW3 <500) // verifica se o switch3 está apertado
// do // Se estiver..
// {
digitalWrite(rst,LOW); // rest 74HC595
digitalWrite(rst,HIGH); //
digitalWrite(latch,LOW); // transfere dados dos regs para os latchs e saídas
digitalWrite(data,HIGH); // Data bit ON acende 1o. LED
digitalWrite(clock,HIGH); // Liga clock para entra dado
digitalWrite(clock,LOW); // Desiga clock
digitalWrite(data,LOW); // Data Bit OFF
digitalWrite(latch,HIGH); // Desatica transferencia
delay(Tempo); // Tempo de LED aceso
for (int i = 0; i<15; i++) // numeros de LED a serem acendidos, preencher com o valor de LED
{ // Acende os outros LEDs
digitalWrite(latch,LOW); // transfere dados dos regs para os latchs e saídas
digitalWrite(clock,HIGH); // Liga clock para entra dado
digitalWrite(clock,LOW); // Desiga clock
digitalWrite(latch,HIGH); // Desatica transferencia
delay(Tempo); // Tempo de LED aceso
}
// }while(1); // End do forever 2
}while(1); // End do forever 1
} // End loop
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por