Boa noite Galera do LDG,
Estou tentando adaptar um código que encontrei na internet para contagem de rotação de um eixo (RPM) por meio de um par de led de infravermelho, no entanto, após alguns segundos do sistema funcionando o display (16x2) congela e só retoma se o arduino for reiniciado.
Abaixo código que estou utilizando.

// Leitor de RPM

#include //Inclui a biblioteca do LCD

volatile int rpmcount = 0;
int rpm = 0;
unsigned long lastmillis = 0;

LiquidCrystal lcd(13, 12, 11, 10, 9, 7); //Configura os pinos do Arduino para se comunicar com o LCD

void setup(){
lcd.begin(16, 2); //Inicia o LCD com dimensões 16x2(Colunas x Linhas)
lcd.setCursor(0,0);
lcd.print("Iniciando!!!");
delay(800);
attachInterrupt(0, rpm_fan, FALLING);//interrupt cero (0) is on pin two(2).
}

void loop(){

if (millis() - lastmillis == 1000){ /*Uptade every one second, this will be equal to reading frecuency (Hz).*/

detachInterrupt(0); //Disable interrupt when calculating

rpm = rpmcount * 60; /* Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use rpmcount * 30.*/

lcd.clear(); //Posiciona o cursor na primeira coluna(0) e na primeira linha(0) do LCD
lcd.print("RPM="); //print the word "RPM" and tab.
lcd.print(rpm); // print the rpm value.

lcd.setCursor(0,1); //Posiciona o cursor na primeira coluna(0) e na primeira linha(0) do LCD
lcd.print("Hz="); //print the word "Hz".
lcd.print(rpmcount); /*print revolutions per second or Hz. And print new line or enter.*/

rpmcount = 0; // Restart the RPM counter
lastmillis = millis(); // Uptade lasmillis
attachInterrupt(0, rpm_fan, FALLING); //enable interrupt
}
}
void rpm_fan(){ /* this code will be executed every time the interrupt 0 (pin2) gets low.*/
rpmcount++;

}

Exibições: 1532

Responder esta

Respostas a este tópico

Se você estiver lendo uma rotação muito alta, a variável "rpmcount" vai estourar rápido. Tente alterá-la para unsigned long.

Wilmar

Hudson,

O que eu disse na resposta anterior não acontecerá porque a variável está sendo resetada a cada 1 segundo.

A lógica da interrupção e os cálculos estão corretos.

Reveja com cuidado a forma como foi definida a instância lcd e a sua ligação eletrica.

Wilmar

Boa noite Wilmar,

Por gentileza, poderia definir instância lcd.

Obrigado.

Esse é o termo utilizado na chamada de uma biblioteca, no caso a LiquidCrystal, onde normalmente se configura sua utilização.

No caso do sketch que colocou "LiquidCrystal lcd(13, 12, 11, 10, 9, 7);" cria a instância "lcd" e define em quais pinos do Arduino serão interligados as conexões do LCD 16x2.

Veja mais detalhes aqui.

Faz algum tempo que lí sobre isso, mas existe diferenças de pinagem entre dois "tipos" básicos de LCD 16 x 2 encontrados no mercado, sendo um baseado em CI da Hitachi e o outro não me lembro.

tive uma curta experiência com Arduino, mas percebi que meu lcd congelava ou apresentava caracteres indesejados por conta da alimentação insuficiente, era um Arduino Mega, além do fato de dois motores dc ligados diretamente nas portas 5v do arduino, nos foruns vi um pessoal falando que não é correto utilizar assim, qual o seu cenário atual? espero que te ajude.

Olá Mario,

Segue esquema que estou utilizando.

Hudson conseguiu rodar seu contador de rpm?

Bom dia Guilherme,

Deu certo sim!

O problema estava na protoboard e conexões.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço