int vel_car;
volatile byte pulsos;
unsigned long timeold;
unsigned int pulsos_por_volta = 10; //Altere o numero abaixo de acordo com o seu disco encoder
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
const byte SCREEN_WIDTH = 128; // OLED display width, in pixels
const byte SCREEN_HEIGHT = 64; // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
const int OLED_RESET = -1; // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void contador() // --- Interrupção ---
{
pulsos++; //Incrementa contador
}
void setup(){
Serial.begin(9600); // high rate to assure good capture
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C
display.clearDisplay(); // Clear the buffer.
attachInterrupt(0, contador, RISING); //Interrupcao 14 - pino digital
pulsos = 0;
vel_car = 0;
timeold = 0;
}
void loop() {
if (millis() - timeold >= 1000) //Atualiza contador a cada segundo
{
detachInterrupt(0); //Desabilita interrupcao durante o calculo
vel_car = (60 * 1000 / pulsos_por_volta) / (millis() - timeold) * pulsos;
timeold = millis();
pulsos = 0;
//Mostra o valor de RPM no serial monitor
Serial.print("Velocidade = ");
Serial.println(vel_car, DEC);
attachInterrupt(0, contador, RISING); //Habilita interrupcao
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("VEL. BUGGY");
display.setCursor(0, 16);
display.println(vel_car);
display.display();
}