Hallo, nachdem @pat.zet hier eine in meinen Augen recht schicke Zusatzanzeige gezeigt hat, war das eine gute Gelegenheit mal wieder ein wenig Elektronik Bastelei zu betreiben. Da schon ein paar weitere User (@marc53844 , @QP263 , ...?) Interesse an so einer Anzeige bekundet haben, möchte ich hier näher auf die Details dazu eingehen. Wenn der restliche Post bei vielen Kopfschütteln verursacht, ist das ok. Wer ein wenig Grundkenntnisse in Sache Elektronik und Microcontroller hat, kann mir hoffentlich folgen. Hier sei noch erwähnt, dass ich selber nur über rudimentäres "Wissen" bzgl. Mikrocontroller und deren Programmierung verfüge. Vieles schaue ich mir von diversen ähnlich gearteten Projekten ab und passe es entsprechend an. Ein echter Pfuscher eben.
Zunächst hatte ich vor es in C auf einen ATmega328P-PU Microcontroller zu programmieren, ein Überbleibsel aus dem Studium. Die ersten Schritte habe ich auch damit gemacht. Bis ein Kollege mich auf den Arduino Uno aufmerksam gemacht hat, den habe ich bis dahin immer nur belächelt, da er unter "echten" Programmierern ja eher als Bastellösung belächelt wird. Nun Bastellösung macht ja irgendwo Sinn bei einem Bastelprojekt, dachte ich mir. Da ich auch noch einen Arduino Uno herum liegen hatte, der nie benutzt wurde, habe ich es einfach mal probiert. Ich muss sagen, das Teil ist echt ziemlich gut. Zum einen ist die Software dafür deutlich simpler als bspw. das Atmel Studio, zum anderen hat man Programmierer und Microcontroller direkt auf einer Platine. Außerdem gibt es für diverse gängige Anwendungen bzw. Bauteile bereits fertige Bibliotheken, wodurch der Programmcode selber recht trivial wird. Zudem ist die Community dahinter gigantisch und es wurde somit schon so ziemlich jede erdenkliche Anwendung verwirklicht in irgendeiner Ausprägung. Daher werde ich vorerst auf den Arduino Uno setzen.
Genug geblubbert, kommen wir zum Kern der Idee. Was soll angezeigt werden?
- Öltemperatur
- Öldruck
- Außentemperatur
- ...
Wie soll angezeigt werden?
Momentan ist die Idee, dass die Werte über ein 16x2 Zeichen LCD Display angezeigt werden. Das könnte vermutlich gut anstelle der Momentanverbrauchsanzeige, wie es sie bei E36 Coupé, Limo, Cabrio gibt, in das Kombiinstrument integriert werden. Das gilt es noch zu überprüfen. Ansonsten ließe sich das ganze auch problemlos mit anderen (größeren) gängigen alphanumerischen LCDs umsetzen.
Da das Display nur zwei Zeilen hat, lassen sich nicht alle Messwerte gleichzeitig mit Bezeichnung darstellen. Daher soll die Anzeige automatisch alle x Sekunden umschalten. Stand jetzt ist es so realisiert, dass die Messwerte jeweils nur einmal beim Umschalten erfasst werden und dann statisch angezeigt werden. Sicherlich könnte man es auch so umsetzen, dass die Werte Live angezeigt werden. Allerdings sehe ich da bei trägen Temperatur Messwerten keine Notwendigkeit. Zudem finde ich es immer unschön, wenn eine digitale Anzeige bei solch trägen Messgrößen zwischen zwei Werten hin und her flackert, wenn sich der Wert gerade an einer Schwelle befindet. Sicherlich könnte man auch dem programmiertechnisch entgegen wirken, für die Temperatur reicht aber in meinen Augen das einmalige erfassen der Werte beim Umschalten locker. Einzig beim Öldruck macht es Sinn, da dieser sich recht schnell ändern kann. Allerdings hat man hier noch Öldruck Lampe im Kombiinstrument, die leuchtet, sobald der Öldruck komplett abfällt. Von daher muss ich mir mal anschauen wie leicht sich das umsetzen lässt mit dem Livewert.
Mit welcher Hardware wird gearbeitet?
- Arduino Uno
- 1602 LCD mit I2C
- (DHT22)
Alles für wenige Euros aus China zu beziehen. Lieferung dauert dann aber ein paar Wochen. Probleme mit Zoll & Co. gibt es aber keine, da deutlich unter der Freigrenze.
Was fehlt noch?
Sensoren für Öldruck und -temperatur, Außentemperatur ebenso. Momentan habe ich zwar einen DHT22 Sensor eingebunden, der Lufttemperatur und -feuchte messen kann, dieser dürfte aber eher nicht für den Außenbereich geeignet sein. Daher würde ich diesen höchstens für Messungen im Innenraum hernehmen. Hier sind vor allem die Coupé Fahrer gefragt, sofern von deren Seite noch ernsthaftes Interesse besteht. Gibt es dort ein Verlangen nach Messwerten zu Temperatur und Luftfeuchte? Bei artgerechter Fahrt eines Roadsters ist Außentemperatur ja gleich Innentemperatur. Die kann man auch über den Bordcomputer ablesen, sofern vorhanden. Die Luftfeuchte lässt sich so dann ohnehin nicht ändern.
Wenn die Komponenten alle gefunden sind, und der Controller tut was er soll, wird vermutlich noch eine Platine dazu gebastelt.
Hilfe?
Falls jemand bereits mehr Erfahrung auf dem Gebiet und Lust hat, fachliche Beiträge sind gerne gesehen. Andere natürlich auch, sofern sie das Vorhaben im weitesten betreffen. Vorschläge für Sensoren, sowie deren Montageorte sind gerne gesehen. Vielleicht kann jemand ja auch gleich noch eine Kennlinie dazu liefern. Die finde ich leider nur bei den sündhaft teuren Markensensoren.
Programmcode
Zunächst hatte ich vor es in C auf einen ATmega328P-PU Microcontroller zu programmieren, ein Überbleibsel aus dem Studium. Die ersten Schritte habe ich auch damit gemacht. Bis ein Kollege mich auf den Arduino Uno aufmerksam gemacht hat, den habe ich bis dahin immer nur belächelt, da er unter "echten" Programmierern ja eher als Bastellösung belächelt wird. Nun Bastellösung macht ja irgendwo Sinn bei einem Bastelprojekt, dachte ich mir. Da ich auch noch einen Arduino Uno herum liegen hatte, der nie benutzt wurde, habe ich es einfach mal probiert. Ich muss sagen, das Teil ist echt ziemlich gut. Zum einen ist die Software dafür deutlich simpler als bspw. das Atmel Studio, zum anderen hat man Programmierer und Microcontroller direkt auf einer Platine. Außerdem gibt es für diverse gängige Anwendungen bzw. Bauteile bereits fertige Bibliotheken, wodurch der Programmcode selber recht trivial wird. Zudem ist die Community dahinter gigantisch und es wurde somit schon so ziemlich jede erdenkliche Anwendung verwirklicht in irgendeiner Ausprägung. Daher werde ich vorerst auf den Arduino Uno setzen.
Genug geblubbert, kommen wir zum Kern der Idee. Was soll angezeigt werden?
- Öltemperatur
- Öldruck
- Außentemperatur
- ...
Wie soll angezeigt werden?
Momentan ist die Idee, dass die Werte über ein 16x2 Zeichen LCD Display angezeigt werden. Das könnte vermutlich gut anstelle der Momentanverbrauchsanzeige, wie es sie bei E36 Coupé, Limo, Cabrio gibt, in das Kombiinstrument integriert werden. Das gilt es noch zu überprüfen. Ansonsten ließe sich das ganze auch problemlos mit anderen (größeren) gängigen alphanumerischen LCDs umsetzen.
Da das Display nur zwei Zeilen hat, lassen sich nicht alle Messwerte gleichzeitig mit Bezeichnung darstellen. Daher soll die Anzeige automatisch alle x Sekunden umschalten. Stand jetzt ist es so realisiert, dass die Messwerte jeweils nur einmal beim Umschalten erfasst werden und dann statisch angezeigt werden. Sicherlich könnte man es auch so umsetzen, dass die Werte Live angezeigt werden. Allerdings sehe ich da bei trägen Temperatur Messwerten keine Notwendigkeit. Zudem finde ich es immer unschön, wenn eine digitale Anzeige bei solch trägen Messgrößen zwischen zwei Werten hin und her flackert, wenn sich der Wert gerade an einer Schwelle befindet. Sicherlich könnte man auch dem programmiertechnisch entgegen wirken, für die Temperatur reicht aber in meinen Augen das einmalige erfassen der Werte beim Umschalten locker. Einzig beim Öldruck macht es Sinn, da dieser sich recht schnell ändern kann. Allerdings hat man hier noch Öldruck Lampe im Kombiinstrument, die leuchtet, sobald der Öldruck komplett abfällt. Von daher muss ich mir mal anschauen wie leicht sich das umsetzen lässt mit dem Livewert.
Mit welcher Hardware wird gearbeitet?
- Arduino Uno
- 1602 LCD mit I2C
- (DHT22)
Alles für wenige Euros aus China zu beziehen. Lieferung dauert dann aber ein paar Wochen. Probleme mit Zoll & Co. gibt es aber keine, da deutlich unter der Freigrenze.
Was fehlt noch?
Sensoren für Öldruck und -temperatur, Außentemperatur ebenso. Momentan habe ich zwar einen DHT22 Sensor eingebunden, der Lufttemperatur und -feuchte messen kann, dieser dürfte aber eher nicht für den Außenbereich geeignet sein. Daher würde ich diesen höchstens für Messungen im Innenraum hernehmen. Hier sind vor allem die Coupé Fahrer gefragt, sofern von deren Seite noch ernsthaftes Interesse besteht. Gibt es dort ein Verlangen nach Messwerten zu Temperatur und Luftfeuchte? Bei artgerechter Fahrt eines Roadsters ist Außentemperatur ja gleich Innentemperatur. Die kann man auch über den Bordcomputer ablesen, sofern vorhanden. Die Luftfeuchte lässt sich so dann ohnehin nicht ändern.
Wenn die Komponenten alle gefunden sind, und der Controller tut was er soll, wird vermutlich noch eine Platine dazu gebastelt.
Hilfe?
Falls jemand bereits mehr Erfahrung auf dem Gebiet und Lust hat, fachliche Beiträge sind gerne gesehen. Andere natürlich auch, sofern sie das Vorhaben im weitesten betreffen. Vorschläge für Sensoren, sowie deren Montageorte sind gerne gesehen. Vielleicht kann jemand ja auch gleich noch eine Kennlinie dazu liefern. Die finde ich leider nur bei den sündhaft teuren Markensensoren.
Programmcode
C-ähnlich:
//Bibliotheken
#include <DHT.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
//Konstanten
#define DHTPIN 4 //Pin an den der DHT22 Daten liefert
#define DHTTYPE DHT22 // Sensortyp auf DHT 22 (AM2302) definieren
DHT dht(DHTPIN, DHTTYPE); //// DHT Sensor initialisieren
//I2C LCD einbinden
#define I2C_ADDR 0x27 //I2C Adresse des LCDs lautet 0x27 (kann an der I2C Platine angestellt werden)
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
//Variablen
int sensePin =0; //Variable für ADC
float feuchte; //Beinhaltet die Feuchtigkeit in %
float temperatur; //Beinhaltet die Temperatur in °C
void setup()
{
//Serielle Verbindung konfigurieren
Serial.begin(9600);
dht.begin();
lcd.begin(16,2);
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
}
void loop()
{
Serial.print("Poti: ");
Serial.print(analogRead(sensePin)); //ADC einlesen und über serielle Verbindung ausgeben für ADC Testzwecke
//Daten aus DHT Sensor lesen und in den Variablen "feuchte" sowie "temperatur" ablegen
feuchte = dht.readHumidity();
temperatur = dht.readTemperature();
//Temperatur und Feuchte über serielle Verbindung ausgeben
Serial.print(" Humidity: ");
Serial.print(feuchte);
Serial.print(" %, Temp: ");
Serial.print(temperatur);
Serial.println(" Celsius");
lcd.clear();
lcd.setCursor(0,0); //Position im LCD (Horizontal, Vertikal)
lcd.print("A-Temp.: ");
lcd.print(int(temperatur)); //Gibt die Temperatur als ganzzahligen Wert aus
lcd.print(" ");
lcd.print((char)223); //ergibt das "°" Zeichen
lcd.print("C");
lcd.setCursor(0,1); //Position im LCD (Horizontal, Vertikal)
lcd.print("Feuchte: ");
lcd.print(int(feuchte)); //Gibt die Feuchtigkeit als ganzzahligen Wert aus
lcd.print(" %");
delay(5000); //Verzögerung um 5 Sekunden
lcd.clear(); //leert die LCD Anzeige
lcd.setCursor(0,0); //Position im LCD (Horizontal, Vertikal)
lcd.print("\357l-Temp.: "); //"\357" ergibt ein "Ö"
lcd.print("test1"); //Platzhalter für Öltermperatur
lcd.print(" ");
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,1); //Position im LCD (Horizontal, Vertikal)
lcd.print("\357ldruck: "); //"\357" ergibt ein "Ö"
lcd.print("test2"); //Platzhalter für Öldruck
lcd.print(" %");
delay(5000); //Verzögerung um 5 Sekunden
}