python i2c port definieren

  • Hallo!
    Nun versuche ich "learning by doing" etwas python zu verstehen, aber bleibe schon beim Start stecken:

    Ich habe über i2c ein LCD-Display Joy-it SBC-LCD20x4 und zwei Sensoren am Raspberry Pi angeschlossen. Dad Display ist meine erste Baustelle.
    Die Geräte werden als 0x27 = Display, 0x28 und 0x77 erkannt.
    Ich habe für das Display 3 Module

    i2c_lib.py (allgemein)
    lcd20x4.py (Display 2004A mit I2C-Modul = Joy-it SBC-LCD20x4)
    text2lcd.py (Testanzeige)

    (ab)geschrieben und einige Fehler beseitigt.
    Aber hier ist Schluß mit der Fehlermeldung:

    ...
    File "/home/pi/LCD_pi/i2c_lib.py", line 34, in i2c_device
    self.bus = smbus.SMBus(port if port >= 0 else:
    NameError: name 'port' is not defined

    Ich verstehe nicht wo und wie dieser "port" zu definieren ist.

    die Zeile vollständig:

    Code
    self.bus = smbus.SMBus(port if port >= 0 else
    
    
    i2c_device.getPiI2CBusNumber())

    Wie komme ich mit meinen Veruchen weiter?

  • Die Zeile ist bestimmt nicht vollständig. Das gibt sonst einen Syntax Fehler. Und wenn du abgeschrieben hast, fehlt wohl noch Was. Wo hast du abgeschrieben?

  • Danke schon mal für die Anteilnahme :)

    Die Zeile ohne Umbruch habe ich auch schon ausprobiert.
    Daß da eventuell ein Eintrag oder ein Modul fehlt, in dem der Port definiert wird, war auch meine Vermutung.

    Doch ich habe keine Ahnung, wie Python mit dem Raspberry so zusammenarbeitet, daß der i2cbus genutzt wird.
    Vielleicht muß ich ja doch noch irgendein Paket installieren?
    Vielleicht fehlt nur ein Zeichen (so wie bei den anderen Fehlern, die sich leicht beheben ließen)?
    Vielleicht fehlt nur eine Zeile im Modul (doch ich habe keinen Hinweis darauf gefunden)?
    Vielleicht wird noch ein weiteres Modul benötigt, das den Datenverkehr mit i2c regelt und dabei den Port definiert - z.B. die Pins aktiviert, die für SDA und SCL zuständig sind?
    Doch die müssen ja aktiv sein, sonst würden die Adressen der angeschlossenen "Geräte" nicht angezeigt werden - wie erfährt Python davon?

    Quelle meiner Module ist "Sensoren am Raspberry Pi" von E.F. Engelhardt, Franzis Verlag

    Leider habe ich auf diesem Rechner keinen Code, den ich hierherkopieren könnte.
    Ich hoffe ich kann den Code bald nachliefern - falls nötig

  • Nein, du musst en:X installieren. Den gleichen Fehler erzeuge ich mit einer Zeile Python : "print etwas" ohne alles eingeben provoziert den gleichen Fehler.

    Wenn du mit Python arbeiten willst, solltest du ein Grundlagen tutorial durcharbeiten. Sonst wird das nix.

    Und zeig bitte den ganzen Code. Nicht etwas, von dem du glaubst es wäre aus dem Gedächtnis das gleiche Geworden.

  • 1. Versuch.
    Hoffentlich sind es nicht zu viele Zeilen (in nano, in Leafpad - und kurzzeitig auch hier - sah alles noch etwas strukturierter aus):

  • Also so ist das Murks. In Python sind Einrückung en extrem wichtig. Das musst du hier schon richtig reproduzieren. code tags sind aber schon ein guter Anfang !

    Und ich sehe schon so Fehler:

    in getPiI2CBusNumber fehlt beim Aufruf von getPiRevision das Klammerpaar.

    Die Variable port hingegen ist korrekt definiert. So ist der Fehler erstmal unerklärlich- es sei denn du machst da endlos. Wildes mit den Einrückungen.

  • Fast zeitgleich.

    Ja, von nix kommt nix.

    Wenn du mit Python arbeiten willst, solltest du ein Grundlagen tutorial durcharbeiten. Sonst wird das nix.

    Ich arbeite gerade ziemlich viel Grundlagen durch. Trotzdem drehe ich mich hier im Kreis.


    Und zeig bitte den ganzen Code. Nicht etwas, von dem du glaubst es wäre aus dem Gedächtnis das gleiche Geworden.

    Daß ein fehlendes oder falsches Zeichen über Leben und Tod entscheiden kann, ist mir schon bewußt. :)

    Vielleicht kannst Du ja helfen, daß ich aus dem Kreis rauskomme.

  • Deine Fehlermeldung passt aber schonmal nicht zum Code. Solange du den hier nicht mit korrekten Einrückungen reproduzierst kann ich dir nicht helfen. So sehr ich möchte. Wenn es hier im Forum nicht will, benutze und verlinke einen pastebin.


  • Also so ist das Murks. In Python sind Einrückung en extrem wichtig. Das musst du hier schon richtig reproduzieren. code tags sind aber schon ein guter Anfang !

    Danke.
    Tatsächlich, die Klammern fehlen. Wieder ein Fehler weniger. Nochmals - Danke.

    Bis zum Import hier waren die Einrückungen noch da. Wo muß ich schrauben?

    2. Versuch:

    - kann ich Dir sparen. Nach dem Einfügen ist die Struktur ganz kurz da und wird dann weg-"korrigiert" - leider falsch.


  • Deine Fehlermeldung passt aber schonmal nicht zum Code. Solange du den hier nicht mit korrekten Einrückungen reproduzierst kann ich dir nicht helfen. So sehr ich möchte. Wenn es hier im Forum nicht will, benutze und verlinke einen pastebin.

    Falsche Einrückungen hat python bisher fein säuberlich angemeckert - gute Korrekturhilfe.

    Ich war davon überzeugt, daß ein Code, den man hier in den entsprechenden Block stellt, von jeglichen automatischen Korrekturen ausgeschlossen ist.
    ' muß doch irgendwie gehen?

    Doch jetzt muß ich gehen, muß morgen früh raus.

  • 3. Versuch

    - scheint so ja zu funktionieren - freu :)

    Es sollten alle Einzüge da sein. Nun kann die Fehlersuche losgehen.

  • Danke! Es geht voran.
    Da war ich wohl beim Abschreiben ein bißchen unaufmerksam, besonders um die Zeile mit "port".
    Eine Ursache für Fehler ist sicher auch, daß ich Tabs für das Einrücken genutzt habe.
    Nun habe ich sehr deutlich gelernt, daß es tatsächlich zuverlässiger ist, lieber 4 Leerzeichen statt jeweils einem Tab nutzen.
    Dann fliegen die Einzüge hier auch nicht raus.


  • Eine Ursache für Fehler ist sicher auch, daß ich Tabs für das Einrücken genutzt habe.

    ganz schlechte Idee wenn man Python programmiert. Aber auch in anderen Sprachen kann das bescheuert aussehen, weil jeder Editor tabs anders interpretiert, einer mit 2 Leerzeichen, ein ander mit 6 oder 8...
    In den Firmen wo ich gearbeitet habe gab es immer "Coding-Standards', und Tabs waren generell nicht erlaubt.


    Nun habe ich sehr deutlich gelernt, daß es tatsächlich zuverlässiger ist, lieber 4 Leerzeichen statt jeweils einem Tab nutzen.
    Dann fliegen die Einzüge hier auch nicht raus.


    Die meisten Editoren die ich kenne koennen Tabs in Leerzeichen umrechnen, so dass 4 Leerzeichen editiert werden wenn du'Tab' eingibst. Was du auch sehr schnell mitbekommen wirst ist dass du die 'EOL Convention' auf "Unix/Osx format" einstellen solltest. Windows, MacOs und Linux benutzen verschiedene Zeichen um einen Zeilenumbruch zu kodieren. Das kann so weit gehen dass ein Python Skript am Raspberry nicht startet und du suchst dir einen Wolf warum, weil man die Zeilenumbruchszeichen ja nicht im Editor sieht.
    Mein Lieblingseditor auf Win10 ist Notepad++, er ist super-simpel und kann beides.

  • nun fallen mir fast die Augen raus, ich finde den Fehler trotzem nicht:


    Automatisch zusammengefügt:
    Danke für die Tips.

    Hier noch die letzte Fehlermeldung, die ich allerdings über Wordpad hierherbugsiert habe:

    Code
    Traceback (most recent call last):
       File "text2lcd.py", line 10, in <module>
           import lcd20x4
       File "/home/pi/LCD_pi/lcd20x4.py", line 61, in <module>
          class lcd: 
       File "/home/pi/LCD_pi/lcd20x4.py", line 70, in lcd
           self.displayfunction = LCD_4BITMODE | LCD_2LINE | LCD_5x8DOTS
    Name Error: name 'self' is not defined

    die muß ja auch nicht laufen -

    Einmal editiert, zuletzt von rasjan (16. Februar 2017 um 22:12)

  • Hallo nurazur, Du hast mir schon sehr weitergeholfen.
    Jeden Tab einfach durch 4 Leerzeichen ersetzen zu lassen, ohne danach doch Zeile für Zeile sehr genau zu überprüfen, war offensichtlich nicht ausreichend.
    Hinzu kommt natürlich noch meine Ahnungslosigkeit. Da Du Erfahrung hast, springen Dir solche einfachen Fehler sicher sofort ins Auge - mir nicht.
    Doch so nach und nach nähere ich mich meinem ersten Ziel, daß mir python einige Zeilen aufs Display zaubert.

  • Leider komme ich wieder nicht weiter.
    Jetzt habe ich zwar einige Fehler beseitigt, aber stehe wieder bei den Ports.
    Zwei Zeilen zeigen zwar an, daß meine Python-Module nun überhaupt etwas erledigt haben, aber das Ergebnis ist leider falsch.
    Liegt die Ursache nun an meinen Python-Zeilen oder ganz woanders?

    Fehlermeldung:

    Code
    i2c-Busnummer=  0
    Raspberry Pi Revision=  1
    Traceback (most recent call last):
     File "text2lcd.py", line 14, in <module>
       lcd = lcd20x4.lcd()
     File "/home/pi/LCD_pi/lcd20x4.py", line 64, in __init__
       self.lcd_device = i2c_lib.i2c_device(I2C_LCD_ADDRESS)
     File "/home/pi/LCD_pi/i2c_lib.py", line 34, in __init__
       self.bus = smbus.SMBus(port if port >= 0 else i2c_device.getPiI2CBusNumber())
    IOError: [Errno 2] No such file or directory

    Eigentlich müßte doch die Busnummer =1 ergeben
    und die Raspberry Pi Revision = 3
    Denn ich habe einen "Raspberry Pi 3" angeschlossen und "i2cdetect -y 1" liefert mir die Geräteadressen an "1".

    Ich sende nun alle drei Module mit, so wie sie jetzt im Verzeichnis stehen.

    Ich wäre sehr glücklich, ginge es mit dem Raspi-Projekt ein bißchen weiter.
    Ich habe schon alles rausgeschmissen, von dem ich in meinem Anfängersinn dachte, es könne nützen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!