Mehrere LED's via GPIO steuern

  • einem lauflicht mit einer angesteuerten led eine anzeige zu machen bei der mehr als eine led angesteuert wird. Der rest ergibt sich selbst.

    Nein, da ergibt sich wenig von selbst. Wenn Du noch Probleme hast, ein so einfaches Konstrukt wie Deinen Code, der nur wenig über „Hello world“ hinausgeht, zu verstehen, dann besorg Dir doch bitte tatsächlich erst einmal ein Grundlagenbuch oder welches Medium auch immer, um basale Methoden und Strukturen einer Programmiersprache kennenzulernen.

    Ich weiß jetzt grad nicht, wer es immer schreibt, aber es ist genau so: Programmieren ist nicht raten oder copy&paste. (1) Das ist wirklich machbar, wenn Du es strukturiert angehst - und sinnvoll investierte Zeit allemal. Aber vor Allem hilft es Dir, zu verstehen, was da vorgeht. Ganz ehrlich, Du kannst doch nicht ernsthaft wegen jedem Pipifax nachfragen wollen.

    (1) Edit: Das Zitat ist von noisefloor und fiel hier sogar schon in Beitrag #4.Asche auf meinen Nischel, ich hab nicht alles überblickt.

    Grüße, STF

    PS: Abgesehen davon wäre interessant, wie genau Du die Segmentanzeigen angeschlossen hast. Im schlimmsten Fall (Darstellung von 88) sollte der RPi dann auch nicht die Grätsche machen.

  • ich habe 8 segmente pro zahl. Weil rechts unten ein punkt ist. Und wie die zahlen einzeln dargestellt werden müssen erklärt sich selbst. Erstmal ging es mir darum aus einem lauflicht mit einer angesteuerten led eine anzeige zu machen bei der mehr als eine led angesteuert wird. Der rest ergibt sich selbst.

    Ok, dann haben wir das mit der Siebensegmentanzeige geklärt. In Python würde ich das wie folgt angehen. Das Prinzip lässt sich natürlich auf C übertragen. Das folgende Programm zeigt nacheinander die Ziffern 0, 4 und 9 an. (Getestet habe ich es nicht, aber so ungefähr sollte es hinhauen).

    Zunächst definiere ich eine Liste led7 mit 10 Unterlisten. Jede Unterliste steht für eine Ziffer von 0 bis 9. Die Unterliste besteht aus 7 Elementen für die 7 Segmente der Anzeige. Eine 1 steht für LED ist an, eine 0 für LED ist aus. Dabei habe ich mit dem oberen waagrechten Segment angefangen und dann im Uhrzeigersinn die weiteren. Das mittlere waagrechte Anzeigesegment wird durch das siebte Element dargestellt. (Den Punkt habe ich mir gespart, den kannst du bei Bedarf als achtes Element ergänzen).

    Dann gibt es die Funktion showDigit(). Der sagst du welche Ziffer dargestellt werden soll. Je nach Ziffer (Argument dig) holt sie sich dann die passende Unterliste aus led7 und in einer Schleife über diese Unterliste schaltet sie die LEDs an oder aus. Je nachdem was die darzustellende Ziffer erfordert. Um das Beispiel einfach zu halten, gehe ich davon aus, dass du die LEDs der Siebensegmentanzeige mit den GPIO-Pins 1 bis 7 ansteuerst.

    Um zwei Ziffern anzusteuern müsstest du das Ganze erweitern. Aber das ergibt sich ja dann von selbst ;) Sorry, das konnte ich mir jetzt nicht verkneifen.

    Aber wie die Vorredner schon geschrieben haben, beschäftige dich zunächst mal mit den Grundlagen von Programmierung...

  • Hallo,

    hadi:

    • Der Code ist nicht lauffähig.
    • Nein, du definierst keine Liste von Listen, sondern ein Tupel von Tupeln.
    • So oder so wäre anstatt Liste oder Tupel ein Dict die bessere Datenstruktur.
    • Iterieren mit `range` ist in vielen Fällen inkl. diesem ein Anti-Pattern.
    • Funktionsnamane sollten der Namenskonvention gem. PEP8 folgen.

    Also wenn du schon Leute von C zu Python hin missionieren willst, dann solltest du es zumindest versuchen, anständig machen.

    Gruß, noisefloor

  • Hhm, warum so unfreundlich im Ton, noisefloor? Sonst könnte man ja ins Gespräch kommen.

    Dann würde ich sagen, bei mir läuft der Code. Wenn ich das GPIO.output durch ein print ersetze, kommt für die Darstellung der 0 folgendes Ergebnis:

    Code
    (1, 1)
    (2, 1)
    (3, 1)
    (4, 1)
    (5, 1)
    (6, 1)
    (7, 0)

    D.h. die Pins 1 bis 6 würden auf High gesetzt werden.

    Außerdem würde ich sagen, dass für einen Anfänger wie Zottel der Begriff Liste verständlicher ist als Tupel und ich würde dich fragen, weshalb du meinst dass ein Dictionary hier besser geeignet ist (und wie Zottel das nach C übersetzen soll) und was an der Iteration mit range schlecht ist, wenn alle Listen, verzeih: Tupel, aus Prinzip die selbe Länge haben. Und zum Schluss würde ich fragen, ob PEP8 ein Gesetz oder lediglich eine Empfehlung ist, von der man auch abweichen darf, solange der Code verständlich und lesbar bleibt.

    Aber ich weiß nicht, ob wir so ins Gespräch kommen würden.

    Lieber Gruß

    Dieter

  • Außerdem würde ich sagen, dass für einen Anfänger wie Zottel der Begriff Liste verständlicher ist als Tupel

    Es ist aber schlicht nicht das selbe. Eine Liste ist eine Liste, ein Tuple ist ein Tuple. Da gibt es essenzielle Unterschiede (mutable/immutable, verfügbare Methoden...)

    was an der Iteration mit range schlecht ist

    Du solltest direkt über die Liste/Tuple iterieren, und nicht "manuell" mit einem fortlaufenden Index arbeiten...

    Und zum Schluss würde ich fragen, ob PEP8 ein Gesetz oder lediglich eine Empfehlung ist, von der man auch abweichen darf, solange der Code verständlich und lesbar bleibt.

    Es ist ein Gesetz :fies:

    Nein, theoretisch kann es auch laufbaren Python-Code geben, der PEP 8 zu 100% ignoriert. Aber jeder halbwegs vernünftige Python-Programmierer hält sich dran, PEP 8 ist so eine Art Bibel.

    Ich empfehle auch mal das "Zen of Python" anzuschauen (import this), wenn dir die dort niedergeschriebenen "Regeln" und PEP 8 missfallen, sehe ich keinen Grund, warum du Python als Programmiersprache nehmen solltest.

    Edit:

    Dann würde ich sagen, bei mir läuft der Code.

    Ach, sehe ich anders. Du setzt (mit GPIO.setmode()) nicht explizit den Board-Mode auf interne Broadcom SoC-Nummerierung (GPIO.BCM), Default ist GPIO.BOARD. Und zumindest bei meinen Raspis sind allein die Pins 1, 2, 4 und 6 3.3V, 5V oder GND-Pins, keine GPIO...

  • Hallo,

    Zottel386: sehr schön.

    hadi:

    Quote

    weshalb du meinst dass ein Dictionary hier besser geeignet ist

    Weil du dich dann nicht implizit darauf verlassen musst, dass die Reihenfolge in deiner Liste / deinem Tupel der Reihenfolge der Zahlen entspricht. Du legst für jede Zahl einen Schlüssel an, der Wert ist, welche Pins dafür auf `high` gesetzt werden müssen.

    Quote

    (und wie Zottel das nach C übersetzen soll)

    Am besten gar nicht. Entweder schreibst du idomatisches Python oder idomatisches C. Etwas 1:1 von Programmiersprache A nach Programmiersprache B übertragen zu wollen ist in der Regel irgendwas zwischen schlechte Idee und kapitaler Fehler.

    Quote

    und was an der Iteration mit range schlecht ist,

    Steht doch im vorherigen Post von mir: das ist ein Anti-Pattern in Python.

    Quote

    Dann würde ich sagen, bei mir läuft der Code. Wenn ich das GPIO.output durch ein print ersetze, kommt für die Darstellung der 0 folgendes Ergebnis:

    Ja, natürlich. Weil: dann hast du den Fehler auch ausgebaut...

    Quote

    Und zum Schluss würde ich fragen, ob PEP8 ein Gesetz oder lediglich eine Empfehlung ist, von der man auch abweichen darf, solange der Code verständlich und lesbar bleibt.

    Klar darfst du. Aber von den Namenskonvention für Namen von Funktionen abzuweichen macht in deinem Beispiel null Sinn. Genau so wenig wie der semi-kryptische Variablenname led7.
    Natürlich kannst du die PEP8 weiterhin generieren. Aber dann wird dir von dir geposteter, nicht PEP8-konformer Code in jedem anständigen Python-Forum immer und immer wieder "um die Ohren gehauen".

    Der eigentliche Punkt: jemand hat eine Frage zu C und sagt, er muss / will C benutzen - da brauchst du nicht mit Python anfangen und dann auch noch suboptimalen Python-Code in den Thread werfen. Das ist in keinster Weise hilfreich noch zielführend.

    Gruß, noisefloor

  • Zottel386 ,

    mal ganz abgesehen davon würde mich interessieren, wie Du das alles angeschlossen hast (Vorwiderstände, ...).

    Es ist übrigens sehr ungewöhnlich bei 7-Segment-Anzeigen die einzelnen Segmente direkt anzusteuern ( -> Bitschiebereien - Teil 3: Weiterführendes zum 74HC595 und 7-Segment-Anzeigen am Raspi )

    cu,

    -ds-

  • dreamshader

    Aber warum denn nicht direkt anschließen? Habe doch 26 Pins. (Bild 1)

    Die Segmentanzeige benötigt 16 und ich habe noch für optische Sensoren übrig. (Bild 2)

    Somit habe ich die Funktionsweise eines Zählers gegeben.

    Allerdings löte ich das ganze noch auf Platine sobald diese hier angekommen sind. (Bestellt)

    Bild 3 soll das Schaltbild zeigen.

  • Aber warum denn nicht direkt anschließen? Habe doch 26 Pins. (Bild 1)

    Noch mal: welche Vorwiderstände?

    Weil ...

    Quote
    The maximum permitted current draw from the 3.3 V pins is 50 mA.

    Ich empfehle dringendst Grundlagen-Forschung -> https://www.elinux.org/RPi_Low-level_peripherals

    cu,

    -ds-

  • Wobei eine LED 20mA benötigt, Erklärt einiges, Danke für den Hinweis.

    Derzeit lasse ich jedoch nur 2 LED's aufleuchten(mehr ist auch nicht geplant).

    Ich kann(nicht muss) ....

    Ich betreibe immer noch mein Lauflicht, jedoch nun mit zwei LED's gleichzeitig.

    Der Vorwiederstand ist an der Kathode, beträgt 410 Ohm ( gelb, braun, braun, gold)

  • Wobei eine LED 20mA benötigt, Erklärt einiges, Danke für den Hinweis.

    Geht imho gar nicht ... :fies:
    Forenkonsens: 2-3 mA pro GPIO maximal. Das kommt dann auch mit der Reserve von ca. 50 mA des 3V3 Kreises ganz gut hin.

    Hinweis: wenn Dir die 5V aus irgendeinem Grund einbrechen, ist i.d.R. nur Peripherie betroffen, brechen Dir die 3V3 ein, betrifft das direkt das SoC ...

    //EDIT:

    Der Vorwiederstand ist an der Kathode, beträgt 410 Ohm

    Ein Vorwiderstand für alle Segmente ist imho Unsinn ...

    Der maximale Strom teilt sich auf alle Segmente, die leuchten, auf. D.h. Je mehr Segment an sind, desto weniger Strom bekommt jede und desto dunkler wird jede von ihnen ...

    cu,

    -ds-

  • Wobei eine LED 20mA benötigt,

    nur die ollen Schrottdunkelleds

    wer die nimmt ist selber Schuld, gute ultrahelle LEDs ab 5000mCd brennen einen bei 20mA die Netzhaut weg, bei 1-3mA sind die ausreichend hell für alles!

    Forenkonsens: 2-3 mA pro GPIO maximal.

    reicht also dicke mit 1k-10k Ohm

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo noisefloor,

    ich will keine Battle vom Zaun brechen, aber so ganz ohne Widerspruch kann ich's nicht stehen lassen. Damit ich nicht gleich am Anfang die Lust verliere, mich in dieses Forum einzubringen, muss ich für meinen Seelenfrieden (und andere die das vielleicht verfolgen) klarstellen, dass ich mir bei meinem Vorschlag durchaus etwas gedacht habe und dass dieser seine Berechtigung hat.

    Es ging mir nicht darum, Zottel ein fertiges Programm zu liefern das er nur noch auf seinem Pi laufen lassen muss. Etwas Eigeninitiative wird hier ja zu recht immer gefordert. Vielmehr ging es um eine Idee, wie er komfortabel die richtigen LEDs ansprechen kann ohne in ein If-Else-Dickicht oder andere Abwege zu geraten. Dazu habe ich einen Vorschlag gemacht, wohl wissend dass das nur eine von vielen anderen Lösungsalternativen ist. Aber genau darin sehe ich den Sinn eines solchen Forums: dass man die Ideen diskutiert. Und ob eine Idee in C oder in Python ausgedrückt wird, ist für mich dabei zweitrangig und keinesfalls abwegig.


    Viele Grüße

    Dieter

    Weil du dich dann nicht implizit darauf verlassen musst, dass die Reihenfolge in deiner Liste / deinem Tupel der Reihenfolge der Zahlen entspricht. Du legst für jede Zahl einen Schlüssel an, der Wert ist, welche Pins dafür auf `high` gesetzt werden müssen.

    Klar könnte man die Ziffern in beliebiger Reihenfolge definieren, aber das scheint mir im konkreten Fall ziemlich absurd. Im Sinne von Code-Verständlichkeit finde ich es hier eigentlich zwingend, die Ziffern in der Reihenfolge 0 bis 9 zu definieren. Und so hat der Index seine Berechtigung und ist obendrein performanter als eine Suche über den Schlüssel.

    Quote

    Am besten gar nicht. Entweder schreibst du idomatisches Python oder idomatisches C. Etwas 1:1 von Programmiersprache A nach Programmiersprache B übertragen zu wollen ist in der Regel irgendwas zwischen schlechte Idee und kapitaler Fehler.

    So wie ich versuchen kann, eine Idee auf Englisch oder Deutsch zu erklären, geht das auch mit Python und C. Ich muss mich dabei halt bemühen, Sprachelemente zu verwenden, für die es in der anderen Sprache eine Entsprechung gibt. Und da ist die Liste/ das Tupel dem Array näher als das Dictionary und die Iteration mit Index näher als ein enumerate. Wenn meine Aussprache des "Pythonischen" einen leichten C-Akzent hat, mag das hier sogar von Vorteil sein ;)

    Quote

    Steht doch im vorherigen Post von mir: das ist ein Anti-Pattern in Python.

    Ok, wenn du geschrieben hättest: "Es gibt da ein paar Leute im Internet, die haben sich viel Mühe gegeben, einen guten Programmierstil für Python zu beschreiben. Die empfehlen an dieser Stelle ein enumerate zu verwenden. Und das Tolle dabei: das enumerate liefert dir sogar den Index den du im nächsten Statement zum Ansteuern der GPIO-Pins benötigst". Ich glaube, wenn du so geschrieben hättest, dann hätte ich mich ganz schnell mit dem enumerate angefreundet. (Was dann wiederum Zottel vor ein Problem gestellt hätte falls er nicht auf C++ und eine Klassenbibliothek umsteigen will...)

    Quote

    Ja, natürlich. Weil: dann hast du den Fehler auch ausgebaut...

    Es ging um die Idee und nicht um ein gebrauchsfertiges Programm.

    Quote

    Der eigentliche Punkt: jemand hat eine Frage zu C und sagt, er muss / will C benutzen - da brauchst du nicht mit Python anfangen und dann auch noch suboptimalen Python-Code in den Thread werfen. Das ist in keinster Weise hilfreich noch zielführend.

    Wie gesagt, das sehe ich anders.

    Vielleicht können wir es bei dieser Gegenrede dann auch belassen, was meinst du? We agree that we disagree und begegnen uns bei anderer Gelegenheit gerne wieder? :)

  • Hallo,

    WENN das hier ein Python-Thread wäre, DANN hätte ich dir auch mehr Tipps gegeben. Da dein Python-Code hier aber wenig bis keinen Sinn (siehe oben), beteilige ich mich hier nicht mit Tipps, die in Richtung Hijacking des Threads laufen würden.

    Wenn du Fragen zu (deinem) Python-Code hast -> starte eine Thread im Python-Unterforum hier. Oder bitte einen Moderator, dein Python-Post hier im Thread, dort hin zu verschieben. Da können wir dann dein "Auslegung" deines Codes wie

    Quote

    Und so hat der Index seine Berechtigung und ist obendrein performanter als eine Suche über den Schlüssel.

    ausdiskutieren.

    Gruß, noisefloor

  • Ich kann eine gewisse Dissonanz zwischen euch und euren Lösungsansätzen durchaus nachvollziehen, aber bitte bedenkt, euch vereint der Versuch der Hilfe. Deshalb bitte ich darum weiterhin sachlich und konstruktiv zu bleiben! :angel:

    Zum Thema "Auslegung" des Codes würde ich vorschlagen, wegen der Nachvollziehbarkeit der Diskussion, dieses hier zu tun. Der Thread ist als erledigt markiert und demnach sollte(n) die Ausgangsfrage(n) des TO beantwortet sein. Oder Zottel386? Dein Thread, Dein Vetorecht! ;)

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!