Muss mir nur nen Kondensator suchen ;).
Weiterhin habe ich die Grundfunktion des Tachos soweit als Sketch fertig. Ich bin kein Profi und froh, wenn jemand mit Sachverstand drüberschaut und Verbesserungsvorschläge mitteilt. Gerade mit C bin ich nicht gerade sehr warm.
Signalgeber anstatt Tachowelle, passt für Honda CX500 (evtl. auch weitere Typen) in die originale Tachoschnecke.
Ein Signal pro Umdrehung, relativ sauberes Rechtecksignal. Betriebsspannung 12Volt.
Das Rechtecksignal (12Volt) mit PNP-Transistor (BC308) auf 5V runtergezogen (Spannungsteiler).
Versorgung des (momentan noch) Arduino über 15Watt DC-DC-Converter 12V auf 5V.
OLED 128x64, wobei 128x32 auch ausreichend wäre. So habe ich mehr Anzeige zum spielen (Größe siehe Fotos weiter oben).
Code: Alles auswählen
#include <RunningAverage.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);
RunningAverage myRA(10);
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 buf[17]; // Pufferstring für sprintf
static const unsigned char PROGMEM logo [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
0x0F, 0x80, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x06, 0x00, 0x00,
0x3F, 0xC0, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x06, 0x00, 0x00,
0x30, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00,
0x60, 0x0F, 0x8F, 0x8F, 0x0D, 0x8F, 0x83, 0x83, 0xC3, 0x60, 0x06, 0x07, 0xC1, 0xC6, 0xF0, 0x78,
0x60, 0x1F, 0xCF, 0x9F, 0x8F, 0x9F, 0xC7, 0xC7, 0xE3, 0xE0, 0x06, 0x0F, 0xE3, 0xE7, 0xF8, 0xFC,
0x60, 0x10, 0xC6, 0x39, 0xCE, 0x10, 0xCE, 0x4E, 0x73, 0x80, 0x06, 0x08, 0x67, 0x27, 0x19, 0xCE,
0x60, 0x00, 0xC6, 0x30, 0xCC, 0x00, 0xCC, 0x0C, 0x33, 0x07, 0x86, 0x00, 0x66, 0x06, 0x19, 0x86,
0x60, 0x0F, 0xC6, 0x3F, 0xCC, 0x0F, 0xCC, 0x0F, 0xF3, 0x07, 0x86, 0x07, 0xE6, 0x06, 0x19, 0x86,
0x60, 0x18, 0xC6, 0x30, 0x0C, 0x18, 0xCC, 0x0C, 0x03, 0x00, 0x06, 0x0C, 0x66, 0x06, 0x19, 0x86,
0x30, 0x58, 0xC6, 0x38, 0x4C, 0x18, 0xCE, 0x4E, 0x13, 0x00, 0x06, 0x0C, 0x67, 0x26, 0x19, 0xCE,
0x3F, 0xDF, 0xC6, 0x1F, 0xCC, 0x1F, 0xC7, 0xC7, 0xF3, 0x00, 0x06, 0x0F, 0xE3, 0xE6, 0x18, 0xFC,
0x0F, 0x8E, 0xC6, 0x0F, 0x8C, 0x0E, 0xC3, 0x83, 0xE3, 0x00, 0x06, 0x07, 0x61, 0xC6, 0x18, 0x78,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x00,
0x00, 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xE0, 0x00, 0x00,
0x00, 0x03, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00,
0x00, 0x07, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF8, 0x00, 0x00,
0x00, 0x0F, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFC, 0x00, 0x00,
0x00, 0x1F, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFE, 0x00, 0x00,
0x00, 0x3F, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
0x00, 0x7F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x80, 0x00,
0x00, 0x7F, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x80, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00,
0x00, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00,
0x00, 0xCF, 0xFF, 0xFF, 0xDE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFD, 0xE0, 0x00,
0x01, 0xC7, 0xFF, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x7F, 0xFF, 0xF8, 0xE0, 0x00,
0x01, 0x83, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3F, 0xFF, 0xF0, 0xE0, 0x00,
0x01, 0x83, 0xFF, 0xFE, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x3F, 0xFF, 0xE0, 0x60, 0x00,
0x01, 0x83, 0x8F, 0x8E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x38, 0xF8, 0xE0, 0x60, 0x00,
0x01, 0x81, 0x0F, 0x86, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x10, 0xF8, 0x60, 0xC0, 0x00,
0x00, 0xC0, 0x0F, 0xC0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0xFC, 0x00, 0xC0, 0x00,
0x00, 0xC0, 0x1F, 0xC0, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x01, 0xFC, 0x00, 0xC0, 0x00,
0x00, 0x60, 0x3F, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xFE, 0x01, 0x80, 0x00,
0x00, 0x38, 0x7D, 0xF8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x87, 0xDF, 0x87, 0x00, 0x00,
0x00, 0x1F, 0xFC, 0xDF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xCD, 0xFE, 0x00, 0x00,
0x00, 0x00, 0x1C, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xCC, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x86, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x86, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00,
0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x80, 0x00, 0x00,
0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xC0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x20, 0x00,
0x09, 0x99, 0x99, 0x90, 0x77, 0xB9, 0x8E, 0xF1, 0xCC, 0x71, 0xDE, 0x74, 0x9F, 0xC0, 0xE3, 0x00,
0x05, 0xA5, 0xA5, 0xA0, 0x80, 0x92, 0x48, 0x12, 0x12, 0x40, 0x92, 0x44, 0x92, 0x41, 0x24, 0x80,
0x05, 0xA5, 0xA5, 0xA0, 0x87, 0x93, 0xC8, 0xF2, 0x1E, 0x4E, 0x92, 0x44, 0x92, 0x41, 0x27, 0x80,
0x06, 0x66, 0x66, 0x60, 0x84, 0x92, 0x08, 0x92, 0x10, 0x40, 0x92, 0x44, 0x92, 0x41, 0x24, 0x00,
0x02, 0x42, 0x42, 0x44, 0x77, 0x91, 0xC8, 0xF1, 0xCE, 0x40, 0x9E, 0x47, 0x92, 0x48, 0xE3, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void setup() {
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), readmillis, RISING);
myRA.clear();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.drawBitmap(0, 0, logo, 128, 64, 1);
display.display();
delay(1000);
}
void loop() {
if (last > 0) {
if (millis()- last > 4000) { // Nach 4 Sekunden stillstand Logo anzeigen
display.clearDisplay();
display.drawBitmap(0, 0, logo, 128, 64, 1);
display.display();
}
else {
VAnzeige = myRA.getAverage(), 0; // Mittelwert errechnen
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Build, not bought...!");
display.setTextSize(2);
display.setCursor(70, 50);
display.print("km/h");
display.setTextSize(4);
display.setCursor(10, 12);
display.print(VAnzeige);
display.display();
myRA.clear(); // Mittelwertdaten löschen
}
}
delay(250); // Alle 1/4 Sekunde Werte aktualisieren, bis dahin über Interrupt Werte sammeln
}
void readmillis() { // Interrupt-Routine
detachInterrupt(2); // Interrupt ausschalten damit er uns nicht beißt
unsigned long m = millis(); // Microsekundenzähler auslesen
unsigned long v = m - last; // Differenz zum letzten Durchlauf berechnen
if (v > 5) { // ignorieren wenn <= 5ms (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.
}
Libraries die Adafruit (2x) und die RunningAverage. Bei Interesse oder akuter Faulheit kann ich die nochmal verlinken.