Standard LCD zur Statusanzeige

Begonnen von bg2411, 23 Februar 2016, 16:24:51

Vorheriges Thema - Nächstes Thema

bg2411

Hallo Leute,
ich denke gerade darüber nach, wie man ein einfaches (meinetwegen) zweizeiliges LCD-Display (I2C oder SPI) via Funk mit FHEM auf dem Raspberry verbinden kann. Gibt es jemanden, der das schon gebaut hat (zwecks Ideen ;- ) )?

schka17

Yes, ich habe mehrere in allen Dimensionen und Farben, sind viel zuverlässiger und energiesparender als Tablets. Ich habe zur Zeit zwei Varianten im Einsatz, beide basieren auf ESP, einmal als Bridge und einem Nano mit Firmata, oder mit der espeasy als firmware und direkt an den ESP angeschlossen. Physisch werden die LCD's über I2C Adapter angeschlossen, bei Firmata verwende ich DLCD und I2CLCD, bei espeasy verwende ich DLCD für die Generierung der Inhalte und pushe dann über http ans Display. Funktioniert übrigens auch hervorragend mit den kleinen eleganten OLED Displays, dafür suche ich noch eine Möglichkeit diese in mein Schalterprogramm zu integrieren.


Sent from my iPad using Tapatalk
M: Thinclient x64 Debian | CUL FS20, HMS100WD, HMS100TF, HMS100T, HMS100CO, S300, S555TH | OWServer DS1420, DS18B20, DS2408 | RFXCOM UVN128, THWR800, THGR228N,RTGR328, PCR800 |Jeelink PCA301 EC3000|CUNO+IR|HMLAN|HMUSB|CUL433 Somfy|mySensors|espEasy
S1:Raspberry mit BPM810, Jeelink EC3000

bg2411

Was benutzt du für Empfänger (RFM oder CC1101)?

klingt interessant. Wie funktioniert die Ansteuerung (ESP sagt mir nichts) über I2C? Hast Du einen Arduino, der die Schnittstelle zwischen Display und Raspi bildet?

oli82

#3
Hier die Infos:
ESP LCD
ESP OLED
ESP Allgemein

Der ESP8266 ist ein sehr günstiges Wlan2Seriell Modul. Die Kommunikation läuft komplett über WLan. Somit kannst du das Display unabhängig vom Raspberry mit den Daten füttern.
Gibt hier sogar ein Unterforum: LINK

tomster

Zitat von: schka17 am 23 Februar 2016, 16:47:10
Yes, ich habe mehrere in allen Dimensionen und Farben, sind viel zuverlässiger und energiesparender als Tablets. Ich habe zur Zeit zwei Varianten im Einsatz, beide basieren auf ESP, einmal als Bridge und einem Nano mit Firmata, oder mit der espeasy als firmware und direkt an den ESP angeschlossen. Physisch werden die LCD's über I2C Adapter angeschlossen, bei Firmata verwende ich DLCD und I2CLCD, bei espeasy verwende ich DLCD für die Generierung der Inhalte und pushe dann über http ans Display. Funktioniert übrigens auch hervorragend mit den kleinen eleganten OLED Displays, dafür suche ich noch eine Möglichkeit diese in mein Schalterprogramm zu integrieren.

Genau DAS suche ich schon seit ewiger Zeit (inkl. Integration in ein Schalterprogramm). Kannst Du dazu ein bissl mehr Infos geben?
Wenn ich es richtig verstehe (bin ESP-Newbie), dann einfach espeasy auf den ESP flashen und Display anlöten. Klingt easypeasy ;-)
Wie genau pushst Du aus FHEM?

"Problematisch" könnte ein UP-Netzteil sein. Ich vermute eine Fertiglösung kostet ein Vielfaches eines ESPs...

oli82

#5
Zitat von: tomster am 24 Februar 2016, 13:31:22
"Problematisch" könnte ein UP-Netzteil sein. Ich vermute eine Fertiglösung kostet ein Vielfaches eines ESPs...

Oh ja. Habe aktuell zwei verschiedene 5V 1A VDE konforme Netzteile im Test. Kostenpunkt 22-35€. Chinanetzteile gibt es ab 2€ (Immer an die kosten für das Haus denken ;) )
Pushen ist recht gut auf der oben genannten Seite beschrieben:
http://<ESP IP address>/control?cmd=oled,<row>,<col>,<text>
It is also possible to switch on or off the OLED or to clear the display. During the off state, the content will be updated according to the latest values or states.
http://<ESP IP address>/control?cmd=oledcmd,on
http://<ESP IP address>/control?cmd=oledcmd,off
http://<ESP IP address>/control?cmd=oledcmd,clear


Ich habe aktuell ein OLED Display in einem Blinddeckel von Gira verbaut. Liegt aber noch auf dem Schreibtisch. Loch in der Größe des Displays aus dem Deckel gedremelt und das Display von hinten eingeklebt

tomster

Zitat von: oli82 am 24 Februar 2016, 14:04:19
Ich habe aktuell ein OLED Display in einem Blinddeckel von Gira verbaut. Liegt aber noch auf dem Schreibtisch. Loch in der Größe des Displays aus dem Deckel gedremelt und das Display von hinten eingeklebt

Genau das war auch meine Ansatz (hast ein Foto?). Hab auch GIRA (Serie 55, vermutlich wie du) verbaut und vorhin schon einmal ein paar Blinddeckel zum Testen geshoppt ;-)
OLEDs und ein paar ESPs werd ich gleich Mal suchen. Meine vor 2 Wochen getätigte ESP-Bestellung beim Chinesen wird wohl noch dauern. Wird's aber wohl auch aus DE geben für eine Hand voll Dollar mehr.

Bei den Netzteilen bin ich gerne bereit 25-35 E abzudrücken, wenn ich dann eine vernünftige Lösung bekomme. Die übrigen Bauteilen kosten dafür ja quasi nix...

oli82

Zitat von: tomster am 24 Februar 2016, 14:29:10
Genau das war auch meine Ansatz (hast ein Foto?).

Leider komme ich erst in ner Woche wieder an meinen Schreibtisch. Dann poste ich das Foto :)

bg2411

Das klingt sehr interessant.

Bräuchte ich zu dem ESP8266 auch noch einen Arduino o.ä?
Oder reicht der ESP in Verbindung mit dem entsprechenden Display aus,
um Daten anzeigen zu lassen?

oli82

Der Arduino fällt dank ESP-Easy weg

schka17

Ich verwende 5V Netzteile von Pollin, da habe ich mal dutzende für unter einem Euro das Stück gekauft, das passt locker in eine UP Dose, hat aber kein Gehäuse, ich verwende die auch meistens in den Steckergehäusen z.b. für Aktoren. Ich habe auch sehr günstige Printnetzteile gefunden, warte auf die erste Lieferung.
Bei Verwendung von LCD's muss man noch aufpassen dass auf dem I2C Bus keine 5V Signale kommen, das mag der Esp nicht so.
Achja, an einer Kleinigkeit verzweifle ich im Moment noch bei espeasy, nämlich mit dem posten von Sonderzeichen wie z.b. ° , das schaffe ich nicht direkt aus fhem sondern nur über ein shell script.

(http://uploads.tapatalk-cdn.com/20160225/4637c849b0fe8b78f75eca2f99363921.jpg)
(http://uploads.tapatalk-cdn.com/20160225/e8ff6bf7ba272e615d7e77002e89f39a.jpg)


Sent from my iPad using Tapatalk
M: Thinclient x64 Debian | CUL FS20, HMS100WD, HMS100TF, HMS100T, HMS100CO, S300, S555TH | OWServer DS1420, DS18B20, DS2408 | RFXCOM UVN128, THWR800, THGR228N,RTGR328, PCR800 |Jeelink PCA301 EC3000|CUNO+IR|HMLAN|HMUSB|CUL433 Somfy|mySensors|espEasy
S1:Raspberry mit BPM810, Jeelink EC3000

schka17

hier ein bischen im Detail:
Variante 1, espeasy (nodemcu devkit 1.0 mit esp-12) und OLED Display über I2C angeschlossen
Screenshot der Konfiguration im espeasy:
Die Werte werden mal direkt aus den angeschlossenen Sensoren übernommen.
Die Uhrzeit (würde auch direkt gehen über ntp server) pushe ich alle Minuten (getriggert durch den Luftsensor der alle Minuten meldet), das ist mal nur um das Konzept zu testen:
Internals:
   DEF        esp_sensor_4:air.* {
my $Zeit=(ReadingsVal ("FP_Time","state","error"));
my $Datum=(ReadingsVal ("FP_Date","state","error"));
Log 3, "set LCD_esp_sensor_4: $Zeit $Datum";
system("sudo curl -s --request GET \"http://192.168.255.64/control?cmd=oled,1,1,$Zeit\"\> /tmp/null ");
system("sudo curl -s --request GET \"http://192.168.255.64/control?cmd=oled,1,7,$Datum\"\> /tmp/null ");
}
   NAME       n_LCD_esp_sensor_4
   NOTIFYDEV  esp_sensor_4
   NR         2536
   NTFY_ORDER 50-n_LCD_esp_sensor_4
   REGEXP     esp_sensor_4:air.*
   STATE      2016-02-25 10:09:34
   TYPE       notify
   Readings:
     2016-02-25 01:17:50   state           active
Attributes:
   devStateIcon disabled:ios-off active:ios-on-green
   room       development
   verbose    0


offene Punkte hier sind Sonderzeichen (eben das ° Zeichen) und die Rundung der Werte das zur Zeit im Sensor nicht möglich ist.

Variante 2, espeasy (esp-01) mit I2C LCD Display (in der Wintergarten Steuerung):
keine lokalen Sensoren, alle Date gepusht von FHEM,
DLCD device erzeugt/formatiert den Inhalt:
Internals:
   NAME       LCD_WG
   NR         2494
   NTFY_ORDER 50-LCD_WG
   STATE      <br>20.6°C on 6.5°C<br>auto 18°C 0%
   TYPE       DLCD
   Readings:
     2016-02-25 10:15:00   Line1           20.6°C on 6.5°C
     2016-02-25 07:52:49   Line2           auto 18°C 0%
     2016-02-25 01:17:49   Line3           attr dlcdLine3 %time1%
     2016-02-25 01:17:49   Line4           attr dlcdLine4 %time1%
     2016-02-25 10:16:53   scrollingState  0
     2016-02-25 10:15:00   state           10:15:00
Attributes:
   dlcdCols   16
   dlcdLine1  %2%°C %6% %1%°C
   dlcdLine2  %4% %5%°C %3%
   dlcdReplaceRegex °=ß
   dlcdRows   2
   dlcdScrolling 1
   dlcdVal1   Outdoor_Weather:temperature
   dlcdVal2   TF_IS2:temperature
   dlcdVal2formatnum 2+1
   dlcdVal3   Heizung_WG:actuator
   dlcdVal3formatnum 2+0
   dlcdVal4   Heizung_WG:mode
   dlcdVal5   Heizung_WG:desired-temp
   dlcdVal5formatnum 2+0
   dlcdVal6   WG_Automatik:state
   dlcdVal7   Heizung_WG:actuator
   dlcdVal7formatnum 2+0
   room       development
   stateFormat <br>Line1<br>Line2


ein notify, getriggert durch Änderungen in der Anzeigen startet ein shell-script (ich schaffe es noch nicht das ° Zeichen direkt zu pushen, any input welcome)
Internals:
   DEF        LCD_WG:Line.* {
Log 1, "set LCD_WG: $EVENT";
my $state = $EVTPART1;
my $TF_WG = sprintf ("%2.0f",ReadingsVal ("TF_IS2","temperature","error"));
my $AT = sprintf ("%2.0f", ReadingsVal ("THPL_Outdoor","temperature","error"));
my $WG_mode = ReadingsVal("WG_Automatik","state","0");
my $HZ_mode = ReadingsVal("Heizung_WG","mode","0");
my $HZ_soll = sprintf ("%2.0f", ReadingsVal("Heizung_WG","desired-temp","0"));
my $HZ_act = ReadingsVal("Heizung_WG","actuator","0");
system("sudo /scripts/set_LCD_WG 192.168.255.62 $TF_WG $AT $WG_mode $HZ_mode $HZ_soll $HZ_act \&> /dev/null 2\>\&1");
}
   NAME       n_LCD_WG
   NOTIFYDEV  LCD_WG
   NR         2495
   NTFY_ORDER 50-n_LCD_WG
   REGEXP     LCD_WG:Line.*
   STATE      2016-02-25 10:17:13
   TYPE       notify
   Readings:
     2016-02-25 01:17:49   state           active
Attributes:
   devStateIcon disabled:ios-off active:ios-on-green
   room       Events
   verbose    0


Das shell script macht den Rest

#!/bin/bash
#STATUS=$@
# Aufruf: ip-adresse Innentemperatur Aussentemperatur WG_Automatik WG_Heizungsautomatik HZ_Solltemperatur Actuator
echo off
Display=$1
IT=$2
AT=$3
WG_mode=$4
HZ_mode=$5
HZ_soll=$6
Actuator=$7
#curl --request GET  "http://192.168.255.63/control?cmd=lcd,1,1,Test%20mit%20ßC"
#echo "$STATUS"
function SET_LCD {
        curl -s --request GET  "http://$Display/control?cmd=lcd,$l,$c,$msg" &> /dev/null 2>&1
        #echo "$msg"
}

#clear the display
curl --request GET  "http://$Display/control?cmd=lcdcmd,clear" > /dev/null 2>&1

#Innentemperatur

msg="$ITßC"
l="1"
c="1"
SET_LCD
####Aussentemperatur
msg="$ATßC"
l="1"
c="12"
SET_LCD
####WG_Modus
msg="$WG_mode"
l="1"
c="7"
SET_LCD
####HZ_Modus
msg="$HZ_mode"
l="2"
c="7"
SET_LCD
####Solltemperatur
msg="$HZ_sollßC"
l="2"
c="1"
SET_LCD
####Solltemperatur
msg="$Actuator"
l="2"
c="14"
SET_LCD
exit


Variante 3, esp-01 mit transparent Bridge firmware, nano mit firmata, LCD über I2C angeschlossen, dieses Display ist in einer Entwicklungsumgebung und die Daten werden per MQTT abgefragt, die Daten/DLCD sind in der Produktionsumgebung und werden von dort zum Broker gepostet:

I/O Device (nano mit firmata über esp):
Internals:
   DEF        192.168.255.60:23@57600
   DeviceName 192.168.255.60:23@57600
   FD         20
   NAME       WLAN_NANO
   NOTIFYDEV  global
   NR         136
   NTFY_ORDER 50-WLAN_NANO
   PARTIAL
   STATE      Initialized
   TYPE       FRM
   analog_pins 14,15,16,17,18,19,20,21
   analog_resolutions 14:10,15:10,16:10,17:10,18:10,19:10,20:10,21:10
   encoder_pins 2,3
   encoder_resolutions 2:28,3:28
   firmware   firmata_config_o_nw.ino
   firmware_version V_2_06
   i2c_pins   18,19
   input_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
   onewire_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
   output_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
   pwm_pins   3,5,6,9,10,11
   pwm_resolutions 3:8,5:8,6:8,9:8,10:8,11:8
   servo_pins 2,3,4,5,6,7,8,9,10,11,12,13
   servo_resolutions 2:14,3:14,4:14,5:14,6:14,7:14,8:14,9:14,10:14,11:14,12:14,13:14
   stepper_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
   stepper_resolutions 2:21,3:21,4:21,5:21,6:21,7:21,8:21,9:21,10:21,11:21,12:21,13:21,14:21,15:21,16:21,17:21,18:21,19:21
   Readings:
     2016-02-25 09:56:29   state           opened
Attributes:
   room       development
   verbose    2


Firmata I2C device:
Internals:
   DEF        39 0 2
   IODev      WLAN_NANO
   NAME       NANO_I2C
   NR         138
   STATE      defined
   TYPE       FRM_I2C
   i2c-address 39
   i2c-bytestoread 2
   i2c-register 0
   Readings:
     2015-10-14 10:32:31   values          0 0
Attributes:
   IODev      WLAN_NANO
   event-min-interval 10
   room       development
   verbose    0

I2C-LCD device
Internals:
   DEF        20 4 39
   I2C_Address 39
   IODev      WLAN_NANO
   NAME       NANO_I2C_LCD
   NR         139
   STATE      0
   TYPE       I2C_LCD
   sizex      20
   sizey      4
   Readings:
     2016-02-25 09:56:33   backlight       on
     2016-02-25 09:56:33   text            0
     2016-02-25 10:28:08   writeXY         0,0,20,1 10:28 Aussen: 6.6°C
   Mapping:
     P0         RS
     P1         RW
     P2         E
     P3         LED
     P4         D4
     P5         D5
     P6         D6
     P7         D7
Attributes:
   IODev      WLAN_NANO
   pinMapping P0=RS,P1=RW,P2=E,P3=LED,P4=D4,P5=D5,P6=D6,P7=D7
   replaceRegex ß=\x{DF},~=\x{7E},⌂=\x{7F},°=\x{DF},>=\x{7E},<=\x{7F}
   restoreOnReconnect on
   restoreOnStartup on
   room       development
   stateFormat text
   verbose    5


MQTT Device (Display content):

Internals:
   IODev      MQTT
   NAME       LCD_1
   NR         108
   STATE      10:31 Aussen: 6.6°C <br>BR: >67°C <70°C 0% <br>WG: >40°C <40°C 0% <br>Mischer: >29°C <28°C
   TYPE       MQTT_DEVICE
   qos        0
   retain     0
   Readings:
     2016-02-25 10:31:03   Line1           10:31 Aussen: 6.6°C
     2016-02-25 10:29:30   Line2           BR: >67°C <70°C 0%
     2016-02-25 09:56:37   Line3           WG: >40°C <40°C 0%
     2016-02-25 10:31:45   Line4           Mischer: >29°C <28°C
     2016-02-25 10:31:45   transmission-state incoming publish received
   Message_ids:
   Sets:
   subscribe:
     /LCD_1/+
     /LCD_1/Line1
     /LCD_1/Line2
     /LCD_1/Line3
     /LCD_1/Line4
   subscribeExpr:
     ^\/LCD_1\/([^/]+)$
     ^\/LCD_1\/Line1$
     ^\/LCD_1\/Line2$
     ^\/LCD_1\/Line3$
     ^\/LCD_1\/Line4$
   Subscribereadings:
     /LCD_1/Line1 Line1
     /LCD_1/Line2 Line2
     /LCD_1/Line3 Line3
     /LCD_1/Line4 Line4
Attributes:
   IODev      MQTT
   autoSubscribeReadings /LCD_1/+
   event-on-update-reading Line.*
   room       development
   stateFormat Line1 <br>Line2 <br>Line3 <br>Line4
   subscribeReading_Line1 /LCD_1/Line1
   subscribeReading_Line2 /LCD_1/Line2
   subscribeReading_Line3 /LCD_1/Line3
   subscribeReading_Line4 /LCD_1/Line4


und das notify um die Änderungen zu pushen

Internals:
   DEF        LCD_1:Line.* {
my $state = $EVENT;
Log 3, "set LCD1: $EVENT";
if ($state =~ m/Line1/i)
{my $ZeileNo = "1";
  my $Zeile = ReadingsVal ("LCD_1","Line$ZeileNo","error");
fhem "set NANO_I2C_LCD  writeXY 0,0,20,1 $Zeile";
}
if ($state =~ m/Line2/i)
{my $ZeileNo = "2";
  my $Zeile = ReadingsVal ("LCD_1","Line$ZeileNo","error");
fhem "set NANO_I2C_LCD  writeXY 0,1,20,1 $Zeile";
}
if ($state =~ m/Line3/i)
{my $ZeileNo = "3";
  my $Zeile = ReadingsVal ("LCD_1","Line$ZeileNo","error");
fhem "set NANO_I2C_LCD  writeXY 0,2,20,1 $Zeile";
}
if ($state =~ m/Line4/i)
{my $ZeileNo = "4";
  my $Zeile = ReadingsVal ("LCD_1","Line$ZeileNo","error");
fhem "set NANO_I2C_LCD  writeXY 0,3,20,1 $Zeile";
}
}
   NAME       n_set_LCD_v2
   NOTIFYDEV  LCD_1
   NR         109
   NTFY_ORDER 50-n_set_LCD_v2
   REGEXP     LCD_1:Line.*
   STATE      2016-02-25 10:33:07
   TYPE       notify
   Readings:
     2016-02-25 09:56:22   state           active
Attributes:
   room       development
   verbose    0

M: Thinclient x64 Debian | CUL FS20, HMS100WD, HMS100TF, HMS100T, HMS100CO, S300, S555TH | OWServer DS1420, DS18B20, DS2408 | RFXCOM UVN128, THWR800, THGR228N,RTGR328, PCR800 |Jeelink PCA301 EC3000|CUNO+IR|HMLAN|HMUSB|CUL433 Somfy|mySensors|espEasy
S1:Raspberry mit BPM810, Jeelink EC3000

schka17

hier noch ein Bild der dritten Variante.

So, und jetzt habe das ganze auch das erste Mal dokumentiert  :D
M: Thinclient x64 Debian | CUL FS20, HMS100WD, HMS100TF, HMS100T, HMS100CO, S300, S555TH | OWServer DS1420, DS18B20, DS2408 | RFXCOM UVN128, THWR800, THGR228N,RTGR328, PCR800 |Jeelink PCA301 EC3000|CUNO+IR|HMLAN|HMUSB|CUL433 Somfy|mySensors|espEasy
S1:Raspberry mit BPM810, Jeelink EC3000

ckaytwo

Hallo zusammen,

ich hoffe ich bin hier richtig und darf mich anhängen auch wenn mein Projekt nicht die anforderung Funk hat, da ich bereits Kabel gezogen habe.

Ich versuche ein display und 6 Tasten in eine Blindabdeckung von Merten zu verstauen. Als basis wird ein Arduino nano mit eingepflanzt.
Die Tasteneingaben über Firmata läuft super und auch 1-Wire hatte ich am laufen, nur das display macht probleme.
Display könnte das selbe oled wie von schka17 sein. (128x64 oled i2c ssd1603)

Laut Commandref werden leider auch nur displays mit 2004 oder 1602 unterstützt und ich bin mir nicht sicher ob ich alles richtig gemacht habe.

Laut i2c scanner hat das Display die Adresse 60

Arduino
define Ard01 FRM /dev/ttyUSB0@57600
attr Ard01 i2c-config 1
attr Ard01 room Arduino01
attr Ard01 sampling-interval 1000
attr Ard01 verbose 0


I2C (pin A4 A5) wobei mir völlig unkar ist ob das noch gebraucht wird.
Ich bin auch nicht sicher woher ich die Infos von <register> und <bytes-to-read> her bekomme.

define Firmata_I2C FRM_I2C 60 0 7
attr Firmata_I2C IODev Ard01



das LCD selber
define oled I2C_LCD 128 64 60
attr oled IODev Ard01
attr oled pinMapping P0=RS,P1=RW,P2=E,P3=LED,P4=D4,P5=D5,P6=D6,P7=D7
attr oled room Arduino01
attr oled stateFormat text


Aber vielleicht tut sich hier ja noch ein unterstütztes Display auf was in die Blindabdeckung passt.

Das LCD (getestet mit demo-scetch) ist trotz seiner größe aber wirklich gut abzulesen (weiße schrift)

Bin mal gespannt was hier noch zusammen kommt.

beSmart

Hallo schka17.

Kannst du bitte mal von Variante2 den Teil aus deiner fhem.cfg hier veröffentlichen?
Aus den Code-Boxen werde ich nicht schlau, da sie fü mich schwer verständlich sind.

Dank und Gruß

beSmart