Hallo,
ich habe jetzt endlich mal meinen Code für den Tacho vorgekramt. Da ich einen el. Tachogeber als Ersatz für den mechanischen an der CX verwenden will, zähle ich wenn ich einen Interrupt, ausgelöst durch eine steigende Flanke, reinbekomme.
Aktuell ist die Verkabelung noch sehr überschaubar. Vier Leitungen zum Display und drei zum el. Tachogeber.
Das hier ist aber erstmal nur die Geschwindigkeitsanzeige, Gesamtkilometer fehlen noch. 1400 Interrupts = 1km, das ist nicht so schwer.
Hier kommt dann der Wearlevel zum Einsatz ;)
Nun aber erstmal der versprochene Code:
Code: Alles auswählen
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <RunningAverage.h>
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE, /* clock=*/ SCL, /* data=*/ SDA); //Mein Display (OLED 182x32)
RunningAverage myRA(5);
volatile unsigned long dauer = 0; // microsekunden seit dem letzten Interrupt
volatile unsigned long last = 0; // Zählerwert beim letzten Interrup
short geschwindigkeit; // selbstredend
short VAnzeige;
char dispStr[3];
void setup(void) {
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), readmillis, RISING);
myRA.clear();
u8g2.begin();
}
void loop(void) {
if (last > 0) {
if (millis() - last > 4000) { // Nach 4 Sekunden stillstand Display löschen
u8g2.clearDisplay();
myRA.clear();
}
else {
VAnzeige = myRA.getAverage();
String(VAnzeige).toCharArray(dispStr, 3);
u8g2.clearBuffer();
u8g2.setFontDirection(0);
u8g2.setFont(u8g2_font_logisoso32_tf);
u8g2.drawStr(0,32,dispStr);
u8g2.setFont(u8g2_font_logisoso16_tf);
u8g2.drawStr(70,32,"km/h");
u8g2.sendBuffer();
}
}
}
void readmillis() { // Interrupt-Routine
detachInterrupt(2); // Interrupt ausschalten damit er uns nicht beißt
volatile unsigned long m = millis(); // Microsekundenzähler auslesen
volatile unsigned long v = m - last; // Differenz zum letzten Durchlauf berechnen
if (v > 10) { // ignorieren wenn <= 10ms (Kontaktpreller)
dauer = v; // Wert in dauer übernehmen
last = m; // und wieder den letzten Wert merken
geschwindigkeit = 2572 / dauer; // Geschwindigkeit ausrechnen mit k-Wert 1,4
myRA.addValue(geschwindigkeit); // Wert zur Mittelwerberechnung hinzufügen
}
attachInterrupt(digitalPinToInterrupt(2), readmillis, RISING); // Interrupt wieder einschalten.
}
Wenn ich es noch schaffe den Tachowert rechtsbündig darzustellen, wäre das noch besser. Tipps sind gerne gesehen.
LG Roland