Ir ao conteúdo
  • Cadastre-se

Circuito Limitador de RPM (arduino)


Posts recomendados

@aphawk ainda estou aprendendo sobre a função interrupt , agora flag e stack de memória nunca ouvi falar, ainda estou tentando fazer o código que @.if passou aqui em cima e tá dando erro atrás de erro, o negócio é estudar bem tudo isso e pelo jeito vai levar bastante tempo mas uma hora eu chego lá. 

 

 

16 minutos atrás, mlegnari disse:

Arduino não serve para o produto final, apenas para ideias, você vai ter que implementar alguns filtros.

@mlegnari Meu arduino é daquele CI de soquete, imaginei progamar acertar tudo e tendo certeza do funcionamento tirar o ATMEGA e fazer uma plaquinha pra usar ele standalone, e os filtros que você diz é para evitar interferências no funcionamento principalmente por causa da bobina de ignição, certo?

 

19 minutos atrás, mlegnari disse:

Com esse filtro ligado, você cria uma interrupção para o microcontrolador PARAR TUDO O QUE ESTA FAZENDO e contabilizar o pulso.

preciso aprender a fazer isso rsrs

 

22 minutos atrás, mlegnari disse:

O filtro RC chamado de pre ênfase vai filtrar ruídos que aparecem abaixo da tensão, ruídos que podem vir da vela de ignição etc..

Perfeito! no caso do seu esquema onde vou ligar o pino do arduino para receber o sinal é ali no circulo com onda quadrada escrito 30ms, e ali onde está a alimentação de 5v é o negativo e o positivo do hall?

Link para o post
Compartilhar em outros sites
4 horas atrás, mlegnari disse:

Com esse filtro ligado, você cria uma interrupção para o microcontrolador PARAR TUDO O QUE ESTA FAZENDO e contabilizar o pulso.

 

Se você não usar interrupção e o micro estiver fazendo outra coisa ele não vai contar o pulso, aí atrapalha demais.

 

Não precisa parar tudo, basta programar o Timer0 no modo Counter, e aplicar a saida dos optos à entrada externa de contagem; a contagem dos pulsos será feita por hardware, independente de ter interrupção ou estarem todas desabilitadas.

 

Para ter um resultado razoávelmente preciso ( lembrando sempre que o oscilador no Arduino Uno é um filtro ressonante de 16 Mhz, bem menos preciso do que um cristal de verdade... )  no processo todo, pode-se programar o Timer1 como base de tempo por interrupção, fazendo apenas o incremento das bases de tempo e sinalizando por flag. Assim o tempo será tão pequeno que não vai atrapalhar nada neste processo. Uma interrupção a cada 10 milisegundos funciona bem, o tempo de execução será bem pequeno, e pode usar essa mesma interrupção para fazer um segundo contador de , por exemplo, 25 contagens, quando atingir este numero, lê o conteúdo do Timer0 ( os pulsos que houveram em sua entrada ) , guarda em uma variável para ser usada no programa principal, zera a contagem do Timer0, e aciona um flag para o programa principal saber que pode pegar a contagem, multiplicar ela por 4 ( para ter uma média de pulos por segundo, e esse resultado será a frequência dos pulsos.... 

 

Paulo

 

 

4 horas atrás, ComandateGustavo disse:

@aphawk ainda estou aprendendo sobre a função interrupt , agora flag e stack de memória nunca ouvi falar, ainda estou tentando fazer o código que @.if passou aqui em cima e tá dando erro atrás de erro, o negócio é estudar bem tudo isso e pelo jeito vai levar bastante tempo mas uma hora eu chego lá. 

 

Não se preocupe com isso tudo... você está indo bem !

 

São poucos que tem o domínio de tudo o que falei, mas acho que quando você sabe disso tudo você consegue fazer as coisas de uma maneira mais fácil, e claro, mais precisa pois o controle de tudo é seu, e não de uma biblioteca ou comando da IDE que você está usando ( Arduino ) .

 

Quando ocorre uma interrupção, o processador tem de parar o que está fazendo, e guardar os dados de alguns registradores, a maneira mais simples de se fazer é usando um comando em Assembly chamado PUSH, que guarda o conteúdo de um registrador direto na pilha de memória ( vulgo STACK ) ..... e ao final da interrupção todos os dados que foram guardados nessa pilha tem de ser devolvidos aos registradores originais , e quem faz isso é um comando chamado POP .

 

Só para ilustrar, um Atmega328 tem 32 registradores de 8 bits, então o programador ( ou a IDE ) tem de dimensionar o STACK de maneira que tenha espaço nele no mínimo para guardar o endereço de retorno ( 2 bytes ) e os registradores que serão usados na interrupção. 

 

Não se assuste com isso agora, mas espero que chegue o dia em que você queira aprender como isso tudo funciona !

 

Eu aprendi isso lá pelos idos de 1981 , usei em várias famílias de processadores e diferentes hardwares, e ainda gosto de fazer meus projetos em linguagem Basic e Assembler, juntos, é bem legal ver isso tudo funcionando .... 

 

Paulo

 

Link para o post
Compartilhar em outros sites

@ComandateGustavo ,

 

Vou postar aqui um link do meu tutorial, eu escrevi bastante coisa para ilustrar o funcionamento do meu instrumento universal como frequencímetro. Embora eu tenha usado um Atmega1284, a teoria é exatamente a mesma para o Atmega328.

 

Espero que se divirta !

 

https://www.clubedohardware.com.br/topic/937085-projetos-com-avr-design-programação-em-basic-e-assembly/?do=findComment&comment=6213984

 

Paulo

  • Amei 1
Link para o post
Compartilhar em outros sites

@aphawk Muito interessante Paulo é um otimo tutorial sim, vou conferir, ainda preciso apreender muita coisa sobre essas funções

 

estava pensando  @mlegnari  a ideia do seu circuito é eliminar qualquer tensão negativa que possa interferir na medição, mas um opto acoplador já não faz isso também? Porque teoricamente com tensão negativa o led dentro do opto não acende então isso não deve interferir, ou estou enganado?

 

Mais uma vez @.if tinha razão, apenas por curiosidade peguei o código antigo alterei de 200 milisec para 1000 e tirei a multiplicação, dessa forma o arduino conta 1 segundo e mostra a freq no visor, programei no outro arduino para executar a função tone para servir de sinal base, a frequência dele começa em 40Hz que é a frequência minima que a função tone consegue gerar e depois foram as mesmas frequencias que espero encontrar no hall do motor em determinada RPM, montei essa nova tabela:

 

RPM                 freq base (Hz)           freq medida (Hz) 

1212                        40                             40

2000                        66                             66-67

3000                        99                             99-100

4000                        132                           131-132

5000                        165                           164-165

6000                        198                           197

 

Bem curioso só de aumentar o tempo e tirar a conta de multiplicação por 5 a margem de erro diminuiu bastante, infelizmente o ponto negativo é que vai levar  1 segundo ao invés de 200 milisec para o arduino perceber que a RPM mudou, não sei bem se vai dar certo, mas por curiosidade vou ver se consigo programar para quando chegar em 66Hz por acender um led, pode ser que 1 sec seja um tempo muito grande pra função de limitar a RPM mas creio que pode funcionar, só testando mesmo pra saber.

 

 

Link para o post
Compartilhar em outros sites

@ComandateGustavo ,

 

Sem a multiplicação por 5 a margem de erro é de 1 Hertz. Portanto, mesmo com a multiplicação , teria um erro máximo de 5 Hz. Mas seus resultados mostraram um erro de 20 Hz.

Deve ter mais alguma coisa acontecendo.

 

Paulo

Link para o post
Compartilhar em outros sites
  • Membro VIP
1 hora atrás, aphawk disse:

Deve ter mais alguma coisa acontecendo.

Por isso é que é importante conhecer, dominar e deixar o hw trabalhar pra você. Assim sendo, temporizações variáveis do programa não interferem no resultado.

 

Ao invés de medir freq = ciclos por tempo, meça período = tempo por ciclo. Isso torna a mediçao mais rápida e com mais resolução. P.ex. com esta técnica você pode medir freq bem baixa e  fracionada p.ex. 5.67Hz

  • Curtir 1
Link para o post
Compartilhar em outros sites
19 minutos atrás, .if disse:

Ao invés de medir freq = ciclos por tempo, meça período = tempo por ciclo. Isso torna a mediçao mais rápida e com mais resolução. P.ex. com esta técnica você pode medir freq bem baixa e  fracionada p.ex. 5.67Hz

 

@.if Seria algo assim?

 

https://www.google.com/amp/s/luizbitencourt.wordpress.com/2015/05/04/lendo-frequencias-e-duty-cycle-com-arduino/amp/

Link para o post
Compartilhar em outros sites

@ComandateGustavo ,

 

Sim, lembre que essa função Pulsein() só mede o tempo em que o sinal está em nível alto. Não sei se ela usa hardware para isso ou é feita por software com alguma base de tempo em delay ....

 

Em vez de usar o Pulsein(), você pode usar a Int0 programada para interromper na subida, e pegar o valor da base de tempo..

Programa um dos Timers para gerar uma base de tempo , por exemplo 50 microssegundos, numa variável tipo Word ( 16 bits) para que o incremento seja rápido.

 

Assim, basta calcular o intervalo de tempo entre duas interrupções , e terá o período completo .

Não se esqueça de levar em consideração que a contagem vira para 0 após 65535; se o tempo da segunda interrupção for menor do que o da primeira, por exemplo temos 65500 na primeira e 15 na segunda, você tem de fazer a conta 65536 - 65500 = 36 mais 15 = 51 x 50 microssegundos = 0,00255 segundos, e 1 / 0,00255 = 392 Hertz.

 

Paulo

 

Link para o post
Compartilhar em outros sites
  • Membro VIP
1 hora atrás, aphawk disse:

Pulsein() só mede o tempo em que o sinal está em nível alto. Não sei se ela usa hardware para isso ou é feita por software com alguma base de tempo em delay ....

Tampouco eu que não domino as funções mastigadas em sw arduinas. Portanto te deixo decidir sobre a utilidade daquela leitura. A intenção de quem cria tais funções é boa no sentido de universalizar pra todo ecossistema de mc que o zoológico arduíno possui. Mas no meu confortável . de vista fica dependente da confiança e sabedoria do programador as criou geralmente em baixo nível. Portanto eu (eu) prefiro fazer uma mini análise do hw do mc e fazer na unha mesmo... algo como menciona o amigo @aphawk

Link para o post
Compartilhar em outros sites
16 minutos atrás, aphawk disse:

Sim, lembre que essa função Pulsein() só mede o tempo em que o sinal está em nível alto. Não sei se ela usa hardware para isso ou é feita por software com alguma base de tempo em delay ....

até aqui eu entendi depois disso fiquei perdido rsrs vou estudar para compreender melhor.

 

Decidi usar aquele código velho para teste e parecia promissor,  ao invés de contar por 1 segundo mandei contar meio segundo e multiplicar por 2 sabia que o erro iria aumentar, mas não sabia quanto, e o erro aumentou para 3-4Hz até que está aceitável porque pelo menos assim o sistema funciona mais rapídamente, então coloquei um led com resistor de 1k2 no pino 7 e programei para quando tiver uma frequencia maior do que 120Hz ligar o led e desligar abaixo dessa frequencia, funcionou normalmente.

 

Então mudei o código para piscar o led enquanto estiver acima de 120Hz e desligar abaixo disso, e para minha surpresa quando atinge 120Hz o led começa a piscar, mas ele pisca eternamente e o arduino congela do nada... a minha duvida agora é: isso acontece porque o contador de tempo do arduino está focado em contar os pulsos do pino 2 e não consegue contar o tempo pro led piscar ou errei alguma coisa na hora de programar e está faltando alguma coisa?

 

Segue o código:

 

Citação

// --- Bibliotecas Auxiliares ---
#include <LiquidCrystal_I2C.h> //inclui biblioteca lcd
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);

// --- Mapeamento de Hardware ---
#define inFreq   2  //entrada para medir a frequência no pino digital 2
#define inbotao  4
#define outrele  7

// --- Variáveis Globais ---
const int rele=7;
long freq, counter;
int pulseCount;
boolean pulse;


// --- Configurações Iniciais ---
void setup() 
{
  
  pinMode(inFreq,INPUT);    //Configura como entrada
  pinMode(inbotao,INPUT);
  pinMode(rele, OUTPUT);
  
  lcd.init();
  lcd.setCursor(2,0);      //Posiciona cursor na coluna 3, linha 1
  
  pulse = 0x01;             //Seta variável de controle
  
} //end setup


// --- Loop Infinito ---
void loop() 
{
  
  counter = millis();      //counter recebe o valor do tempo em ms
  
  if(digitalRead(inFreq))  //Entrada de frequência em nível alto?
  {                        //Sim...
  
    if(pulse) pulseCount++;  //incrementa pulseCount se variável de controle for verdadeira
     
    pulse = 0x00;            //limpa variável de controle

  }
  else                     //Não...
  {
    pulse = 0x01;          //Seta variável de controle
  }


  if(counter%500 == 0x00)  //Passaram-se 200 ms?
  {                        //Sim...
    freq = pulseCount*2;   //Atualiza frequência (200 x 5 = 1000ms)
    lcd.setBacklight(HIGH);
    lcd.setCursor(5,1);   //Posiciona cursor na coluna 6, linha 2
    lcd.print(freq);      //Imprime valor atual da frequência
    lcd.print("Hz");      //Imprime "Hz"
        
    
    pulseCount = 0x00;     //Reinicia contador
  }
 if (freq > 120) {
 digitalWrite(rele, HIGH);

 delay(500);
 digitalWrite(rele, LOW);
 delay(500);

 }
 else
 {
  digitalWrite(rele, LOW);

}
  
} //end loop
 

 

Link para o post
Compartilhar em outros sites

O erro foi você misturar delay c/ funções de contagem de tempo

 

Não testei no compilador, mas seria algo assim

if (freq > 120) {

	if (((counter / 500) % 2) == 1) {
		digitalWrite(rele, HIGH); //liga por 500 milisgundos o led se freq maior que 120
	}
 	else
	{
		digitalWrite(rele, LOW); //desliga por 500 milisgundos o led se freq maior que 120
	}
 else
{
	digitalWrite(rele, LOW); //desliga o led se freq menor que 120
}
Link para o post
Compartilhar em outros sites
3 minutos atrás, Thiago Miotto disse:

O erro foi você misturar delay c/ funções de contagem de tempo

@Thiago Miotto não sabia que quando usa a função delay não pode usar função de contagem de tempo... Então o arduino executa uma função ou outra não tem como ter as mesmas funções no mesmo código, ou tem?

Link para o post
Compartilhar em outros sites
3 horas atrás, ComandateGustavo disse:

@Thiago Miotto não sabia que quando usa a função delay não pode usar função de contagem de tempo... Então o arduino executa uma função ou outra não tem como ter as mesmas funções no mesmo código, ou tem?

 

Essas são algumas das limitações da IDE do Arduino, mas tenho certeza que se você pesquisar vai achar uma library que implementa uma função de delay usando um dos Timers do Arduino, e nesse caso pode-se considerar que é um delay preciso feito por hardware.

 

Paulo

Link para o post
Compartilhar em outros sites
4 horas atrás, Thiago Miotto disse:

Então eu divido o tempo de execução do programa por 500 e peço quanto seria o resto dividindo por 2.

@Thiago Miotto então ao invés de usar a função delay voce usa funão MOD se o resultado for igual a 1 ele liga o led e se não for igual a 1 ele desliga o led é isso? estava lendo aqui o código e tentando apreender.

 

Para aprender também quis colocar um botão para piscar o mesmo led na mesma velocidade caso ele seja pressionado e ficou assim:

 

Citação

if (digitalRead(botao)){

   if (((counter / 500) % 2) == 1) {
    digitalWrite(rele, HIGH); //liga por 500 milisegundos o led se botão for pressionado
  }
  else
  {
    digitalWrite(rele, LOW); //desliga por 500 milisegundos o led se botão estiver pressionado
  }
}
 else
{
  digitalWrite(rele, LOW); //desliga o led 
}
  
if (freq > 120) {

  if (((counter / 500) % 2) == 1) {
    digitalWrite(rele, HIGH); //liga por 500 milisgundos o led se freq maior que 120
  }
  else
  {
    digitalWrite(rele, LOW); //desliga por 500 milisgundos o led se freq maior que 120
  }
}
 else
{
  digitalWrite(rele, LOW); //desliga o led se freq menor que 120

}
}

 

 

e funcionou bem mas tem um detalhe, acima de 120 pisca o led com brilho normal, mas se eu pressiono o botão para alimentar o pino 4 com 5v o led pisca na mesma frequência, mas pisca com um brilho menor uns 60% do brilho normal, o que será que é isso?

Link para o post
Compartilhar em outros sites
2 minutos atrás, Thiago Miotto disse:

Nó código o botão não liga o led.

a ideia é ao pressionar o botão acender e apagar o led da mesma forma como se estivesse a 120Hz, como não posso usar a função delay tentei readaptar o seu código e funciona mas o brilho está estranho, só fica mais brilhante mesmo quando a frquencia passa de 120Hz aí ele fica acendendo e apagando com brilho normal.

 

6 minutos atrás, Thiago Miotto disse:

Não entendi sua lógica. Como está ligado os fios?

o catodo do led está no gnd do arduino e o anodo está em série com um resistor de 1k2 ligado ao pino 7.

 

ainda não coloquei o botão só usei um jumper para simular, o jumper está no pino 4 que é onde vou colocar o botão, ligando este jumper do pino 4 ao GND nada acontece o led só começa a piscar quando a frequencia passa de 120Hz como programado, agora se eu ligar o jumper em 5v o led começa a piscar da mesma forma mas com menos intensidade no brilho não sei porque...

 

 

 

Link para o post
Compartilhar em outros sites
1 hora atrás, ComandateGustavo disse:

agora se eu ligar o jumper em 5vss

entendi que você liga o pino 4 ao 5V. Não sei se a culpa é da IDE, ou do Microcontrolador, mas você meio que forçou um bug.

O correto de ligação é pino4 e gnd.

Quanto ao código, você coloca um operador OR (ou), que é representado por ||.
Se frequência maior que 120 ou botão apertado

https://www.arduino.cc/reference/en/language/structure/boolean-operators/logicalor/

Link para o post
Compartilhar em outros sites
11 horas atrás, Thiago Miotto disse:

Quanto ao código, você coloca um operador OR (ou), que é representado por ||.
Se frequência maior que 120 ou botão apertado

Ahn sim agora entendi, fiz aqui e deu certo, se ligar o pino 4 em 5v o led pisca e se mudar para GND ele apaga.

 

ficou assim:

 

Citação

if ((freq > 120)||(digitalRead(inbotao))) {

 

11 horas atrás, Thiago Miotto disse:

O correto de ligação é pino4 e gnd.

isso é pra evitar interferências né? estava pesquisando a respeito de resistor para pull-up e pull-down e vi que a finalidade deles é essa, notei também que se o jumper do pino 4 estiver solto sem nada conectado ele ainda sim faz o led piscar, agora se ele estiver ligado ao gnd esse efeito para, isso com certeza deve ser alguma interferência que faz o arduino "pensar" que o pino 4 está em nível alto quando na verdade não está.

 

Então tentei programar para o led piscar apenas se a frequencia for maior que 120 ou se o pino 4 estiver em LOW assim:

 

Citação

if ((freq > 120)||(digitalRead(inbotao == LOW))) {

só que assim não sei porque o led fica piscando sem parar, mesmo com o pino 4 ligado ao GND ou 5V dá no mesmo fica piscando sempre, porque será?

Link para o post
Compartilhar em outros sites
18 minutos atrás, ComandateGustavo disse:

isso é pra evitar interferências né? estava pesquisando a respeito de resistor para pull-up e pull-down e vi que a finalidade deles é essa, notei também que se o jumper do pino 4 estiver solto sem nada conectado ele ainda sim faz o led piscar, agora se ele estiver ligado ao gnd esse efeito para, isso com certeza deve ser alguma interferência que faz o arduino "pensar" que o pino 4 está em nível alto quando na verdade não está.

Existe uma coisa que chamam de flutuação. Que justamente ocorre se você deixa um pino solto e faz a leitura dele.
Por isso, tem que que sempre ligar tudo ao terra e ao gnd, com resistores para fazer a corrente ficar sempre alta (ou baixa) quando não existe a ponte feita pelo aperto do botão e o baixa (ou alta) quando o botão está apertado.

 

 

 

24 minutos atrás, ComandateGustavo disse:

 

Citação

if ((freq > 120)||(digitalRead(inbotao == LOW))) {

só que assim não sei porque o led fica piscando sem parar, mesmo com o pino 4 ligado ao GND ou 5V dá no mesmo fica piscando sempre, porque será?

Na verdade aí tem um erro de sintaxe. O comando digitalRead lê um número inteiro, para ler o estado daquela saída. inbotao == LOW retorna algo lógico. A IDE deveria acusar erro e nem compilar, mas isso é um das coisas que ela não faz, e gera algo loco, que teria que olhar o código fonte gerado ou pelo menos monitor as variáveis para entender.

Ocorre algo parecido comigo. Como comecei a programar em Pascal, as vezes ponho só 1 igual nos if  (if (a=1) ao invés de if(a==1)). No meu caso, já vi que a IDE com meu erro  considera o if como verdadeiro e atribui 1 para a variável a.

Link para o post
Compartilhar em outros sites

@ComandateGustavo

Em 13/04/2021 às 12:33, ComandateGustavo disse:

@aphawk Realmente pesquisando achei este frequencimetro de Arduino, o site informa que mede com precisão até 6.5 MHz O_O

 

 

https://hackaday.io/project/176074-diy-65mhz-arduino-frequency-meter-7segment-displ

 

 

Vou analisar e se der vou trocar o o programa do meu frequencimetro por este outro desse site.

 

Não estou querendo 100% de precisão se o motor variar 100rpm a mais ou a menos ok não tem problema, o duro é variar 300 ou  400 rpm aí fica um negócio muito estranho, uma hora limita o rpm em 4800 depois limita em 5200 tem coisa errada...

Motor na lenta varia muito. Aqui nas motos que eu fabrico cdi é normal variar 5-8 graus na lenta, abaixo de 2500rpm, motor é muito complexo, tem a taxa dinâmica de compressão etc... Variação na lenta vai oscilar até uns 10hz por isso você deve converter para RPM Para ficar mais fácil de compreender.

 

Sobre o filtro que te passei, ele não apenas elimina a tensão negativa que mataria sua porta digital do Arduino, mas ele filtra ruidos da faisca de ignição e te entrega um sinal quadrado limpo. Os ruídos elétricos que são muitos nos automóveis podem fazer seu Arduino contar pulsos falsos. Devemos implementar dois filtros, um via hardware (que te passei pronto já) e outro via software (simples e eficaz te passo quando desenvolver a 1 parte).

 

O opto você pode enxergar ele como uma barreira de proteção , mas se vier um ruido na entrada dele ele também vai soltar esse pulso falso. O sensor hall que o @aphawk sugeriu facilita muito, pois o sinal que ele solta é pouco afetado pelos ruídos de ignição (claro tem exceções não adianta você por um cabo de 5 metros)

Link para o post
Compartilhar em outros sites
  • Membro VIP
3 horas atrás, mlegnari disse:

O opto

 

3 horas atrás, mlegnari disse:

um ruido na entrada dele ele também vai soltar esse pulso falso

O ruído da ignição é bem estreito se comparado ao do de rotação (acho). Neste caso um capacitor em paralelo com a entrada do mc ligeiramente bem calculado (testado) pode dar um bom resultado

Link para o post
Compartilhar em outros sites
8 horas atrás, mlegnari disse:

Variação na lenta vai oscilar até uns 10hz por isso você deve converter para RPM Para ficar mais fácil de compreender.

Mas a variação na lenta não vai importar muito a ideia é limitar o RPM máximo a uns 4 ou 5000 RPM nessa faixa de rotação a variação diminui bastante né?

Vou montar o filtro que você comentou @mlegnari mas também vou testar o circuito da forma que está pra ver o resultado, mas estou olhando bastante e não consegui descobrir porque não está lendo o pino 4 em LOW, vou aguardar o @Thiago Miotto responder pra gente ver se ele consegue encontrar o erro porque não estou conseguindo, o código é esse:

 

Citação

// --- Bibliotecas Auxiliares ---
#include <LiquidCrystal_I2C.h> //inclui biblioteca lcd
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);

// --- Mapeamento de Hardware ---
#define inFreq   2  //entrada para medir a frequência no pino digital 2
#define outrele  7
#define inbotao  4


// --- Variáveis Globais ---
const int rele=7;
long freq, counter;
int pulseCount;
boolean pulse;


// --- Configurações Iniciais ---
void setup() 
{
  
  pinMode(inFreq,INPUT);    //Configura como entrada
  pinMode(inbotao,INPUT);
  pinMode(rele, OUTPUT);
  
  lcd.init();
  lcd.setCursor(2,0);      //Posiciona cursor na coluna 3, linha 1
  
  pulse = 0x01;             //Seta variável de controle
  
} //end setup


// --- Loop Infinito ---
void loop() 
{
  
  counter = millis();      //counter recebe o valor do tempo em ms
  
  if(digitalRead(inFreq))  //Entrada de frequência em nível alto?
  {                        //Sim...
  
    if(pulse) pulseCount++;  //incrementa pulseCount se variável de controle for verdadeira
     
    pulse = 0x00;            //limpa variável de controle

  }
  else                     //Não...
  {
    pulse = 0x01;          //Seta variável de controle
  }


  if(counter%500 == 0x00)  //Passaram-se 200 ms?
  {                        //Sim...
    freq = pulseCount*2;   //Atualiza frequência (200 x 5 = 1000ms)
    lcd.setBacklight(HIGH);
    lcd.setCursor(5,1);   //Posiciona cursor na coluna 6, linha 2
    lcd.print(freq);      //Imprime valor atual da frequência
    lcd.print("Hz");      //Imprime "Hz"
        
    
    pulseCount = 0x00;     //Reinicia contador
  }
  
if ((freq > 120)||(digitalRead(inbotao))) {

  if (((counter / 500) % 2) == 1) {
    digitalWrite(rele, HIGH); //liga por 500 milisgundos o led se freq maior que 120
  }
  else
  {
    digitalWrite(rele, LOW); //desliga por 500 milisgundos o led se freq maior que 120
  }
}
 else
{
  digitalWrite(rele, LOW); //desliga o led se freq menor que 120

}
}
  
 

 

 

@.if tenho mais optos das sucatas de fonte, pensei em colocar um para o arduino receber a frequência do hall do distribuidor e outro para o arduino acionar o opto ao invés de ligar o rele diretamente, porque o rele vai ser ligado e desligado rapidamente  e como o rele é uma carga indutiva desligar e ligar a bobina dessa forma rápida pode prejudicar a porta do arduino, ou estou enganado?

Link para o post
Compartilhar em outros sites
2 minutos atrás, aphawk disse:

Se vai usar um relé, não se esqueça do famoso diodo 1n4001 em paralelo com a bobina para eliminar os transtransientes  ou seu circuito vai ficar doidão kkkkk

@aphawk eu tinha imaginado isso a bobina ligando ou desligando gera muita interferencia e transientes né?

 

Meus optos são PC 817 e para ligar rele neles achei estes esquemas:

 

be6c5b50dc3527ce90c7da7f8acda47c.gif

 

Pelo que entendi o esquema um é para usar a mesma fonte que está no opto e no segundo usa uma fonte separada do opto, no meu caso como vou usar 12v para ligar o rele usarei o segundo esquema, e nos dois casos o transistor 2N3904 está ai para acionar a bobina do rele no lugar do fototransistor do opto como proteção, é isso mesmo?

Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Aprenda a ler resistores e capacitores

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!