Eigentlich war der Bau des Speedometer (88 Miles Box) nicht geplant, aber angestachelt von einem Freund hab ich es dann doch einfach gemacht!
Ich hatte noch ein zweifaches 7-Segment-Display (74HV595) herumliegen und dachte mir: „Pfeif drauf“ (Zitat Doc.). Das größte Problem war ein Gehäuse zu finden, welches von der Größe und Farbe her passt. Nach dem dritten Gehäuse hatte ich endlich eins gefunden das mir gefällt. Also Display an einen Arduino Nano, Software geschrieben, Displayblende gedruckt, nochmal richtig gedruckt ;-), Gehäuse ausgeschnitten, fertig!
Na ja, das klingt etwas banal 🙂
Ich habe eine 3D-Druck-Datei erstellt die das Display fasst und von den Maßen her noch an das Original erinnert. Da musste das Display rein. Alles verleimt und fertig. Desweiteren habe ich einen 18650er Akku und einen TP-4056 als Ladekontroller eingebaut und einen Mikro-USB-Anschluss nach außen gelegt. Ein KNX1-Schalter steuert die globale Stromzufuhr.
Außen musste dann nur noch die schwarzen und roten gestanzten Aufkleber drauf, die ein paar von euch noch von früher kennen bevor es Thermolabel gab :-D.
Die Software:
Die Software ist klassisch auf der Arduino-IDE geschrieben und benötigt die Klasse „ShiftRegister74HC595“, in der Version 1.2.0, darüber ist mein Sketch nicht mehr lauffähig.
Es wird von 0 bis 88 hochgezählt, aber in Beschleunigungsintervallen um ein Schalten des Ganges zu simulieren (erst schnell, dann immer langsamer). Bei 88 angekommen flackert das Display kurz um den Zeitsprung zu simulieren und dann wird zügig wieder bis auf Null runter gezählt, der Bremsvorgang!
#include <ShiftRegister74HC595.h> // CC BY 4.0 (2020 by TeamOutatime.de (Tobias Riefer)) // ******************** // UNBEDINGT BIBLIOTHEKSVERSION ShiftRegister74HC595 VERSION 1.2.0 verwenden // ******************** #define SDI 7 #define SCLK 6 #define LOAD 5 #define DIGITS 2 ShiftRegister74HC595 sr (DIGITS, SDI, SCLK, LOAD); int value,digit1,digit2,digit3,digit4; uint8_t digits[] = { B11000000, B11111001, B10100100, B10110000, B10011001, B10010010, B10000010, B11111000, B10000000, B10010000 }; void setup() { } void loop() { for(int i=0; i<=35; i++) { showNumber(i); delay(50); } for(int i=35; i<=55; i++) { showNumber(i); delay(80); } for(int i=55; i<=78; i++) { showNumber(i); delay(110); } for(int i=78; i<=85; i++) { showNumber(i); delay(200); } for(int i=85; i<=88; i++) { showNumber(i); delay(500); } delay(200); flackernAUS(); delay(50); flackernAN(); delay(50); flackernAUS(); delay(40); flackernAN(); delay(300); flackernAUS(); delay(40); flackernAN(); delay(1500); for(int i=88; i >=0; i--) { showNumber(i); delay(50); } delay(2000); } void flackernAUS() { for (int i = 0; i<15; i++) { sr.set(i, HIGH); } } void flackernAN() { for (int i = 0; i<15; i++) { sr.set(i, LOW); } sr.set(7, HIGH); sr.set(16, HIGH); } void showNumber(int num) { digit2=num % 10 ; digit1=(num / 10) % 10 ; uint8_t numberToPrint[]= {digits[digit1],digits[digit2]}; sr.setAll(numberToPrint); }