Hallo Black Rose,
ich habe mal kurz auf den Link zu dem sunfounder-kit gesehen. Steht in "Lesson 13 LCD1602" nichts über den Anschluß - wie er vorgesehen ist?
Beiträge von rasjan
-
-
LED-Lampen:
Damit hatte ich vor Jahren teure schlechte Erfahrungen gesammelt. Die Produktion war wohl sehr unausgeglichen. Manche Leuchtmittel gingen schon Sekunden nach dem ersten Einschalten kaputt.
Außerdem waren LED-Leuchtmittel, wenn sie denn eine venünftige Helligkeit erreichen sollten, extrem teuer.
Also habe ich LED Lampen oder Leuchtmittel bevorzugt dort verwendet, wo man nur schlecht rankommt - ganz oben in der Garage, im Kuhstall (da reichen billige, nicht so helle LED-Röhren), über einem Tor, über einer Maschine - hat sich bewährt.
Auch LED-Licht für Spot-Beleuchtung, z.B. in Schreibtischlampen hat sich bei mir bewährt.
Ich schätze, daß seit etwa einem Jahr die Preise für z.B. helle LED-Röhren (150cm mit > 3500lm) in einem bezahlbaren Rahmen liegen.
Darauf sollte man achten, daß z.B. LED-Röhren (z.B. 3700lm) oft nicht die theoretische Helligkeit von guten Leuchtstoff-Röhren (z.B. 5200lm) erreichen.
Allerdings waren die Leuchtstoffröhren, die ich ersetzt habe, schon längst deutlich dunkler, als im Neuzustand. Gewöhnungssache.
Wie sich das Altern bei LEDs entwickelt, weiß ich noch nicht, aber ich erwarte deutlich weniger Verlust an Helligkeit als bei Leuchtstoffröhren ("Energiesparlampen" sind nichts anderes).
Auch spielt die Lichtfarbe für den Eindruck der Helligkeit der LED-Lampen eine große Rolle. Gut, wenn man 6500K-Lampen mag.
Bedenken sollte man auch, wie die Leuchtmittel eingestzt werden. Denn LED-Röhren haben gewöhnlich eine dunkle Rückseite. Wenn die Fassungen ungünstig angeordnet sind, hat man den Schatten gerade da, wo man ihn nicht haben will. Dann empfehlen sich LED-Röhren, deren Anschlüsse man verdrehen kann.
Jedenfalls habe ich mit dem Einsetzen von 3700lm-LED-Röhren eine Lichtflut ---Energiefresser:
Die alten Umwälzpumpen unserer Heizanlage hatten zwar eine unscheinbare Leistung, aber da die fast rund um die Uhr liefen, sind die auch Energiefresser gewesen.
Die Investition in geregelte Umwälzpumpen, die mit nur 1/4 der Leistung das gleiche Werk verrichten - und nur dann, wenn sie wirklich benötigt werden, hat sich nach ca. einem Jahr amortisiert.
Das Austauschen hätte ich schon viel früher machen sollen.
Wer "Strom" sparen will, muß nicht bei den Lampen anfangen, wenn es sich um einfache Wohnraumbeleuchtung handelt. Doch davon haben schon andere User geschrieben. -
Hallo reini122
Leider habe ich keine Idee, was man ändern sollte, denn wie ich bemerkt habe, haben außer mir mehrere Display-Besitzer Probleme damit, etwas auf den Touchscreen oder ein Display zu bekommen.
Da hilft der "gute Rat", beim Gockel zu suchen, gar nicht. Das dürfte auch bei Dir nicht das Problem sein.
Ich bin jedenfalls von der Informationsflut geplättet, die einem ganz nebenbei auch noch viele alte, widersprüchliche oder falsche Aussagen liefert.
Also versuche ich, das Zusammenspiel der Hardwarekomponenten, des Linux-BS, der Busse, Treiber und das Zusammenwirken mit anderen Rechnern zu verstehen, lerne Linux-Kommandos, mache erste Python-Schritte -Und dann Peng, so etwas "einfaches", wie ein LCD-Display will nichts sinnvolles anzeigen.
Man rotiert, um den Fehler zu finden, scheitert, weil man viele Zusammenhänge nicht überblickt und rechnet sich aus, daß wenn man in dem Tempo weitermacht, hat man seinen Raspi 3 endlich zum Laufen gebracht, wenn es Raspberry 10 gibt. Oder wenn erzählt wird: "Da gab es mal vor langer Zeit so'n kleines Kärtchen - weißt Du noch? Ich glaube, das hieß Raspberry oder so."
Finstere Aussichten.
Trotzdem, Kopf hoch.
Vielleicht hast Du ja schneller ein Erfolgserlebnis, ich werde mich mitfreuen.
-
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:
Codei2c-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.
Python
Alles anzeigen#!/usr/bin/env python # -*- coding: utf-8 -*- #--------------------------------------------------- # nach Sensoren am Raspberry Pi E.F. Engelhardt 2016 #--------------------------------------------------- # i2c_lib.py # zugiffsfunktionen auf i2c-Bus # # import smbus, os from time import * class i2c_device: @staticmethod def getPiRevision(): try: f = open('/proc/cpuinfo','r') for line in f: if line.startswith('Revision'): return 1 if line.rstrip()[-1] in ['1','2'] else 2 f.close() except: return 0 @staticmethod def getPiI2CBusNumber(): # Gets the I2C bus number /dev/i2c# return 1 if i2c_device.getPiRevision() > 1 else 0 def __init__(self, addr, port=-1): self.addr = addr print "i2c-Busnummer= ", i2c_device.getPiI2CBusNumber() print "Raspberry Pi Revision= ",i2c_device.getPiRevision() self.bus = smbus.SMBus(port if port >= 0 else i2c_device.getPiI2CBusNumber()) # Befehl an Adresse def write_cmd(self, cmd): self.bus.write_byte(self.addr, cmd) sleep(0.0001) # Befehl und Wert an Adresse def write_cmd_arg(self, cmd, data): self.bus.write_byte_data(self.addr, cmd, data) sleep(0.0001) # Datenblock schreiben def write_block_data(self, cmd, data): self.bus.write_block_data(self.addr, cmd, data) sleep(0.0001) # Byte lesen def read(self): return self.bus.read_byte(self.addr) # Inhalt lesen def read_data(self, cmd): return self.bus.read_byte_data(self.addr, cmd) # Datenblock auslesen def read_block_data(self, cmd): return self.bus.read_block_data(self.addr, cmd) #----------------------------------------------------------------------------------------
Python
Alles anzeigen#!/usr/bin/env/python # -*- coding: utf-8 -*- # ---------------------------------------------- # nach Sensoren am Raspberry Pi, E.F. Engelhardt # ---------------------------------------------- # Bibliothek fuer LCD-Display (HD44780) mit I2C-Interface mit PCF8574 # joy-it SBC-LCD20x4 und aehnliche # lcd20x4.py import i2c_lib import time from time import * # LCD-Adresse LED-Bildschirm I2C_LCD_ADDRESS = 0x27 # ---------------------------------------------- # LCD-Befehle LCD_CLEARDISPLAY = 0x01 LCD_RETURNHOME = 0x02 LCD_ENTRYMODESET = 0x04 LCD_DISPLAYCONTROL = 0x08 LCD_CURSORSHIFT = 0x10 LCD_FUNCTIONSET = 0x20 LCD_SETCGRAMADDR = 0x40 LCD_SETDDRAMADDR = 0x80 # ---------------------------------------------- # flags display entry mode LCD_ENTRYRIGHT = 0x00 LCD_ENTRYLEFT = 0x02 LCD_ENTRYSHIFTINCREMENT = 0x01 LCD_ENTRYSHIFTDECREMENT = 0x00 # # flags display on/off control LCD_DISPLAYON = 0x04 LCD_DISPLAYOFF = 0x00 LCD_CURSORON = 0x02 LCD_CURSOROFF = 0x00 LCD_BLINKON = 0x01 LCD_BLINKOFF = 0x00 # # flags display/cursor shift LCD_DISPLAYMOVE = 0x08 LCD_CURSORMOVE = 0x00 LCD_MOVERIGHT = 0x04 LCD_MOVELEFT = 0x00 # # flags for function set LCD_8BITMODE = 0x10 LCD_4BITMODE = 0x00 LCD_1LINE = 0x00 LCD_2LINE = 0x08 LCD_5x8DOTS = 0x00 LCD_5x10DOTS = 0x04 # # flags backlight control LCD_BACKLIGT = 0x08 LCD_NOBACKLIGHT = 0x00 # En = 0b00000100 # ENABLE bit Rw = 0b00000010 # Read/Write bit Rs = 0b00000001 # Register select bit # ------------------------------------- class lcd: #initializes lcd def __init__(self): self.lcd_device = i2c_lib.i2c_device(I2C_LCD_ADDRESS) for i in range(3): self.lcd_write(0x03) # prepare switch to 4 bit mode sleep(.004599) self.lcd_write(0x02) # set 4 bit mode # init self.displayfunction = LCD_4BITMODE | LCD_2LINE | LCD_5x8DOTS self.displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF self.lcd_write(LCD_FUNCTIONSET | self.displayfunction) # Set 4 bit, 2 line mode (Multi-line) = Wert 28 # self.lcd_write(self.displaycontrol) # Turn on display self.display_on() # Turn on display self.display_clear() self.lcd_write(LCD_ENTRYMODESET | LCD_ENTRYLEFT) # cursor to home sleep(.2) # clear display def display_clear(self): self.lcd_write(LCD_CLEARDISPLAY) # Clear display, move cursor home # means backlight off def display_off(self, data=0): self.lcd_device.write_cmd(data | LCD_NOBACKLIGHT) def display_on_no(self): self.displaycontrol &= -LCD_DISPLAYON self.lcd_write(LCD_DISPLAYCONTROL | self.displaycontrol) # display on def display_on(self): self.displaycontrol |= LCD_DISPLAYON self.lcd_write(LCD_DISPLAYCONTROL | self.displaycontrol) # clocks En to latch command def lcd_strobe(self, data): self.lcd_device.write_cmd(data | En | LCD_BACKLIGHT) sleep(.0005) self.lcd_device.write_cmd(((data & -En) | LCD_BACKLIGHT)) sleep(.0001) def lcd_write_four_bits(self, data): # print "data =" , data self.lcd_device.write_cmd(data | LCD_BACKLIGHT) self.lcd_strobe(data) # write a command to lcd def lcd_write(self, cmd, mode=0): self.lcd_write_four_bits(mode | (cmd & 0xF0)) self.lcd_write_four_bits(mode | ((cmd << 4) & 0xF0)) # put string function def lcd_display_string(self, string, line): if line == 1: self.lcd_write(0x80) # 128 if line == 2: self.lcd_write(0xC0) # 196 if line == 3: self.lcd_write(0x94) # 148 if line == 4: self.lcd_write(0xD4) # 212 for char in string: self.lcd_write(ord(char), Rs) # clear lcd and set to home def lcd_clear(self): self.lcd_write(LCD_CLEARDISPLAY) self.lcd_write(LCD_RETURNHOME) #----------------------------------------------------------------------
Python
Alles anzeigen#!/usr/bin/env python # -*- codning: utf-8 -*- # ---------------------------------------------------- # nach Sensoren am Raspberry Pi, E.F. Engelhardt, 2016 # ---------------------------------------------------- # mit Anzeigen auf Display und Terminal # # text2lcd.py # import lcd20x4 from time import * import os os.system('clear') lcd = lcd20x4.lcd() # maximal 20 Zeichen je Zeile zeile1="erste Zeile" zeile2="zweite Zeile" lcd.lcd_display_string(zeile1, 1) lcd.lcd_display_string(zeile2, 2) print "|" print "| Es wird Zeile 1 ", zeile1, " und Zeile 2 ", zeile2 , "auf dem LCD angezeigt", print "| nach 10 Sekunden wird der inhalt wieder geloescht " print "|" sleep(10) #lcd.display_clear() print "| nach weiteren 10 Sekunden wird das Display ausgeschaltet" print"|" print"| und nach weiteren 10 Sekunden wird das Display wieder eingeschaltet mit Zeile 2 -> 1" print"| dargestellt" lcd.display_off() sleep(10) lcd.display_on() print"|" zeile1=zeile2 zeile2="Raspberry Pi" lcd.lcd_clear() # lcd.lcd_display_string(zeile1, 1) lcd.lcd_display_string(zeile2, 2) print "|"
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. -
Hallo,
Nun möchte jemand in der Familie Onlinebanking nutzen.
Ich denke, ein raspi 3 mit raspbian an einem HDMI-Eingang eines Fernsehers ist dafür völlig ausreichend.
Tastatur und Maus sind vorhanden, grafische Oberfläche LXDE ist ausreichend.
Es soll nur Onlinebanking und das Rüberschieben von Dateien auf einen Stick auf einer einfachen Oberfläche passieren.
Der raspi soll über LAN (oder evtl. WLAN) über einen Router ins i-net kommen.
Was benötige ich für raspbian oder außerdem noch, um das onlinebanking (und "Appetit kommt mit dem Essen" - vielleicht auch mehr)
sicher einzurichten?
Reicht das Erzeugen eines neuen Nutzers? - oder ist das schon overkill?
Kann man cromium auf raspbian - so wie der Browser ist - als sicher betrachten?
Gibt es für Raspbian geeignete Virenscanner, um Dateien aus der Windows-Welt- in die Windows-Welt zu scannen? -
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. -
nun fallen mir fast die Augen raus, ich finde den Fehler trotzem nicht:
Python
Alles anzeigen#!/usr/bin/env/python # -*- coding: utf-8 -*- # ---------------------------------------------- # nach Sensoren am Raspberry Pi, E.F. Engelhardt # ---------------------------------------------- # Bibliothek fuer LCD-Display (HD44780) mit I2C-Interface mit PCF8574 # joy-it SBC-LCD20x4 und aehnliche # lcd20x4.py import i2c_lib import time from time import * # LCD-Adresse LED-Bildschirm I2C_LCD_ADDRESS = 0x27 # ---------------------------------------------- # LCD-Befehle LCD_CLEARDISPLAY = 0x01 LCD_RETURNHOME = 0x02 LCD_ENTRYMODESET = 0x04 LCD_DISPLAYCONTROL = 0x08 LCD_CURSORSHIFT = 0x10 LCD_FUNCTIONSET = 0x20 LCD_SETCGRAMADDR = 0x40 LCD_SETDDRAMADDR = 0x80 # ---------------------------------------------- # flags display entry mode LCD_ENTRYRIGHT = 0x00 LCD_ENTRYLEFT = 0x02 LCD_ENTRYSHIFTINCREMENT = 0x01 LCD_ENTRYSHIFTDECREMENT = 0x00 # # flags display on/off control LCD_DISPLAYON = 0x04 LCD_DISPLAYOFF = 0x00 LCD_CURSORON = 0x02 LCD_CURSOROFF = 0x00 LCD_BLINKON = 0x01 LCD_BLINKOFF = 0x00 # # flags display/cursor shift LCD_DISPLAYMOVE = 0x08 LCD_CURSORMOVE = 0x00 LCD_MOVERIGHT = 0x04 LCD_MOVELEFT = 0x00 # # flags for function set LCD_8BITMODE = 0x10 LCD_4BITMODE = 0x00 LCD_1LINE = 0x00 LCD_2LINE = 0x08 LCD_5x8DOTS = 0x00 LCD_5x10DOTS = 0x04 # # flags backlight control LCD_BACKLIGT = 0x08 LCD_NOBACKLIGHT = 0x00 # En = 0b00000100 # ENABLE bit Rw = 0b00000010 # Read/Write bit Rs = 0b00000001 # Register select bit # ------------------------------------- class lcd: #initializes lcd def __init__(self): self.lcd_device = i2c_lib.i2c_device(I2C_LCD_ADDRESS) for i in range(3): self.lcd_write(0x03) # prepare switch to 4 bit mode sleep(.004599) self.lcd_write(0x02) # set 4 bit mode # init self.displayfunction = LCD_4BITMODE | LCD_2LINE | LCD_5x8DOTS self.displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF self.lcd_write(LCD_FUNCTIONSET | self.displayfunction) # Set 4 bit, 2 line mode (Multi-line) = Wert 28 # self.lcd_write(self.displaycontrol) # Turn on display self.display_on() # Turn on display self.display_clear() self.lcd_write(LCD_ENTRYMODESET | LCD_ENTRYLEFT) # cursor to home sleep(.2) # clear display def display_clear(self): self.lcd_write(LCD_CLEARDISPLAY) # Clear display, move cursor home # means backlight off def display_off(self, data=0): self.lcd_device.write_cmd(data | LCD_NOBACKLIGHT) def display_on_no(self): self.displaycontrol &= -LCD_DISPLAYON self.lcd_write(LCD_DISPLAYCONTROL | self.displaycontrol) # display on def display_on(self): self.displaycontrol |= LCD_DISPLAYON self.lcd_write(LCD_DISPLAYCONTROL | self.displaycontrol) # clocks En to latch command def lcd_strobe(self, data): self.lcd_device.write_cmd(data | En | LCD_BACKLIGHT) sleep(.0005) self.lcd_device.write_cmd(((data & -En) | LCD_BACKLIGHT)) sleep(.0001) def lcd_write_four_bits(self, data): # print "data =" , data self.lcd_device.write_cmd(data | LCD_BACKLIGHT) self.lcd_strobe(data) # write a command to lcd def lcd_write(self, cmd, mode=0): self.lcd_write_four_bits(mode | (cmd & 0xF0)) self.lcd_write_four_bits(mode | ((cmd << 4) & 0xF0)) # put string function def lcd_display_string(self, string, line): if line == 1: self.lcd_write(0x80) # 128 if line == 2: self.lcd_write(0xC0) # 196 if line == 3: self.lcd_write(0x94) # 148 if line == 4: self.lcd_write(0xD4) # 212 for char in string: self.lcd_write(ord(char), Rs) # clear lcd and set to home def lcd_clear(self): self.lcd_write(LCD_CLEARDISPLAY) self.lcd_write(LCD_RETURNHOME) #----------------------------------------------------------------------
Automatisch zusammengefügt:
Danke für die Tips.Hier noch die letzte Fehlermeldung, die ich allerdings über Wordpad hierherbugsiert habe:
CodeTraceback (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 -
-
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. -
3. Versuch
Python
Alles anzeigen#!/usr/bin/env python # -*- coding: utf-8 -*- #--------------------------------------------------- # nach Sensoren am Raspberry Pi E.F. Engelhardt 2016 #--------------------------------------------------- #i2c_pilib.py # zugiffsfunktionen auf i2c-Bus # # import smbus, os from time import * class i2c_device: @staticmethod def getPiRevision(): try: f = open('/proc/cpuinfo','r') for line in f: if line.startswith('Revision'): return 1 if line.rstrip()[-1] in ['1','2'] else 2 f.close() except: return 0 @staticmethod def getPiI2CBusNumber(): # Gets the I2C bus number /dev/i2c# return 1 if i2c_device.getPiRevision() > 1 else 0 def __init__(self, addr, port=-1): self.addr = addr print "i2c/Busnummer= ", i2c_device.getPiI2CBusNumber() print "Raspberry Pi Revision= ",i2c_device.GetPiRevision() self.bus = smbus.SMBus(port if port >= 0 else i2c_device.getPiI2CBusNumber()) # Befehl an Adresse def write_cmd(self, cmd): self.bus.write_byte(self.addr, cmd) sleep(0.0001) # Befehl und Wert an Adresse def write_cmd_arg(self, cmd, data): self.bus.write_byte_data(self.addr, cmd, data) sleep(0.0001) # Datenblock schreiben def write_block_data(self, cmd, data): self.bus.write_block_data(self.addr, cmd, data) sleep(0.0001) # Byte lesen def read(self): return self.bus.read_byte(self.addr) # Inhalt lesen def read_data(self, cmd): return self.bus.read_byte_data(self.addr, cmd) # Datenblock auslesen def read_block_data(self, cmd): return self.bus.read_block_data(self.addr, cmd) #----------------------------------------------------------------------------------------
- scheint so ja zu funktionieren - freu
Es sollten alle Einzüge da sein. Nun kann die Fehlersuche losgehen.
-
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.
-
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.
-
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.
-
1. Versuch.
Hoffentlich sind es nicht zu viele Zeilen (in nano, in Leafpad - und kurzzeitig auch hier - sah alles noch etwas strukturierter aus):Python
Alles anzeigen#!/usr/bin/env python # -*- coding: utf-8 -*- #--------------------------------------------------- # nach Sensoren am Raspberry Pi E.F. Engelhardt 2016 #--------------------------------------------------- #i2c_pilib.py # zugiffsfunktionen auf i2c-Bus # # import smbus, os from time import * class i2c_device: @staticmethod def getPiRevision(): try: f = open('/proc/cpuinfo','r') for line in f: if line.startswith('Revision'): return 1 if line.rstrip()[-1] in ['1','2'] else 2 f.close() except: return 0 @staticmethod def getPiI2CBusNumber(): # Gets the I2C bus number /dev/i2c# return 1 if i2c_device.getPiRevision > 1 else 0 def __init__(self, addr, port=-1): self.addr = addr print "i2c/Busnummer= ", i2c_device.getPiI2CBusNumber() print "Raspberry Pi Revision= ",i2c_device.GetPiRevision() self.bus = smbus.SMBus(port if port >= 0 else i2c_device.getPiI2CBusNumber()) # Befehl an Adresse def write_cmd(self, cmd): self.bus.write_byte(self.addr, cmd) sleep(0.0001) # Befehl und Wert an Adresse def write_cmd_arg(self, cmd, data): self.bus.write_byte_data(self.addr, cmd, data) sleep(0.0001) # Datenblock schreiben def write_block_data(self, cmd, data): self.bus.write_block_data(self.addr, cmd, data) sleep(0.0001) # Byte lesen def read(self): return self.bus.read_byte(self.addr) # Inhalt lesen def read_data(self, cmd): return self.bus.read_byte_data(self.addr, cmd) # Datenblock auslesen def read_block_data(self, cmd): return self.bus.read_block_data(self.addr, cmd) #----------------------------------------------------------------------------------------
-
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 -
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 Modulei2c_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 definedIch verstehe nicht wo und wie dieser "port" zu definieren ist.
die Zeile vollständig:
Wie komme ich mit meinen Veruchen weiter?
-
Dort habe ich genau den Link (http://tutorials-raspberrypi.de/hd44780-lcd-di…y-pi-ansteuern/) gefunden, der darauf hinweist, daß man so eine Levelanpassung benötigen würde. Bei Amazon findet sich auch prompt so ein Modul z.B.:
https://www.amazon.de/Aihasd-Channel-Logic-Konverter-Bidirektionale/dp/B00U6YRUDU/ref=sr_1_1?ie=UTF8&qid=1486743194&sr=8-1&keywords=3.3+5V+i2c+level&tag=psblog-21 [Anzeige] (Es gibt da auch x andere z.B. https://www.amazon.de/Aihasd-Channel-Logic-Konverter-Bidirektionale/dp/B00U6YRUDU/ref=sr_1_1?ie=UTF8&qid=1486743194&sr=8-1&keywords=3.3+5V+i2c+level&tag=psblog-21 [Anzeige])Leider weiß ich noch nicht, wie die realen Pegel aussehen. Sicherheitshalber werde ich vorläufig das Display - habe es gerade erhalten - erstmal nur mit 3,3V betreiben. Das soll zwar nur mit schwacher Darstellung, aber doch funktionieren. Ist mir sicherer für den Raspi.
Wenn ich dann im Elektronik-Versand wieder was bestelle, werde ich mir einen Level-Konverter mitbestellen. Damit ist man auf der sicheren Seite. Denn ich habe auch zu meinem BMP180 Breakout-Borad gelesen, daß es zwar auch mit 5V Pegeln klarkommen soll, daß das aber nicht empfohlen wird.Es ist noch viel auszuprobieren
Wenn mich dann mal der (Über-) Mut packt oder ich neue Erkenntnisse habe, werde ich vielleicht doch auf den Konverter verzichten. -
- noch eine Quelle für das Display:
bei https://www.conrad.de/de/raspberry-p…-b-1503752.htmlDoch dort steht, daß das Display sowohl mit 3,3V als auch mit 5V Logiclevel arbeitet.
Eine Pegelanpassung ist für den I2C-Anschluß bei dem Modul von Conrad als auch dem von Eckstein (gleicher Adapter-Chip PCF8574T) also nicht nötig. Ist meine Vermutung richtig?
Ist diese Anpassung auch bei den anderen Displays mit I2C-Interface nicht nötig?
Ist die Pegelanpassung (ein Link bei Amazon weist darauf hin) dann "nur" für zusätzliche Sicherheit da? -
ups - habe gerade gelesen - ein Logik-Level-Konverter fehlt noch für das Display
-> siehe:
https://tutorials-raspberrypi.de/hd44780-lcd-di…y-pi-ansteuern/Der HYT221 (siehe http://www.hygrochip.com/ und http://www.hygrochip.com/index.php?id=3833#c2103) arbeitet in einem großen Spannungsbereich von 2,7V bis 5,5V und benötigt den Konverter also nicht
(z.B. https://eckstein-shop.de/SparkFun-Logic…-Bi-Directional)
dann sollten 2 Kanäle reichen, wie z.B. hier
https://www.amazon.de/2-Kanal-Logic-Level-Konverter-Bidirektionale/dp/B00MLR3Y4E/ref=sr_1_5?ie=UTF8&qid=1486332091&sr=8-5&keywords=3.3v+5v+level+converter&tag=psblog-21 [Anzeige]Details siehe z.B. hier https://learn.sparkfun.com/tutorials/usin…level-converter
-
Danke meigrafd für den Hinweis,
doch ich kapere diesen threat für keinerlei spezielles Anliegen - bitte genau lesen - sondern habe ziemlich genau das gleiche Projekt vor. Daß ich anstelle des zweiten Feuchte-Sensors einen Drucksensor verwenden will, sollte in dem Zusammenhang nebensächlich sein.
Außerdem wühle ich mich durch allerhand nützliche Links - bin auch für Deine dankbar - und habe gleich den Hinweis, daß das RaspberryPi Center - als raspberrycenter verlinkt - und weder so noch so erreichbar ist. "Raspberrycenter.de Is UP and reachable.
The website is probably down just for you..."So wie Swp2000 denke ich natürlich auch an Ergänzungen in Zukunft.
Für Swp2000:
Da ich den HYT221 noch nicht habe, aber mir gerade einen SHT20 aus Schrott auslöten konnte, werde ich versuchen, diesen Feuchtesensor von Sensirion (https://www.sensirion.com/de/produkte/fe…2c-genauigkeit/) anzuschließen. Schöner Fummelkram bei (3x3x1,1mm) Ich hoffe er hat das Auslöten überstanden.Den HYT221 werde ich mir sicher noch leisten.
Aus meiner Sicht fehlt in Deiner Liste nur das I²C-Interface für das Display, sofern es nicht bereits aufgelötet oder im Bausatz enthalten ist.
Draht, der für die Brücken auf dem Steckbrett geeignet ist, sollte natürlich vorhanden sein. -
Danke meigrafd ,
nachdem ich meine Backup-Karte eingesetzt habe, funktionierte das Ändern mit Hilfe von sudo nano ohne Probleme - keine Ahnung, was ich vorher falsch gemacht hatte.
Dumm nur, daß ich jetzt erst gelesen habe, daß seit dem 24.01.2017 von joy-it Raspbian Jessie 11-01-2017 mit Dual-Monitor-Mode (HDMI + TFT gleichzeitig) runterzuladen ist. Mist.