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.

Exibições: 2820

Anexos

Responder esta

Respostas a este tópico

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.

Desenho das saídas:

e  do controle:



e  o sketch;

/* 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

Cara vc é rapido, rsrsrs, tava aqui tentando arruma e vc ja mudou tudo, rsrsrs.

Posso dizer sim, mas nao aqui, mandei um pedido de amizade.

Obrigado.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço