[52_I2C_OLED] Modul zu Ansteuerung von OLED-Displays am Raspberry Pi

Begonnen von Standarduser, 22 September 2018, 20:36:28

Vorheriges Thema - Nächstes Thema

Standarduser

Und hast du denn mal in der HiPi-Doku geschaut, ob SH1106-Displays auch genauso angesteuert werden?
Sonst weiß ich auch nicht.

Peter21

Hier die Originalaussage von der hipi.znix.com Homepage:

SSD1306 and SH1106 based OLED displays

Ich werde es weiter versuchen, wenn ich eine Lösung gefunden habe werde ich es schreiben, kann aufgrund Anfängerstatus etwas länger dauern :-[. Falls jemand früher die Lösung hat würde ich mich über eine Nachricht freuen.

Standarduser

Ok, welche Änderungen hast du denn am Modul vorgenommen? Da muss ja der Displaytyp eingetragen werden. Der ist im Moment jedoch fest im Modul hinterlegt und nur veränderbar, indem er dort umgestellt wird.

Bearbeite doch mal die Datei und ändere dort den Typ. Anschließend das Modul neu laden oder FHEM neustarten. Wenn das schon reicht, dann mach ich das auswählbar.

Peter21

Ich habe folgende Änderung schon vorgenommen:

   # Neue Display-Instanz starten
   my $oled = HiPi::Interface::MonoOLED -> new(
      "type => SH1106_.$sizex._X_.$sizey._I2C,
      address => $address,
      skip_reset => 1"
   );

   # Werte in Internals sichern

Ich bin der Meinung das hätte reichen sollen,da der Rest ja identisch sein sollte. Meine Vorstellung ist, nur auf den passenden "Treiber" SH1106 umleiten und da die Größe / Pixel / Zeilen identisch sind sollte es funktionieren.

Standarduser

Ich hätte jetzt auch erwartet, dass das die einzig nötige Änderung ist. Wenn das nicht reicht, dann weiß ich im Moment auch erstmal nicht weiter, denn so ein Display besitze ich nicht. Ich könnte also nichtmal irgendwas testen.

Peter21

Ich habe es geschafft das SH1106 zum laufen zu bekommen. Ich habe in der oled_I2C.pm den Start des Display geändert:

    if ($sizey != 32 and $sizey != 64) {
       return "size-y must be 32 or 64";
    }

   # Neue Display-Instanz starten

# Bibliotheken importieren
use HiPi qw( :oled :rpi);
use HiPi::Interface::MonoOLED;
# Display einrichten
my $oled = HiPi::Interface::MonoOLED -> new(
type => SH1106_128_X_64_I2C,
address => 0x3C,
);
# Display zum Start löschen
$oled -> clear_buffer;
$oled -> display_reset();



   # Werte in Internals sichern
   $hash->{oled}       = $oled;
    $hash->{size_x}      = $sizex;


Da Adresse und Maße / Pixel fest sind habe diese einfach mit rein genommen.
Ich hätte da nur noch eine Frage. Ich versuche nun auf dem Display die Temperatur des Raspi anzuzeigen. Meine Idee war, mit einen notify die Readings in die text_line1 zu senden. Leider ohne Erfolg:

Raspi_System:cpu_temp.* { fhem("set oled:text_line1 ". $EVENT) }

Habe ich einen Fehler in dem Notify (mache ich es mir zu einfach), oder war ein anderer Weg zur automatischen Anzeige geplant??

Peter21

OK hat sich erledigt bin soeben über die noch einfachere Lösung gestolpert:

set text_line1 [Raspi_System:cpu_temp]


Danke und schönes Wochenende.

Peter21

Hallo, leider musste ich feststellen,daß diese Variante einmalig zum Erfolg führt und dann der ausgelesene Wert fest im Display steht. Geht man nach einer Aktualisierung wieder auf text_line steht dort der Wert und nicht mehr die Abfrage des Readings.
Hat jemand doch noch einen Vorschlag wie man eigenständig aktualisierte Werte bekommt?????
Danke.

Standarduser

Ich mache das mit einem Notify, hier im Beispiel die Temperatur von Proplanta:

define oled_temp notify Wetter.Proplanta:temperature:.* set oled text_line1 [Wetter.Proplanta:temperature]

Sobald sich der Wert ändert, wird dieser ins Display geschrieben/aktualisiert. Da du damit nur den Wert selbst, ohne Beschriftung übernehmen kannst, gibt es das Attribut OLED_text_line1_prefix. Damit kannst du den statischen Text Raspi_System: davorschreiben. Für das °C hinter dem Wert gibt es das Attribut OLED_text_line1_suffix.

Standarduser

Zitat von: Peter21 am 26 Mai 2019, 09:02:49
Ich habe es geschafft das SH1106 zum laufen zu bekommen. Ich habe in der oled_I2C.pm den Start des Display geändert:

    if ($sizey != 32 and $sizey != 64) {
       return "size-y must be 32 or 64";
    }

   # Neue Display-Instanz starten

# Bibliotheken importieren
use HiPi qw( :oled :rpi);
use HiPi::Interface::MonoOLED;
# Display einrichten
my $oled = HiPi::Interface::MonoOLED -> new(
type => SH1106_128_X_64_I2C,
address => 0x3C,
);
# Display zum Start löschen
$oled -> clear_buffer;
$oled -> display_reset();



   # Werte in Internals sichern
   $hash->{oled}       = $oled;
    $hash->{size_x}      = $sizex;


Da Adresse und Maße / Pixel fest sind habe diese einfach mit rein genommen.

Ich hab gerade nochmal versucht, das nachzuvollziehen. Am Ende hast du doch einfach nur den Displaytyp geändert, oder?
Ich konnte sonst keinerlei Unterschiede erkennen, außer, dass du die Werte fest eingetragen hast. Oder täusche ich mich?
Wie sieht deine 52_I2C_OLED.pm jetzt aus? Kannst du die vielleicht mal vollständig anhängen?

Peter21

Besten Dank für die Hinweise, konnte ich am Wochenende erfolgreich umsetzen ;D ;D ;D. Ich habe noch den Impuls des Bewegungsmelder genutzt um die Datenlast zu reduzieren. Wenn man sich jetzt dem Display nährt, schaltet sich das Display (Licht) an und die Daten werden aktuell vom notify übertragen.
Ich hänge mal meine funktionierende Variante dran. Bei dieser habe ich aber die Ergänzung von Seite 1 nicht mit einbringen können. Ich bekomme anscheinend durch die feste Adresse beim Start gleich eine Fehlermeldung. Also falls das Display defekt oder abhanden kommt,einloggen mit putty und die 52_I2C_OLED umbennen (reicht) und FHEM startet auch wieder. Ich kann mit diesem Bug leben.
Ich habe noch die Zeilen im Display auf 5 reduziert und die Schrift eine Nummer größer gestaltet. Die Augen werden im Alter auch nicht besser ::).

Standarduser

Zitat von: Peter21 am 03 Juni 2019, 17:46:04
Ich habe noch die Zeilen im Display auf 5 reduziert und die Schrift eine Nummer größer gestaltet. Die Augen werden im Alter auch nicht besser ::).

Das kannst du auch über die Attribute einstellen, ich dachte mir nämlich schon, dass die Schrift dem einen oder anderen zu klein sein wird.

Peter21

Habe ich auch so gemacht, über Atribute eingestellt.

Besten Dank nochmal für das nützliche Modul!!!!!


Standarduser

#28
Zitat von: Peter21 am 03 Juni 2019, 17:46:04
Besten Dank für die Hinweise, konnte ich am Wochenende erfolgreich umsetzen ;D ;D ;D. Ich habe noch den Impuls des Bewegungsmelder genutzt um die Datenlast zu reduzieren. Wenn man sich jetzt dem Display nährt, schaltet sich das Display (Licht) an und die Daten werden aktuell vom notify übertragen.
Ich hänge mal meine funktionierende Variante dran. Bei dieser habe ich aber die Ergänzung von Seite 1 nicht mit einbringen können. Ich bekomme anscheinend durch die feste Adresse beim Start gleich eine Fehlermeldung. Also falls das Display defekt oder abhanden kommt,einloggen mit putty und die 52_I2C_OLED umbennen (reicht) und FHEM startet auch wieder. Ich kann mit diesem Bug leben.
Ich habe noch die Zeilen im Display auf 5 reduziert und die Schrift eine Nummer größer gestaltet. Die Augen werden im Alter auch nicht besser ::).

Hi Peter,

ich hab mal eine überarbeitete Version angehängt. Hast du Lust, die mal auszuprobieren?

Peter21

Sorry für die extrem späte Antwort. Habe mir die Datei gedownloadet und werde sie in den Oktoberferien mal testen. Melde mich wie es ausgegangen ist. Bis Dato läuft meine Variante stabil, da ich auch noch nichts verändert habe, never touch a running system :-).