banner

Ir para o Forum

Medidor de RPM com STM32


Embora seja mais “chatinho” de se comprar, por não estar disponível em todas as lojas na internet, continuo hoje falando do STM32 L432KC, que é um chip que eu tenho um carinho especial. Por quê? Porque ele é ULTRA LOW POWER. No entanto, para aqueles que não possuem o STM32, já adianto que ele pode ser substituído neste projeto pelo Arduino Uno. Para tal, basta mudar a pinagem da entrada de Interrupt.
Vamos, então, criar um medidor de RPM utilizando o STM32 L432KC e um sensor infravermelho. Esse mesmo programa pode ser utilizado ainda para medir a velocidade do vento. Essa característica de baixo consumo deste microcontrolador é perfeita para IOT.



Módulos

Para nosso projeto de hoje, utilizamos o MAX7219CWG de 8 dígitos, bem como o Módulo Infravermelho.





STM32 NUCLEO-L432KC




Demonstração

Na nossa montagem, temos o STM32, o display de 8 dígitos, além da entrada dos pulsos. A placa de infravermelho tem um fototransistor e um led que pega a luz rebatendo de uma fita branca. Esta fita está presa a uma roda e, a cada volta, irá gerar um pulso, o qual será capturado pela interrupção no STM32.
Temos na montagem um diodo e um capacitor que foram utilizados para impedir que o ruído do sinal da leitura da fita chegasse até o STM32, o que o faria interpretar como muitas vezes ligado e desligado.
Na demonstração mostra o nosso projeto, bem como o medidor da Minipa, ambos em funcionamento.




Montagem





Programa

Faremos um programa no qual o módulo infravermelho acionará uma interrupção no STM32 L432KC a cada “volta”, então faremos os cálculos para exibir o RPM no display.



Bibliotecas

Adicione a seguinte biblioteca “DigitLedDIsplay”.
Basta acessar “Sketch >> Incluir Bibliotecas >> Gerenciar Bibliotecas...”




Bibliotecas e Variáveis

Vamos iniciar o código fonte incluindo a biblioteca DigitLedDisplay. Instancio o objeto display. Defino o pino de interrupção, que será o 12. Ainda, insiro um operador volátil para o contador de rpm e o tempo, para evitar qualquer problema de colisão.

/* Include DigitLedDisplay Library */
#include "DigitLedDisplay.h"

/* Arduino Pin to Display Pin
   7 to DIN,
   6 to CS,
   5 to CLK */
//DigitLedDisplay ld = DigitLedDisplay(7, 6, 5); //arduino
DigitLedDisplay ld = DigitLedDisplay(4, 2, 3); //STM32 L432KC

int pin = 12; //pino de interrupção (módulo IR)

volatile unsigned int rpm; //contador de rpm
volatile unsigned long timeold; //tempo




Setup

No Setup, configuramos o funcionamento do display, bem como a interrupção como Rising.

void setup() {
Serial.begin(115200);
  /* Set the brightness min:1, max:15 */
  ld.setBright(10);

  /* Set the digit count */
  ld.setDigitLimit(8);
  ld.printDigit(0);
  attachInterrupt(digitalPinToInterrupt(pin), interruptPin, RISING); 
  
  rpm = 0;
  timeold = millis();
}





Loop

Por fim, determinamos intervalo de 1 em 1 segundo para atualização do display. Depois de limpar a tela, imprimimos o RPM. Executamos a função que a interrupção chamará. Calculamos o RPM e atualizamos o tempo.

void loop() {

       delay(1000);
       ld.clear();
       ld.printDigit(rpm);
}

void interruptPin()
{
  rpm = 60*1000/(millis() - timeold);

  timeold = millis();
}




Faça o download dos arquivos:




Nenhum comentário:

Tecnologia do Blogger.