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

  • hier passiert nichts, weil noch gar nichts passieren soll

    Dann bin ich beruhigt. Bis ich endlich die bool Funktion am richtigen Ort hatte, das dauerte schon. Womit mir eigentlich klar ist, vieles verstehe ich immer noch nicht richtig,


    So lang ist noch Geduld gefragt

    Die habe ich, daran fehlt es nicht.


    Wenn das Programm vor Mitte Januar fertig ist, kann ich noch meinen Weihnachtsbaum Zug messen.


    Gruss Erwin



    Wer rast, der verpasst das Leben.


    Kein Platz für weitere Sammelstücke ist nur eine faule Ausrede. ;) Es gibt für alles eine Lösung.

  • TasterHandling


    Hallo Röbi, liebe Arduino-Miteiferer


    Es braucht eine kurze Zeit, bis das Display anspricht, dann taucht der eingesetzte Text auf.


    Die für mein LCD Typ B typische Programmierung ist im Anhang zu finden. Diese unterscheidet sich ja nur in einigen wenigen Zeilen.


    TasterHandling.pdf


    Gruss Peter

  • Wenn das Programm vor Mitte Januar fertig ist, kann ich noch meinen Weihnachtsbaum Zug messen.

    Ich habe mir eigentlich vorgenommen, die Speed-o-Meter Anleitung rechtzeitig ein paar Tage vor Weihnachten fertig zu haben. Dann kannst du den Weihnachtsbaum Zug noch am Weihnachtstag messen.


    Dein Weihnachtsbaum Zug ist für das Speed-o-Meter insofern interessant, weil die folgende Funktion absolut notwendig ist (kopiert aus Beitrag 64):


    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.


    Bei deinem Zug wird die Lichtschranke nach erfolgter Messung mehrmals zwischen den Wagen "durchblicken" können. Diese erwähnte Abwarte-Funktion ist bei einem solchen Zug ein absolutes "Muss", sonst würde schon beim ersten Wagen wieder eine neue Messung in die andere Richtung gestartet. Dies im Gegensatz zu einem modernen Personenzug, wo keine Durchblicke zwischen den Wagen möglich sind.

  • Hallo Peter. Schön dass das Display auch bei dir läuft.


    Die für mein LCD Typ B typische Programmierung ist im Anhang zu finden. Diese unterscheidet sich ja nur in einigen wenigen Zeilen.

    Da du glaub der einzige bist mit Typ B, erlaube ich mir, den Typ B ab sofort nicht mehr explizit zu erwähnen. Du nimmst jeweils die Version für Typ A und ergänzest die für dich typischen Anweisungen oben im Programm selbständig! Einverstanden? Vielen Dank!

  • Daten und Anzeige zurücksetzen (löschen) mit Taster


    Wir sind jetzt mit dem Keypad-, bzw. Taster-Handling soweit vorbereitet, dass wir das auch brauchen können, um die Daten, bzw. die Anzeige auf die Initialwerte zurückzusetzen.


    Wir fügen nun eine neue Funktion resetValues() ein, welche die Daten zurücksetzt und diese (zurückgesetzten) Daten auch anzeigen lässt.

    Code
    void resetValues() {
      for (byte dir = 0; dir < 2; dir++) {
        speedKilometersPerHour[dir] = 0.0;
        averageSpeed[dir] = 0.0;
        lapCount[dir] = 0;
      }
      displayResults();
    }


    In der Funktion loop() braucht es folgende Anweisungen, um die neue Funktion aufzurufen, wenn die entsprechende Taste gedrückt ist.

    Code
    void loop() {
      if (clearButtonPressed()) {
        resetValues();
      }
    }


    Nun sollte nach dem Aufstarten das Display immer noch unsere Test-Werte anzeigen. Wenn wir nun die Taste drücken (beim Typ C und D die Select-Taste und beim Typ A die gewöhnliche Taste), sollte die Anzeige Nullen anzeigen (wie im nächsten Bild).



    Hier noch das ganze Programm im aktuellen Zustand. Ab sofort werde ich die obersten Zeilen, die für das jeweilige Display notwendig sind, weglassen. Ich gehe davon aus, dass ihr die (gemäss eurem aktuellen Display) selber beifügt.


    Viel Erfolg!

  • Hoi Röbi und Mitschüler

    Ich habe ein Problem und weiss nicht an was es liegt.

    Ich habe das aktuelle Programm von Beitrag 107 übertragen.


    Beim übertragen kommt aber diese Fehlermeldung


    Die Zeile die rot hinterlegt ist zeigt dies an

       lcd.setCursor(0, dir);


    Vielen Dank für euere Hilfe

  • Und doch noch gefunden :wacko:

    Du hast es ja extra geschrieben.

    Eingefügt und nun bin ich wieder auf Kurs :thumbsup:

    Code
    #include <LiquidCrystal.h>
    
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
  • Bei mir läuft es jetzt auch. Ich hatte vorher teils eine andere Reihenfolge der Befehle und es hatte trotzdem funktioniert. Ich war zu faul um lange zu suchen ob ich den richtigen Ort für die restlichen beiden Programmteile finde, darum, nach einigen Fehlversuchen dein Programm hereinkopiert und es läuft, alles andere wäre seltsam.

    Gruss Erwin



    Wer rast, der verpasst das Leben.


    Kein Platz für weitere Sammelstücke ist nur eine faule Ausrede. ;) Es gibt für alles eine Lösung.

  • Danke euch für eure Rückmeldungen. Ich bin froh, dass es mindestens bei einigen von euch funktioniert hat.


    Erwin's Hinweis auf die Reihenfolge der Befehle hat mich dazu veranlasst, etwas klarzustellen: Unsere (selbst erstellten) Funktionen (das sind bis jetzt displayResults(), buttonPressedOnKeypad(), clearButtonPressed() und resetValues() ) dürfen natürlich in beliebiger Reihenfolge ins Programm eingefügt werden. Hingegen innerhalb der Funktionen (der Teil zwischen den geschweiften Klammern) kommt es auf die Reihenfolge der Befehle an.

  • Hola Freunde


    Bin momentan auf Dienstreise, kanns aber kaum erwarten, am Freitag ist das Jahreswerk vollbracht und dann gehts dem Arduino an den Kragen - und dazu einen schönen Scotch man gönnt sich ja sonst nichts - ich lasse vob mir hören und das nächste Mal (das hätt ich eigentlich machen können) pack ich den Arduino ein. Ich hoffe der wird nicht als Kofferbombe beschlagnahmt xD

    Bischi :hi:

  • Hallo Röbi

    Sicher, aber dazu musst du nicht extra auf die Knie! :)

    Dafür habe ich anatomisch richtig geformte Schoner! :D


    Ich kann mit dem Taster das Display zurücksetzen.


    Allerdings zeigt es mir die erste Spalte (float speedKilometersPerHour) gar nicht an, obschon sie im Programm "displayResults" sichtbar ist und ich bei beiden Sketches dieselben Befehle habe, natürlich mit fehlenden const byte KEYPAD_BUTTON_.... Zeilen im displayResults.


    Für die fehlenden Buttons in meinem LiquidCrystal werde ich wohl einige Taster mit Widerständen dazwischenschalten müssen.

    Wenn die inpVal-Werte Angaben in mA bei 5V gemeint sind, kann ich ja deren Werte berechnen; wenn nicht, Pech gehabt.


    Gruss


    Peter

  • Allerdings zeigt es mir die erste Spalte (float speedKilometersPerHour) gar nicht an, obschon sie im Programm "displayResults" sichtbar ist und ich bei beiden Sketches dieselben Befehle habe, natürlich mit fehlenden const byte KEYPAD_BUTTON_.... Zeilen im displayResults.

    Ich bin nicht sicher, was du genau meinst. Sieht das Display nicht wie in meinem Bild im Beitrag 107 aus? Falls nicht, kannst du ein Bild deiner aktuellen Anzeige und deinen Sketch posten!


    Für die fehlenden Buttons in meinem LiquidCrystal werde ich wohl einige Taster mit Widerständen dazwischenschalten müssen.

    Wenn die inpVal-Werte Angaben in mA bei 5V gemeint sind, kann ich ja deren Werte berechnen; wenn nicht, Pech gehabt.

    Ich habe bei diesem Projekt nicht im Sinn, mehr als den Select-Key zu brauchen (um die Werte zurückzusetzen). Da reicht ein gewöhnlicher Taster bei dir. Falls du mehr vorhast und weitere Taster einsetzen willst, kannst du die Spannungsteiler-Schaltung der Keypad Shield Hersteller nachbauen. Allerdings, da du ja mit dem Typ B einige Eingänge sparst (gegenüber den Typen A, C und D), könntest du es dir leisten, noch weitere Taster mit je einem eigenen Eingang zu versehen.

    Die inpVal-Werte sind übrigens nicht mA bei 5V, sondern abstrakte Werte im Bereich 0 ... 1023 für die am A0 anliegende Spannung (Wert 0 für 0V, Wert 1023 für 5V). Dazwischen kannst du linear interpolieren.

  • Hallo Röbi

    So sieht mein Display gemäss dem Programm "displayResult" in Deinem Beitrag #80 aus:

    Korrekt! displayResults #80.pdf


    nun kommen wir zum "ResetValues":

                


    Bleibt stur auf diesen Zahlen sitzen. gelöscht

    es fehlt jeweils die erste Spalte.

    ResetValues.pdf


    Ich habe zum Vergleichen die beiden unterschiedlichen Programme mit angehängt. Ich habe die 6 const byte KEYPAD...... Zeilen im Verdacht, da der Rest bis und mit "void setup" identisch ist.


    Gruss


    Peter

  • Ich habe zum Vergleichen die beiden unterschiedlichen Programme mit angehängt. Ich habe die 6 const byte KEYPAD...... Zeilen im Verdacht, da der Rest bis und mit "void setup" identisch ist.

    Peter, die 6 Konstanten kannst du löschen. Die werden nur von denen mit Typ C oder D gebraucht. Die sind aber nicht der Grund für den Fehler in der Anzeige.


    Der Grund für den Fehler ist eine kleine Abweichung in der Funktion displayResults(): Beim ersten Mal lcd.setCursor() steht in der funktionierenden Version (0, dir) und bei der fehlerhaften Version (6, dir). Das führt dazu, dass links (bei Spalte 0) nichts geschrieben wird, aber dafür bei Spalte 6. Beim zweiten Vorkommnis von lcd.setCursor() überschreibst du die Anzeige in Spalte 6 mit neuen Werten.