Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


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:




Postar um comentário

4 Comentários