/*
Forum: https://forum.arduino.cc/t/drehzahlmesser-am-auto/1396866
Wokwi: https://wokwi.com/projects/437119968369247233
*/
//#include "MFRC522.h"
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
unsigned long myTimeDZM = 0; //Zeit Drehzahlmesser
int timerDZM = 500; //Zeit für Drehzahlmesser
unsigned long myTimeDZMImpuls = 0; //Zeit Drehzahlmesser
unsigned long myTimeZeitIm = 0; //Zeit für Impuls DZM
//Pins
#define pinImpuls 3 // Pin für Drehzahlimpuls
//OLED Display
#define pinOSDA A4
#define pinOSLK A5
U8G2_SSD1306_128X32_UNIVISION_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ pinOSLK, /* data=*/ pinOSDA, /* reset=*/ U8X8_PIN_NONE); // Adafruit Feather M0 Basic Proto + FeatherWing OLED
// Drehzahlmesser
double Drehzahl = 0;
int impulszz = 0;
int zeitimpuls = 0;
void setup()
{
//Pin In Output
pinMode(pinImpuls, INPUT); //Pin Impuls
attachInterrupt(digitalPinToInterrupt(pinImpuls), ImpulsLesen, FALLING);
SPI.begin();
u8g2.begin(); //OLED Display
Serial.begin(115200);
Serial.println("Start");
starteSimulation(1250);
}
void loop()
{
if (impulszz > 10 * 161) { //Führe aus wenn x Impulse gemessen wurden
Serial.print("Impulse ");
Serial.println(impulszz);
impulszz = 0;
zeitimpuls = millis() - myTimeZeitIm;
myTimeZeitIm = millis();
Drehzahl = (60000 / zeitimpuls);
Drehzahl = Drehzahl * 10;
}
if (millis() - myTimeDZM > timerDZM) {
unsigned long start = millis();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_fub30_tr);
u8g2.setFontRefHeightExtendedText();
u8g2.setDrawColor(1);
u8g2.setFontPosTop();
u8g2.setFontDirection(0);
u8g2.setCursor(20, 1);
u8g2.print(Drehzahl, 0);
u8g2.sendBuffer();
myTimeDZM = millis();
Serial.print("U8G2 [ms] ");
Serial.println(millis() - start);
}
}
void ImpulsLesen() {
if (micros() - myTimeDZMImpuls > 2) {
impulszz = impulszz + 1;
myTimeDZMImpuls = micros();
}
}
/*************************************************************************************/
/* Dieser Teil ist für das Simulieren der Pulse für die Drehzahlmessung erforderlich */
#include <TimerOne.h>
constexpr byte outPin {4};
constexpr unsigned long pulseProRotation {161};
unsigned long interval;
float zielDrehzahl = 1200;
byte togglePin = 0;
void starteSimulation(float ziel) {
pinMode(outPin, OUTPUT);
togglePin = 1 << outPin;
zielDrehzahl = ziel;
interval = round(1000000.0 / ((zielDrehzahl / 60.0) * pulseProRotation));
Timer1.initialize(interval);
Timer1.attachInterrupt(timer_isr);
}
void timer_isr() {
PIND = togglePin;
delayMicroseconds(3);
PIND = togglePin;
}
/*************************************************************************************/