Sturzi's Arduino-Bastel-Projekt #1 - Es werde Licht

  • Meine Idee (damit ich mir sicher gewesen wäre die Befehle verstanden und selbstständig erweitert zu haben), war es ja eigentlich zwei LEDs mit zwei verschiedenen, zufälligen Parametern zB:(millisToWait = (random(100,2000)) und (millisToWait = (random(1000,10000))zu programmieren die überschneidend sein könnten.

    Andy, ich habe dir die Antwort dazu schon gepostet. Aber unsere letzten Beiträge haben sich scheinbar gekreuzt.

  • Danke Röbi für Deine schrittweise Anleitung.

    Ich habe heute einen Starterkit bestellt und bin bis zum Erhalt nur "Theorie"-Schüler ;)

    Freue mich aufs Ausprobieren.

    Gruss Urs

    __________________________________________________________________________________

    34 Tank-SCC / 4 Kasten-SCC und noch viele Nummernvarianten möglich :D:whistling:

    Wer mehr über diese Materie wissen möchte: www.containercars.ch

  • Guten Abend Röbi und alle Mitschüler

    Heute würde ich nach Schulschluss sagen:

    Gott sei Dank ist der Unterricht vorbei, und

    hat jemand die richtigen Antworten damit ich abschreiben kann? :facepalm:

    Ich habe es nicht zum laufen gebracht und auch nach xfachem Vergleich finde ich den Fehler nicht


    mein Skribt

    und zu meinem Gestehen kann dem bis jetzt auch nicht wirklich folgen. Entschuldigung

    Ist hier meine Schulstunde schon vorbei? :dash:

  • Übrigens liegt es bestimmt nicht am Lehrer oder an der super detailierten Beschreibung.

    Röbi, du machst das perfekt. :thumbsup:

    Es liegt bestimmt nur an mir und an meinem zuengen Horizont

  • Hand heb


    schau dir mal Zeile 1 und 3 an - ich würde sagen, du hast da einen Schreibfehler in der Variablen-Definition (chance statt change)

  • Ja, es ist so wie Markus schreibt.

    Du hast dich bei der Deklaration der beiden Variablen auf Zeile 1 und 3 vertippt.

    Auf Zeile 15 und 18 meldet das System nun Fehler (die Zeilen sind farbig hinterlegt), weil es die beiden Variablen nicht kennt.

    Die Korrektur musst du auf den Zeilen 1 und 3 machen (...Change und nicht ...Chance).

  • Hoi Röbi und Markus

    Schreibfehler behoben und es funktioniert wunderbar. :thumbsup:

    Ich dachte der Fehler sei bei den rot hinterlegten Zeilen. :wacko:

    Jetzt blinken die LEDs durcheinander und zufällig. Super

    Danke euch

  • Schreibfehler behoben und es funktioniert wunderbar.

    Freut mich für dich!


    Ich dachte der Fehler sei bei den rot hinterlegten Zeilen.

    Aus der Sicht des Compilers ist der Fehler schon bei den rot hinterlegten Zeilen 15 und 18. Der Compiler weiss ja nicht, dass es richtigerweise ...Change heissen sollte. Er hat das (für uns falsche) ...Chance auf den Zeilen 1 und 3 für bare Münze genommen und auf den Zeilen 15 und 18 Namen festgestellt, die er noch nicht kennt. Deshalb hat er dort gemotzt.

  • Unabhängiges, zufallsgesteuertes Blinken mit zwei LEDs, Einschaltdauer und Ausschaltdauer unterschiedlich


    Basierend auf dem letzten Programm machen wir jetzt ein paar Modifikationen.

    - Wir wollen zwei LEDs unabhängig voneinander mit zufälligen Zeiten blinken lassen.

    - Die Dauer des ausgeschalteten Zustandes soll im Mittel länger sein als die Dauer des eingeschalteten Zustandes.

    - Wir werden symbolische Konstanten kennenlernen und diese wie die Profi-Programmierer sinnvoll anwenden.


    Hier zu Beginn nochmals die Ausgangslage, also die letzte Version des Programmes:



    Und jetzt die neue Version:



    Für heute läuft mir die Zeit davon. Ich werde die Erklärungen zu den neuen Konstrukten erst morgen anbringen können.


    Bis dann wäre es gut, wenn du das Programm nachvollziehen könntest. Probiere es zu verstehen, auch wenn die entsprechenden Erklärungen noch fehlen! Über Rückmeldungen bin ich froh. Fragen werde ich gerne beantworten, aber erst morgen.


    Noch ein Hinweis für die Experten unter euch: Es ist klar, dass man so etwas besser mit Arrays löst. Aber ich will ja in kleinen Schritten vorrücken.

    Also eine Version mit Arrays für beliebig viele LEDs demnächst in diesem Theater.

  • Lieber Röbi

    Spannend und ausführlich ist deine Schulung. Auch ich lese gerne deinen Thread und bin fasziniert an den Möglichkeiten dieser Wunderdinger. Noch habe ich freie Lichtausgänge an meinem Qdecoder. Wenn diese vollständig bestückt sind, werde ich deinen Thread als Lehrmittel zu Rate ziehen und mich von CV's verabschieden und in die Welt der Arduino Steuerbefehle einarbeiten.

    GRuess Andy


    Bauweise: Modulbahn mit eigener Norm
    Thema: Mitteland / Jura / Bahnhof Bipp
    Gleismaterial: Peco Code 75, Rocoline
    Steuerung: ESU Ecos SW 4.2.10
    Decoder: Weichen: ESU Switchpiloten, Signale / Licht: Qdecoder
    Melder: ESU Detektoren
    Software: Modellstellwerk 10.6, Darstellung: SBB Iltis

  • Hoi Röbi

    Noch ein Hinweis für die Experten unter euch: Es ist klar, dass man so etwas besser mit Arrays löst. Aber ich will ja in kleinen Schritten vorrücken.

    Also eine Version mit Arrays für beliebig viele LEDs demnächst in diesem Theater.

    ... das nennt man "den Wind aus den Segeln nehmen" :P


    Aber Hut ab - Du machst das sehr verständlich und nachvollziehbar - auch ich lese interessiert mit und habe schon mit dem Gedanken gespielt, mir mal so ein Ding zuzulegen.


    Bisher habe ich Qdecoder für die Lichtsteuerung im Einsatz (fast ein Muss, da ich ja einer der "Gründerväter" von Qdecoder Schweiz war) ...


    Lg
    Giorgio

    Lg

    Giorgio

  • Der Starterkit ist heute angekommen und die gelbe LED habe ich zum Leuchten gebracht. :)

    Die LED leuchtet im Vergleich zu Deinem Bild sehr schwach. Obwohl ich davon ausgehe, dass ich den richtigen Widerstand verwendet habe.

    IDE ist installiert. :)

    Mit dem Programm(-ieren) geht's ab morgen weiter.


    Danke für Deine verständlichen Anleitungsschritte :thumbup:

    Gruss Urs

    __________________________________________________________________________________

    34 Tank-SCC / 4 Kasten-SCC und noch viele Nummernvarianten möglich :D:whistling:

    Wer mehr über diese Materie wissen möchte: www.containercars.ch

  • Hoi Röbi

    Auch ohne Starterkit lese ich sehr interessiert mit. Bis jetzt kann ich folgen, auch wenn das zugegebenermassen nicht beweisbar ist. Wenn ich meine Anlage einigermassen zum Laufen gebracht habe, werde ich mit solchen Tipps die Sache verfeinern.

    Gruss Oski

    signatur_egos.jpg

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

  • Andy GR, Giorgio, Urs, Oski: Vielen Dank für eure Rückmeldungen!


    @Urs: Wenn es eine LED aus dem Starterkit ist, müsste sie normal hell leuchten. Ich vermute trotzdem, dass du einen zu grossen Widerstand erwischt hast. Die Farbcodes (farbige Ringe um den Widerstand) sind leider etwas verwirrend und häufig nicht eindeutig erkennbar. Aber beim 220 Ω Widerstand müsste der Farbcode mit zwei roten Ringen beginnen (oder enden, je nachdem wie du ihn hältst). Sonst miss ihn doch mal mit einem Multimeter.

  • Hier noch ein paar Erklärungen zur letzten Version:


    Zeilen 1 bis 4: Hier definieren wir 4 symbolische Konstanten (dass sie konstant sind und bleiben, erkennt man am Wort const) mit sprechenden Namen und ordnet ihnen die zugehörigen direkten numerischen Werte zu. Beachte, dass sich diese Definitionen vor allen vorkommenden Funktionen befinden. Sie gelten damit für alles, was nachher kommt, d.h. in allen Funktionen. Innerhalt der Funktionen verwendet man die Konstanten über ihren Namen. Direkte numerische Werte (wie im vorhergehenden Beispiel) sollte man vermeiden.


    Die Verwendung von symbolischen Konstanten hat mehrere Vorteile:

    Wenn man später Anpassungen an den Werten machen muss, muss man nicht lange im Code suchen (bedenke, dass sich anspruchsvollere Programme über mehrere Seiten erstrecken können), sondern ganz oben zu Beginn.

    Wenn man die gleichen Werte im Programm mehrmals braucht (wie hier auf den Zeilen 32 und 43, bzw. 34 und 45), muss man sie bei Anpassungen nicht an jeder Stelle ändern, sondern nur an einer.

    Wenn man sich bei der Verwendung einer symbolischen Konstanten vertippt, motzt der Compiler und man korrigiert den Fehler. Wenn man sich jedoch bei der Verwendung eines direkten numerischen Wertes vertippt (z.B. 29000 statt 2000) merkt das der Compiler nicht und der Fehler tritt erst zutage, wenn man merkt, dass das Programm nicht das Richtige macht (vielleicht erst nach langer Zeit).


    Deshalb: Vermeidet die Verwendung von direkten numerischen Werten innerhalb der Funktionen. Es gibt zu dieser Regel ein paar Ausnahmen, aber darauf will ich im Moment nicht eingehen.



    Die beiden Funktionen changeStatus1() und changeStatus2() sind gleich aufgebaut. Ich werde die folgenden Anmerkungen nur für die Funktion changeStatus1 machen. Sie gelten natürlich genauso für die andere.

    Zeile 29: Weil wir den neuen LED Status zweimal brauchen, wollen wir ihn nicht zweimal mit ! digitalRead(7) ermitteln, sondern nur einmal. Dafür speichern wir ihn in einer lokalen Variablen bool newStatus.

    Dort wo wir nun den neuen Status brauchen (beim digitalWrite() und beim if) setzen wir einfach die lokale Variable newStatus ein.


    Die lokale Variable newStatus hat in beiden Funktionen den gleichen Namen. Warum motzt da der Compiler nicht? Weil sie lokal sind. Wenn eine Variable innerhalb einer Funktion deklariert wird, gilt sie nur innerhalb dieser Funktion. Deshalb gibt es da keine Verwirrung.

    Der Gegensatz dazu ist die Deklaration von Variablen vor den Funktionen, wie z.B. long millisToWait1. Solche Variablen gelten für das ganze Programm. Wenn wir auf diese Art zwei (oder mehr) Variablen mit dem gleichen Namen deklarieren würden, gäbe es vom Compiler eine Fehlermeldung.


    Die Variable newStatus ist vom Typ bool. Das bedeutet, dass es eine binäre Variable ist. Sie kann nur zwei Werte annehmen, nämlich true und false.

    Ja gopfridstutz, warum lässt sie sich denn jetzt plötzlich auf HIGH oder LOW setzen? Das ist, weil im Hintergrund vom Arduino-System HIGH zu true und LOW zu false gleichgesetzt wurde.


    Zeile 31: Die if Anweisung kennen wir schon aus der Funktion loop(). Hier kommt ein neues Element dazu, das else. Es gibt hier zwei geschweifte Klammernpaare, das nach dem if und das nach dem else. Beim ersten (nach dem if) werden die Anweisungen ausgeführt, wenn die if-Bedingung zutrifft und beim zweiten (nach dem else) werden sie andernfalls (also wenn die Bedingung nicht zutrifft), ausgeführt.


    Und zuletzt noch eine Erklärung zum == in der if-Bedingung. Das == ist ein Vergleichs-Operator. Dieser wird verwendet, um festzustellen, ob zwei Werte gleich sind.


    Sehr, sehr, sehr wichtiger Hinweis:

    Es gibt ja noch den Zuweisungs-Operator =, dem wir schon ein paarmal begegnet sind. Wir müssen pingelig darauf achten, dass wir die beiden nicht verwechseln. Das ist im C++ eine der häufigsten Fehlerquellen. Wenn wir in einer if-Anweisung schreiben if (newStatus = LOW) statt if (newStatus == LOW), macht unser Programm etwas ganz anderes. Der Compiler bemerkt den Fehler nicht. Das ist nicht ganz einfach zu verstehen. Don't worry! Für jetzt ist die Moral von der Gechicht: Immer höllisch aufpassen bei einer if-Anweisung, dass man nicht = verwendet, sondern ==.


    Genug für heute, bevor die Köpfe zu rauchen beginnen!

  • Für diejenigen unter euch, die mit diesem Projekt zum ersten Mal mit Programmierung konfrontiert werden:


    Wenn man programmieren lernt, ist es so gut wie unmöglich in jeder Lernphase alles Erklärte zu verstehen. Man muss damit leben können, gewisse Details einfach hinzunehmen, ohne sie zu verstehen. In der Regel werden sie später dann schon klar.


    Andererseits ist es für mich auch nicht möglich, immer alles zu erklären, was für das Verständnis des aktuellen Programmes eigentlich nötig wäre. Ich müsste so viel schreiben, dass es kaum jemand mehr lesen würde.


    Also, wenn etwas nicht klar ist, einfach so übernehmen, wie ich es programmiert habe. In einer späteren Phase "keit de Zwänzger plötzlich abe".

  • Vielen Dank Röbi, Du hast mit dem Widerstand recht. Im Schummerlicht :rolleyes: habe ich die zwei roten Ringe nicht gesehen.

    Nun ist die Leuchtkraft tip-top.

    Dank Deiner verständlichen Anleitung kann ich auch Erfolgsmeldungen bis zur einzelnen LED mit intelligentem Blinken vermelden :D

    Die zwei LED-Varianten werde ich auch noch ausprobieren.

    Den beschreibenden Teil muss ich in Ruhe auch noch durchlesen, um ein besseres Verständnis für die Programmierung zu erhalten.

    Es macht sehr viel Spass!

    Gruss Urs

    __________________________________________________________________________________

    34 Tank-SCC / 4 Kasten-SCC und noch viele Nummernvarianten möglich :D:whistling:

    Wer mehr über diese Materie wissen möchte: www.containercars.ch