Sturzi's Arduino-Bastelprojekt #2 - Speed-o-Meter und Rundenzähler mit Infrarot-Lichtschranken

  • Eben wollte ich mein Display Typ A (Bestellnr. 420052b) testen. Aber da ist nix mit anstecken am Board. Ich muss zuerst noch eine Steckerleiste anlöten (?). Dieses Display ist definitiv nicht zu empfehlen.

    Hallo Kurt

    Tut mir leid. Der Typ A aus dem Arduino-Starter-Kit hat eine Steckerleiste. Ich habe auch nicht realisiert, dass das von der Bastelgarage ohne Steckerleiste ist.

    Wenn du willst, sende ich dir einen Typ C und nehme deins an Zahlung.

  • Hallo Röbi


    Nein, das ist schon o.k., wieder einmal löten um nicht aus der Übung zu kommen. Das Display habe ja von der Bastelgarage ;-) .

    Gruss
    Kurt

  • Hallo Röbi


    Auch bei mir läuft Display Typ C wie gewünscht

    Grüsse

    Rolf

    ---------------------------------------------------------------------------------------------------------------------------------

    K-Gleis, CS3 + 3xBooster, Intel Xeon, Win 10-64, iTrain 5.x PRO, uCon S88 Master, Qdecoder und ESU Servodecoder

    Fahrzeuge von Märklin, Roco, HAG, Liliput uvm.


    Meine Anlage: Homepage

    Modellbahn Verwaltung: MobaVer

    Mein YouTube Kanal: rfnetch

  • Spezifikation Speed-o-Meter


    Immer noch im Rahmen des Prologs wollen wir doch einmal festhalten, was unser Speed-o-Meter können soll. Deshalb habe ich eine Spezifikation entworfen. Diese dient als Basis. Vorschläge zu Ergänzungen oder Abweichungen von eurer Seite sind denkbar.


    Benötigtes Material:

    • 1 Arduino Uno
    • 1 Breadboard
    • 1 Display 16 x 2
    • 2 IR-Lichtschranken mit 3-adrigen Kabel
    • 1 Taster (bei Display Typ C oder D kann einer der integrierten Taster verwendet werden
    • einige Jumper-Kabel


    Montage:

    Die beiden IR-Lichtschranken werden an einem geraden Gleis befestigt, sodass der Abstand zwischen den beiden Lichtschranken mindestens ca. 500 mm beträgt. Nach oben gibt es keine Begrenzung. Je grösser der Abstand, desto genauer wird die Messung, aber desto länger dauert sie auch. Der effektive Abstand muss so genau wie möglich gemessen werden. Dieser Wert (in mm) wird im Programm benötigt.

    Die seitliche Position zum Gleis soll so sein, dass der Abstand zwischen IR-Sensor, bzw. IR-Lampe (das sind die blauen und schwarzen Glas-Halbkugeln) und dem Lok-, bzw. Wagenkasten etwa 2.5 mm (+/- 1 mm) beträgt.

    Beide Lichtschranken sollten mit Hilfe des aufgelöteten Potentiometers so eingestellt werden, dass ein Test-Objekt (z.B. ein Karton von einer mittelhellen Farbe, weder schwarz noch weiss) im Abstands-Bereich von 10 mm bis 25 mm vor den IR-Komponenten erkannt wird (das sieht man mit Hilfe der grünen LED auf der Lichtschranke).

    Die Verkabelung (gilt für die Kabel, die ich konfektioniert habe) soll wie folgt sein: An der Lichtschranke VCC auf rot, GND auf schwarz und DO auf weiss, AO bleibt offen. Am Arduino, bzw. Breadboard rot auf 5V, schwarz auf Ground und weiss an je einen freien I/O-Pin.


    Betrieb:

    Das Speed-o-Meter soll während der Entwicklung an der IDE angeschlossen betrieben werden können. Allenfalls wird der Serial Monitor für die Fehlersuche oder für's Testen benötigt.

    Nach abgeschlossener Entwicklung und erfolgreicher Inbetriebnahme, soll er ohne IDE betrieben werden können. Dazu muss er entweder über das USB-Port mit 5V DC oder über den Power-Anschluss (Barrel-Jack) mit 7 - 12 V DC gespeist werden.


    Bereitschaft:

    Nach dem Aufstarten des Speed-o-Meter soll dieser sofort für eine Messung bereit sein.

    Nach einer erfolgten Messung versucht das Speed-o-Meter zu erkennen, wann die ganze Lok, bzw. der ganze Zug die zweite Lichtschranke passiert hat. Nun wartet es noch eine ganz kurze Zeit (parametrierbar) und geht dann automatisch wieder in Bereitschaft für die nächste Messung.

    Nach einer oder mehreren Messungen können die gespeicherten Daten für die Anzahl Messungen und für die Durchschnittsgeschwindigkeit mit Hilfe des Reset-Tasters wieder zurückgesetzt (gelöscht) werden. Hier ist mit Reset-Taster nicht die Arduino-Reset-Taste gemeint, die den ganzen Arduino neu startet, sondern der zum Speed-o-Meter gehörende Taster.


    Messung:

    Gemessen wird die Zeit, die eine Lok oder ein Zug benötigt, um von einer Lichtschranke zur anderen zu fahren.

    Die Messung beginnt mit dem Moment, wo das Speed-o-Meter an einer der beiden Lichtschranken eine Lok (oder einen Zug) erkennt und endet, wenn es die Lok oder den Zug an der anderen Lichtschranke erkennt. Beide Fahrrichtungen sollen ohne vorgängige Einstellungen möglich sein. Wenn die Messung beendet ist, muss das Speed-o-Meter abwarten, bis der Rest der Lok, bzw. des Zuges aus dem Bereich der Lichtschranken gefahren ist, bevor es wieder für die nächste Messung bereit ist. Bei einem Zug ist es möglich, dass die Lichtschranke kurz zwischen zwei Wagen durchblickt (dies kann besonders bei einem Güterzug) vorkommen. Damit es in so einem Fall nicht meint, der Zug sei schon vorbei und beim nächsten Wagen nicht schon wieder eine neue Messung startet, muss noch eine kurze Zeit abgewartet werden (einstellbar, ca. 2 bis 3 Sekunden). Erst dann geht es davon aus, der Zug sei vorbei und macht das Gerät für die nächste Messung wieder bereit.


    Berechnung und Anzeige:

    Unmittelbar nach erfolgter Messung wird die Geschwindigkeit ausgerechnet und auf dem Display angezeigt.

    Auf der oberen Zeile des Display wird die Geschwindigkeit des Modells in mm/s (oder m/s) und die entsprechende Geschwindigkeit für das Vorbild in km/h angezeigt. Hier handelt es sich um die bei der aktuellen Vorbeifahrt gemessene Geschwindigkeit.

    Auf der unteren Zeile werden die Anzahl Messungen, bzw. die Anzahl Runden (das ist dasselbe) und die Durchschnittsgeschwindigkeit angezeigt. Beides versteht sich seit dem letzten Reset, bzw. seit dem Aufstarten des Speed-o-Meters.

    Es wird im Rahmen der Entwicklung selbstverständlich möglich sein, die Anzeige individuell anzupassen (z.B. falls jemand die Geschwindigkeit lieber in Knoten oder Mach angezeigt hätte).


    Parametrierung:

    Um aus der gemessenen Zeit die richtige Geschwindigkeit für das Modell und die entsprechende für das Vorbild richtig anzeigen zu können, müssen folgende Werte als Parameter einprogrammiert werden:

    • Abstand zwischen den beiden Lichtschranken in mm
    • Masstab der Modellbahn (1:160, 1:87, 1:45, 1:32, ...)
  • N'Abend Röbi


    wäre es technisch irgendwie möglich, den Massstab , oder auch die Masseinheit (Metrisch/Imperial) mittels Knopfdruck (ich denke da an die Pfeiltasten des Displayshield) umzuschalten?


    Grüsse Bischi...


    EDIT: nicht im Sinne von: muss es können - nichts läger mir ferner… sondern einfach als Frage in die Arduinoerfahrenenrunde was das kleine Ding so kann.


    Ich hab schon Freude, dass ich heute selber eine „Chilbibeleuchtung“ vollständig selber programmiert hab „#wooow blinkendelämpli“


    So einfach kann man Freude machen :D

    Bischi :hi:

    Einmal editiert, zuletzt von Lokidokter ()

  • wäre es technisch irgendwie möglich, den Massstab , oder auch die Masseinheit (Metrisch/Imperial) mittels Knopfdruck (ich denke da an die Pfeiltasten des Displayshield) umzuschalten?

    Hallo Bischi


    Ja, das können wir am Schluss des Projektes, quasi als Zugabe auch noch programmieren. Das ist einfach. Etwas aufwändiger wird es, wenn die Einstellungen "sustainable" sein sollen, d.h. wenn nach einem Neustart des Speed-o-Meters die letzte Einstellung immer noch die Aktuelle sein soll.

  • Au das wär ja ganz fein. Das mit dem Gedächtnis könnte man sicher auch einfacher lösen: jeder programmiert beim Programmieren quasi seine Präferenz als Standartwert ein, bspw metrisch 1:87 H0 und wenns mal was anderes sein soll, drückt man sich durch den Menübaum. (Erinnert mich an das Funkgerät vom Militär. Da haben wir auch gewisse Parameter nach dem ein- und aussschalten immer neu einstellen müssen.


    Übrigens: auch der 2x16 LCD erinnert mich ungemein an den Bildschirm des Funkgerätes - Backflash lässt grüssen.

    Bischi :hi:

  • Hallo Röbi


    Die Steckerleiste am Display Typ A habe ich angelötet. Aufstecken aufs Board klappt prima, wirkt recht stabil.

    Verkabelung ist natürlich schon eine Fummelei. Aber - das Ding funzt einwandfrei. Test bestanden.

    Gruss
    Kurt

  • Verfügbarkeit von freien Ein- und Ausgängen bei den verschiedenen Display Typen


    Für das Projekt benötigen wir neben dem Display noch drei digitale Eingänge (zwei für die Lichtschranken und einen für den Taster). Die Pins 0 und 1 sollten möglichst nicht verwendet werden, da sie für die serielle Kommunikation gebraucht werden. Auch den Pin 13 würde ich eher vermeiden, weil er mit der aufgelöteten LED 13 verbunden ist, was gelegentlich irritieren kann. Jetzt bleiben nicht mehr viele übrig, aber es reicht gerade. Selbst wenn es nicht reichen würde, hätten wir immer noch die analogen Pins, die man auch als digitale konfigurieren kann.


    Display Typ A: Wenn es nach meinem Vorschlag im Beitrag 35 verkabelt ist, werden die Pins 2 bis 5, sowie 11 und 12 für das Display gebraucht. Die Pins 6 bis 10 stehen noch zur Verfügung (wenn wir 0, 1 und 13 vermeiden wollen).


    Display Typ B: Dieser kommuniziert über den I2C-Bus mit dem Arduino und ist daher an die Pins A4 und A5 angeschlossen. Daher sind hier alle digitalen Pins noch frei. Auch hier würde ich auf die Pins 0, 1 und 13 eher verzichten.


    Display Typen C und D: In der Anweisung LiquidCrystal lcd(8, 9, 4, 5, 6, 7) sieht man, welche Pins vom Display verwendet werden. Zusätzlich wird auch Pin 10 gebraucht (für die Hintergrundbeleuchtung). Die Pins 2, 3, 11 und 12 stehen noch zur Verfügung (wenn wir 0, 1 und 13 vermeiden wollen).


    Anschlüsse Typ C: Im Gegensatz zum Arduino selber, wo die Pins als Buchsen verfügbar sind, sind es hier beim Shield Stiften. Die 9 Stiften der Stiften-Leiste oben rechts sind intern wie folgt verbunden (von links nach rechts): 13, 12, 11, 3, 2, 1, 0, Gnd, 5V. Weil die von mir gelieferten Kabel Arduino-seitig mit Stiften enden, müssen sie über das Breadboard (dafür sind sie eigentlich vorgesehen) oder mit Jumper-Kabel (female-female) verbunden werden.

    Anschlüsse Typ D: Hier kommt man leider um's Löten nicht herum, weil die Pins nur als Löt-Ösen auf das Shield geführt werden. Die 7 Löt-Ösen rechts oben sind intern wir folgt verbunden (von links nach rechts): 13, 12, 11, 3, 2, 1, 0. Bei den unteren Löt-Ösen, unmittelbar rechts der Taster, stehen Gnd und 5V zur Verfügung. Diese sind 1:1 mit dem Arduino verbunden. Man sieht auf dem Arduino, welcher Pin was ist.

    Wer will kann bei mir ein Set Buchsenleisten für die drei Löt-Ösen-Gruppen gemäss unten stehendem Bild beziehen (gratis). Die kann man auflöten und dann stehen wiederum Buchsen zur Verfügung wie direkt auf dem Arduino. Und wer à tout prix nicht löten will, kann bei mir seinen Typ D gegen einen Typ C eintauschen.


  • Ergänzung zur Spezifikation Speed-o-Meter (Beitrag 64)


    Eine sinnvolle Anforderung ist mir noch in den Sinn gekommen. Diese möchte ich hier als Ergänzung zur Spezifikation noch festhalten:


    Der Durchfahrts-Zähler und die Durchschnittsgeschwindigkeit soll pro Fahrrichtung separat geführt werden. Bei Messungen, wo hin- und hergefahren wird, kann so die Geschwindigkeit für die Vor- und Rückwärtsfahrt separat ausgewiesen werden. Das kann helfen, wenn man das Speed-o-Meter für das Einmessen von Triebfahrzeugen einsetzt.


    Als Konsequenz können wir nur noch eine Geschwindigkeits-Einheit (m/s beim Modell oder km/h beim Vorbild) anzeigen. Jeder individuelle Entwickler soll aber seine bevorzugte Einheit wählen können.

  • Hallo Röbi,


    Das ist eine tolle Idee. - Besonders interessant für Schlepptender-Dampflokomotiven, die ja rückwärts bekanntlich langsamer fahren können.


    Gruss


    Roland

  • 1. Dezember 2022: Projekt-Start


    Ich habe ja versprochen, Anfangs Dezember mit dem Projekt zu starten. Das ist heute.


    Für die Programm-Entwicklung des Speed-o-Meter platziere ich die beiden Lichtschranken noch nicht mit Hilfe der Böckli ans Gleis, sondern verwende folgenden Aufbau:



    Die beiden Lichtschranken sind hier einfach auf das Breadboard aufgesteckt und haben einen Abstand von 97 mm voneinander. Rechts auf dem Breadboard sieht man den Reset-Taster für das Zurücksetzten der gespeicherten und angezeigten Werte. Statt mit einem vorbeifahrenden Zug aktiviere ich die Lichtschranken mit den Fingern. Ihr könnt es aber genau so gut an einem Gleis aufstellen und mit einem Schienenfahrzeug testen.


    Startet in der IDE ein neues Projekt "Speed-o-Meter" und erfasst folgendes Programm (natürlich angepasst auf eure Umgebung):



    Zeilen 1 und 3: Hier sind die bereits bekannten Statements für das Display. Diese müssen zum jeweils verwendeten Display-Typ passen (siehe Beiträge 35, 36 und 50). Beim Typ A muss auch die aktuelle Verkabelung mit den Werten in den Klammern auf Zeile 3 übereinstimmen.


    Zeile 5: Die Konstante RAILWAY_SCALE muss den Massstab deiner Modellbahn enthalten (hier 1:87 für H0). Wir könnten den Faktor auch ausrechnen und den Wert 0.01149 eingeben. Aber lassen wir das doch durch den Compiler ausrechnen. Die Angabe 1.0 / 87.0 ist auch sprechender. Dass wir für Spur 0 hier 1.0 / 45.0 angeben müssen, dürfte wohl klar sein.


    Zeile 6: Hier muss der Abstand zwischen den beiden Lichtschranken (im Programm nenne ich sie Light-Beams) stehen. Meine 97 mm gelten für den Versuchs-Aufbau. Für den produktiven Betrieb wäre das viel zu kurz und damit zu ungenau. Jedesmal wenn die Lichtschranken umpositioniert werden, muss dieser Wert angepasst werden.


    Für die beiden Konstanten auf den Zeilen 5 und 6 verwenden wir den Datentyp float. Dieser kann reelle Zahlen (nicht nur ganze) mit einer Genauigkeit von ca. 6 geltenden Ziffern aufnehmen. Diese Genauigkeit reicht für unser Projekt längstens.


    Zeilen 8 bis 10: Hier definieren wir die Pins der drei verwendeten digitalen Eingänge. Die Namen, die ich hier verwendet habe, müssten eigentlich selbsterklärend sein. Selbstverständlich müssen die Pins mit eurer aktuellen Verkabelung übereinstimmen.


    Zeile 13: Hier initialisieren wir den Serial Monitor (für den Fall, dass wir ihn zum Test und zur Fehlersuche brauchen).


    Zeile 14 bis 16: Die drei verwendeten Pins sollen als digitale Eingänge verwendet werden.


    Zeile 16: Eine Besonderheit beim Eingang des Push Buttons (Tasters): Der Pin wird nicht nur auf INPUT gesetzt wie bei den Lichtschranken, sondern auf INPUT_PULLUP. Wenn der Taster nicht gedrückt ist, würde der Eingang "in der Luft" hängen, d.h. er wäre (auf Grund unserer Schaltung) weder mit Ground noch mit 5V verbunden. Da dies Pins mit einer hohen Impedanz (Widerstand) sind, wäre dieser Eingang Einstreuungen (magnetische und elektrische Felder) von aussen unterworfen. Mit anderen Worten: Er wäre weder eindeutig LOW noch eindeutig HIGH. Um dies zu verhindern sind die Eingänge auf dem Arduino mit sogenannten Pullup-Widerständen ausgerüstet, die elektronisch zugeschaltet werden können (Parallelschaltung). Das geschieht mit der Angabe von INPUT_PULLUP beim pinMode Befehl. Damit wird der Eingang durch den Widerstand auf 5V gezogen. Erst wenn wir den Taster betätigen, wird er durch diesen auf Ground gesetzt. Damit haben wir immer eindeutig einen der Zustände HIGH (Grundzustand) oder LOW (Gedrückt-Zustand).


    Zeile 18: Damit initialisieren wir das Display. Wir teilen dem Programm mit, dass wir ein Display von 16 Spalten und 2 Zeilen haben.


    Zeile 19: Die Anzeige auf dem Display wird gelöscht. Damit stellen wir sicher, dass wir im Leer-Zustand starten.


    Für das Display vom Typ B braucht es hier noch den Befehl lcd.init().



    Das Programm müsste soweit compilierbar sein, aber es macht natürlich noch nichts Nützliches.

  • „Tut noch nichts nützliches“


    Oh doch! Die LED an den Sensoren leuchten grün… und wer meine Beiträge verfolgt weiss, dass ich leuchtende LED mag…


    Also macht es Freude und ist so schon mal als Freudenmacher tauglich <3

    Bischi :hi:

  • Hoi Röbi

    Nun klappt das auch bei mir:

    Mein Arduino ist auf einem Board aufgeschraubt, auf dem auch das Steckbrett aufgeklebt ist. Ich habe den Typ D mit einem Poti "22" (brauchte nur 22 Umdrehungen zum Scharfstellen).

    Gruss Oski


    Beim Typ D fehlen die Ösen der digitalen Anschlüsse Nr, 0, 8, bis 13. Man kann hier die angebotenen Steckleisten nicht aufstecken oder anlöten.

    signatur_egos.jpg

    ...auch Nichtraucher können süchtig sein nach Zündhölzern!

    Einmal editiert, zuletzt von egos () aus folgendem Grund: Ergänzung

  • Hoi Röbi

    Das habe ich, aber offensichtlich nicht verstanden. Kannst du mir die kleinen Stiftsteckerleisten zusenden? Ich hoffe, das kann ich dann anlöten. Meine Kolbenspitze ist zwar gefühlt so breit, wie drei Ösen, mal sehen,

    Gruss Oski

    signatur_egos.jpg

    ...auch Nichtraucher können süchtig sein nach Zündhölzern!

  • Planung und Programmierung der Anzeige auf dem Display


    Wir haben alle einen Display, der 2 Zeilen à 16 Zeichen anzeigen kann. Nun wollen wir die Anzeige für das Speed-o-Meter planen und anschliessend eine Funktion erstellen, die unsere Werte entsprechend formatiert auf dem Display anzeigt.


    Für den heutigen Schritt kann es durchaus sein, dass ihr nicht alles im Detail versteht. Das macht nichts. Die Hintergründe über die angewendeten Programmier-Techniken werde ich entweder in späteren Threads oder im Grundlagen-Thread #0 erklären.


    Die Idee ist, dass ihr diese Funktion (mit den zugehörigen Variablen) übernehmt, ausprobiert und damit etwas experimentiert. Ich empfehle euch, dafür ein neues Projekt zum Experimentieren aufzumachen. Ich nenne solche Ausprobier-Projekte z.B. Sandbox (Sandkasten zum Spielen). Im ernsthaften Speed-o-Meter Projekt übernehmen wir nur gültige Programmteile. Hier sollten wir mit Experimentieren etwas zurückhaltend sein, sonst gibt es ein Puff. Wenn das Experimentieren in der Sandbox abgeschlossen ist, könnt ihr die Programme nochmals von hier ins "richtige" Projekt übernehmen.




    Die obere Zeile soll für die Messwerte der Fahrten von links nach rechts (Vorwärtsfahrten) und die untere für die Fahrten von rechts nach links (Rückwärtsfahrten) verwendet werden.

    Es sollen pro Zeile vier Anzeige-Felder vorkommen.

    Das ersten beiden (dargestellt durch xxx.x) sollen numerische Anzeigen mit Dezimalpunkt für Zeit (in Sekunden), bzw. für Geschwindigkeit (in km/h) sein.

    Die Felder xx sind für die Anzahl Messungen (= Anzahl Vorbeifahrten = Rundenzähler) vorgesehen.

    Und das letzte Feld (rechts mit dem *) dient dazu, den aktuellen Status anzuzeigen.


    Um Werte auf dem Display anzeigen zu können, brauchen wir auch die entsprechenden Datenfelder (Konstanten und Variablen) im Programm. Weil dies globale Werte (sichtbar im ganzen Programm) sein sollen, werden diese oben (vor der setup() Funktion) definiert.

    Die Phantasie-Werte in den Geschweiften Klammern (Zeilen 5 bis 7) habe ich zum Testen so gewählt, damit etwas Sinnvolles angezeigt wird. Die müssen später auf 0.0, bzw. auf 0 gesetzt werden.

    Code
    const float MAX_VALUE_FOR_KM_PER_HOUR = 999.9;
    const int MAX_VALUE_FOR_LAP_COUNT = 99;
    const unsigned int MAX_VALUE_FOR_ELAPSED_TIME = 999.9;
    
    float speedKilometersPerHour[2] = {95.1, 103.2};
    float averageSpeed[2] = {96.6, 102.8};
    int lapCount[2] = {4, 3};                       // Rundenzähler

    Es wäre sehr plump programmiert, wenn wir für diese drei Werte je zwei Variablen mit leicht unterschiedlichen Namen verwenden würden. Hier drängt sich die Verwendung von Arrays geradezu auf. Mit der Angabe [2| hinter dem Variablen-Namen definieren wir, dass es jeweils zwei Felder gibt. Das erste davon (für Vorwärtsfahrt) wird mit dem Index 0 und das zweite (für Rückwärtsfahrt) mit dem Index 1 angesprochen (bei der Programmierung fangen wir ja mit 0 an zu zählen).


    Und nun die Funktion displayResults(), welche die Werte formatiert und anzeigt. Diese Funktion soll unterhalb von loop() angehängt werden.

    Zeile 2: Hier wird ein Array vom Typ char und der Länge 6 Bytes definiert. In diesem können die formatierten Werte gespeichert werden, bevor sie angezeigt werden. Ein solcher char Array muss immer um ein Byte länger sein als sein Nutzinhalt (Also 6 Bytes statt Nutzinhalt 5). Nehmt das an dieser Stelle einfach mal zur Kenntnis.


    Zeile 4: Hier starten wir eine sogenannte Iteration in Form eines for-Loops. Tönt kompliziert, ist aber einfach: Alles zwischen hier und der zugehörigen schliessenden geschweiften Klammer auf Zeile 28 (also alles ab Zeile 5 bis und mit Zeile 27) wird mehrmals hintereinander (hier genau zwei Mal) durchlaufen. Beim ersten Durchlauf ist der Wert der Variablen dir = 0 und beim zweiten Mal ist er 1. Der Begriff dir steht für Direction, also Fahrrichtung. Also beim ersten Durchlauf (wenn dir = 0 ist) bearbeiten wir die erste Display-Zeile (Vorwärtsfahrt) und beim zweiten Mal (wenn dir = 1 ist) bearbeiten wir die zweite Zeile (Rückwärtsfahrt). Auch das muss man im Moment nicht unbedingt genau verstehen.


    Zeilen 5 bis 11: Hier zeigen wir die aktuell gemessene Geschwindigkeit im ersten Anzeigefeld des Displays an. Der aktuelle Wert von dir zeigt uns jeweils an, ob es um die obere oder die untere Zeile geht.

    Zeilen 5 und 6: Sollte aus irgend einem Grund ein gespeicherter Wert so gross sein, dass er in den geplanten Feldern nicht mehr angezeigt werden kann, wollen wir das nicht dem Schicksal überlassen, sondern eindeutig dem Anwender zeigen, dass da etwas schief gelaufen ist. Das machen wir, indem wir den buffer mit lauter Sternen füllen, die dann auf dem Display angezeigt werden.

    Zeilen 8 bis 9: Im anderen Fall (wenn der gespeicherte Wert plausibel ist) formatieren wir ihn ins gewünschte Format (5 Stellen insgesamt und eine Stelle nach dem Dezimalpunkt). Das Ergebnis wird in buffer geschrieben.

    Zeilen 10 und 11: Der gewünschte Wert steht nun im buffer zur Verfügung. Wir setzten die gewünschte Position (Spalte 0, Zeile abhängig von dir) im Display mit der Funktion lcd.setCursor() und dann schicken wir den Inhalt von buffer zum Display.


    Die nächsten beiden Gruppen à 7 Zeilen sind genau gleich aufgebaut und funktionieren nach dem gleichen Muster. Der buffer kann jeweils wiederverwendet werden.


    Die Status-Anzeige in der Spalte 15 (das ist die ganz rechts) mit einem Stern werden wir in einem anderen Beitrag behandeln.



    Hier nochmals das ganze Programm, das so ausführbar sein müsste (denkt daran, oben im Programm eure Display-Gegebenheiten anzupassen):



    Auf dem Display müsste es jetzt so aussehen: