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:
4 Comentários
Boa noite, você já utilizou duas interrupções externas ao mesmo tempo? Gostaria de como você fez?
ResponderExcluirbom pra K-rai!
ResponderExcluirdeveria baixar sem ter de se cadastrar
ResponderExcluirOlá, poderia informar a especificação dos diodos ?
ResponderExcluir