MODBUS Module und TFT Tastenfeld

Begonnen von tante ju, 23 September 2015, 23:11:38

Vorheriges Thema - Nächstes Thema

tante ju

Hallo,

Nach langer Zeit wieder was von mir :-)

Habe die letzten Tage damit zugebracht, zum einen ein Modbus Modul nach https://docs.google.com/document/d/1NexyDgWcd7yxAVQS2JbSQji1RmOajrBP0WLHMTnVKnw/edit?pli=1 zum Laufen zu bringen, was nach einigem Troubleshooting und Fehlerbeseitigung jetzt auch seinen Dienst macht. Ist ja ein ziemlich universelles Modul, was bei mir jetzt einen DHT11 abfragt und über den zweiten IO Licht an und ausschaltet.

Besteht hier Interesse an sowas, dann kan ich die Sourcen und die Eagle-Dateien hochladen. Müsste allerdings vorher noch versuchen den originalen Autor wg. Zustimmung zu kontaktieren. Bis dahin lieber über Mail.


Und nun zu meinem zweiten Projekt. Wir kennen alle, daß nach einiger Zeit die Schalter immer an der falschen Stelle sind. Ich zum Beispiel habe in meinem Arbeitszimmer keinen Schalter für die Rollos. Dank FHEM, Siemens LOGO Anbindung und Tablet-UI alles kein Problem. Aber ideal ist das nicht.
Dann hatte ich noch eine ganze Kiste Displays hier rumliegen und gerade das obige Modbus-Modul mit FHEM ans Rennen gebracht. Also warum nicht daraus mal was machen?

Auf anliegendem Bild (sofern das mit dem Upload klappt) mal das Display mit einem Standardrahmen daneben. Es ist ein TFT 320*240 mit resistivem Touchpanel. Neben dem Display ist da eigentlich nur noch ein ATMega368, ein MAX487 und wenige Einzelteile dabei. Man könnte es auch mit einem Arduino betreiben. Habe es noch auf den Breadboards, weil ich noch eine PLatine bauen muß und einen Rahmen drucken, so daß das ganze als normales Schalterelement an die Wand zu montieren ist. Mit Arduino passt das nicht so ganz, wenn man keine größere Box haben möchte.

Die geklöppelte Software (das ist zur Zeit wirklich ziemlich geklöppelt, bin da wohl ein paar Jahrzehnte aus der Übung) stellt die Buttons und die Steuerung zur Verfügung, sowie die Modbus-Steuerung.

Zur Erklärung der Funktion ein bischen viel Text:
Das Display-Modul hat zehn Holding-Register. Darüber hinaus kann man dort Tasten definieren, die entweder On, Off, Toggle (On/Off), Increment, Decrement,  Slider oder Slider/On/Off sind und jeweils auf eines der Holding-Register gemappt werden. Betätigt man die Taste durch Berühren des Displays wird die entsprechende Funktion ausgeführt und das Holding-Register aktualisiert, welches von FHEM ausgelesen werden kann. Umgekehrt wird auch jede Änderung in einem der Holding-Register auf dem Display widergespiegelt.

Beispiel (auf dem Bild die linken beiden Tasten):
Taste 1 Größe 7*8 (der Einfachheit halber ist das Display logisch in 16*16 Segmente unterteilt), Position 0,0; Verbunden mit Register 0, Funktion ON
Taste 2 Größe 7*8, Position 0,8; Verbunden mit Register 0, Funktion OFF

Drückt man jetzt Taste 1, wird Register 0 (Modbus Holding 100) auf 1 gesetzt. Da Register 0 jetzt 1 ist, wird die ON-Taste deaktiviert un die OFF-Taste aktiviert.

Ähnliches funktioniert mit dem Slider on Increment/Decrement.

Wenn FHEM auf H100 schreibt, dann werden natürlich die Buttons auch entsprechend aktualisiert.

Darüber hinaus ist die gesamte Button-Struktur per Modbus erreichbar und umprogrammierbar. Man muß also nicht jedesmal den ICSP Programmer auspacken, wenn man was ändern möchte. Buttons hinzufügen, Beschriftung ändern, Farben ändern usw. ist alles über Modbus machbar und kann auch im EEPROM gespeichert werden.

Mehr Funktionen sind theorethisch möglich, aber der Prozessor hat nur 32K Flash und 2K RAM und ich knapse immer an den oberen Grenzen rum. Deswegen mußte ich auch die zugezogenen Quellen für TFT-Bedienung, Modbus und Buttons massiv anpassen, damit das bisherige alles rein passt. Es besteht noch Optimierungspotential im Code, aber das macht das nicht wirklich übersichtlicher...

Nach dem langen Text nun die Frage: Besteht Interesse an diesem Projekt, dann würde ich mich über Mitstreiter freuen.

Hollo

Also ich finde das eine recht interessante Vorstellung.

Kannst Du vielleicht noch ein paar Zusatzinfos geben...
Was benötigt man am jeweiligen "Montageort" für Kabel dafür (Versorgungsspannung, Busleitung,...)?
Wie sieht es ungefähr mit den Kosten pro "Tasteneinheit" aus?

Verstehe ich das richtig, das man das Display neben der "Tastenfeld-Funktion" auch als "Anzeigeeinheit" nutzen kann/könnte?
Oder bedingen Anzeigeänderungen momentan eine "Umprogrammierung"?

Ich versuche gerade gedanklich einen Vergleich zu dem HM-Display-Wandtaster zu ziehen.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

tante ju

Hatte mir den anderen Display/Taster angeschaut und das war nix für mich. Ich will bei so einem kleinen Wandgerät nicht erst durch Räume/Menüs scrollen und das updaten ist da wirklich nicht schön.

Hier ist die Displayfläche in 16*16 Zellen unterteilt und jeder kann frei entscheiden, wo und wie groß ein Tastenelement erscheint und was es zumindest im Register auslöst, welches FHEM dann ja auswerten kann. Bei meiner Lösung ist also FHEM (oder irgendein Modus-Master) notwendig, da das Tastenfeld nicht direkt mit Sensoren/Aktoren kommuniziert.

Zitat von: Hollo am 24 September 2015, 09:10:32
Also ich finde das eine recht interessante Vorstellung.

Kannst Du vielleicht noch ein paar Zusatzinfos geben...
Was benötigt man am jeweiligen "Montageort" für Kabel dafür (Versorgungsspannung, Busleitung,...)?
Wie sieht es ungefähr mit den Kosten pro "Tasteneinheit" aus?

Verstehe ich das richtig, das man das Display neben der "Tastenfeld-Funktion" auch als "Anzeigeeinheit" nutzen kann/könnte?
Oder bedingen Anzeigeänderungen momentan eine "Umprogrammierung"?

Ich versuche gerade gedanklich einen Vergleich zu dem HM-Display-Wandtaster zu ziehen.

Mein Modbus ist eine 4-adrige Leitung geringen Querschnitts, die A und B führt und daneben auch 12V zur Versorgung der Module. Das reicht hierfür völlig aus. Größter Verbraucher ist das Display. Müsste mal nachschauen, wieviel mA das sind.

Wenn es das letzte Gerät am Bus ist, dann braucht man die Busleitung auch nur genau einmal.

Kosten bis jetzt: Display 12 EUR, Atmel 2 EUR, Kleinteile ca. 4 EUR
Dazu kommen noch die Platine, die ich gerade entwerfe und das Gehäuse, welches ich, wie gesagt noch zeichnen und drucken muß, da ich leider noch kein Display für schmales Geld gefunden habe, welches genau in den Ausschnitt einer Schalterabdeckung passt.

Eine Funktion einzubauen, die textuell einen Wert aus einem Register anzeigt, steht auf meiner Todo für die nächsten Tage. Bislang habe ich nur eine "Säule" drin, die einen Wert 0-100% darstellen kann (im Bild in der Mitte) und auch als An/Aus (=0%/100%) fungieren kann.


tante ju

So,

Das Modul läuft, wie man auf dem Bild sieht. Dort ist links ein Schalter AN/AUS, rechts ein Dimmer, in der Mitte für den Dimmer eine Säule (0-100% mit Schnellfunktionen) und unten eine Wertanzeige.

Was die Software bislang macht, hier mal das bisherige README:

Die Modbus-Register sind

99    Slave-Adresse, sofort nach Schreiben auf dieses Register wird die Slave-Adresse umgestellt und die neue Adresse im EEPROM gespeichert.

100   Register 0
101   Register 1
102   Register 2
103   Register 3
104   Register 4
105   Register 5
106   Register 6
107   Register 7
Diese Register können gelesen und beschrieben werden. Alle Register sind 16 Bit breit und werden von den einzelen Display-Elementen referenziert.
Wenn also ein Button die Funktion ON hat und auf ein Register 0 verweist, dann wird bei Betätigung dieses Buttons, das Register 0 auf 1 gesetzt.
Ein zweiter Button mit der Funktion OFF, der auch auf Register 0 verweist, würde dieses Register bei Betätigung auf 0 setzen.
Ein Schreibvorgang auf eines dieser Register führt dazu, daß auch das entsprechende Element auf dem Display aktualisiert wird.

209   Action Register
Bei Schreibvorgängen in dieses Register werden Aktionen ausgelöst:
0x0004  Schreibt die komplette Button-Struktur ins EEPROM, so daß sie nach Neustart automatisch aufgerufen wird.

Der Aufbau der Register für die einzlenen Button-Elemente ist immer gleich, weswegen hier nur ein Satz dargestellt ist. Die Startadresse ist
bei 210 + 20*Button-Nr. Für den ersten Button (Nummer 0) ist es also 210, für den zweiten 230 und so weiter.

210   Position und Breite 0xABCD
A=Position X-Achse von 0 bis f (0 bis 15).
B=Position Y-Achse von 0 bis f
C=Breite-1 (also eine 0 ist Breite 1 und f ist Breite 16)
D=Höhe-1
Das Display ist in 16 * 16 Zellen unterteilt. Die Breite einer Zelle ist Displaybreite/16 und die Höhe entsprechend Displayhöhe/16.
0,0 ist die linke obere Ecke.
Mit diesem Register wird die linke obere Ecke des Buttons festgelegt und wie hoch und wie breit der Button dann nach rechts unten unten geht.
Ein Element ist immer mindestens 1 Zelle hoch und breit

211 Register und Funktion 0xRRFF
Das obere Byte mit RR gibt das Register an, mit welchem dieser Button verknüpft ist. Es ist hilfreich nur auf die definierten Register 0-7 zu verweisen.

Das untere Byte gibt die Funktion dieses Buttons an (Bitfeld):
0x01  DISPLAY   Dieses Element stellt nur Werte dar und kann keine Aktionen ausführen. Der Text aus "Label" wird dargestellt und an der Stelle, an der
der Text ein "&" enthält wird der Wert des zugehörigen Registers eingesetzt. Wenn der Text also "Es ist & Grad" lautet und das Register 2 verlinkt ist,
dann würde bei einem Wert von 23 in Register 2 der Text "Es ist 23 Grad" dargestellt werden.
0x02  INCREMENT Mit jeder Betätigung wird das zugehörige Register erhöht, bis maximal 100. Sobald das Register 100 erreicht hat, wird dieses Element deaktiviert.
0x04  DECREMENT Mit jeder Betätigung wird das zugehörige Register verringert, bis es 0 erreicht. Sobald das Register 0 erreicht hat, wird dieses Element deaktiviert.
0x08  ON        Bei Betätigung wird das zugehörige Register auf 1 gesetzt. Ist das Register nicht 0, dann wird der Button deaktiviert bis es 0 ist.
0x10  OFF       Bei Betätigung wird das zugehörige Register auf 0 gesetzt. Ist das Register 0, dann wird der Button dekativiert, bis es nicht 0 ist.
0x20  SLIDER    Stellt eine senkrechte Säule dar, die je nach Wert des zeghörigen Registers im Bereich 0 bis 100 gefüllt ist. Dieser Wert ist auch mit ON und OFF
kombinierbar, wodurch die Säule eine "AN/Aus" Funktion erhält. Ist das Register auf einem Wert kleiner 100, dann würde es bei der ersten Berührung mit ON auf 100
gesetzt werden und wenn es 100 ist und OFF aktiviert ist, dann würde eine weitere Bereührung es auf 0 setzen.

212 Statuswert
Der Statuswert gibt Verhalten des Buttons auf dem Display an. Im Gegensatz zum Funktionswert wird hiermit die Darstellung beeinflusst.
0x0000    NORMAL    Ein normaler Button mit farbigem Hintergrund, Text als Label, helle Umnrandung, aktivierbar. Dies kann durch Funktionen aufgehoben und
ausgelöst werden.
0x0001    DISABLED  Der Text wird grau dargestellt und der Button ist nicht aktivierbar, dies kann auch durch Funktionen ausgelöst oder aufgehoben werden.
0x0008    BITMAP    Es wird kein Text dargestellt. Die Bytes des Labelbereiches werden als Bitmap dargestellt.
0x0010    NO_BORDER Es wird keine Umrandung dargestellt
0x0100    SHOWVAL   Es wird kein farbiger Hintergrund dargestellt und der Button ist nicht aktivierbar
0x8000    UNUSED    DIeser Button ist nicht verwendet und wird auch nicht dargestellt

213 Labelbytes 0 und 1
Die ersten beiden Bytes des Labels, welches im Button dargestellt werden soll oder die ersten beiden Bytes des Bitmaps

214 Labelbytes 2 und 3
215 Labelbytes 4 und 5
216 Labelbytes 6 und 7
217 Labelbytes 8 und 9
218 Labelbytes 10 und 11

weitere Labelbytes müssen in der configure.h freigegeben werden, denn es steht unter Umständen nicht genügend Speicher zur Verfügung.

230 Startadresse Button 2

250 Startadresse Button 3

270 Startadresse Button 4

290 Startadresse Button 5

310 Startadresse Button 6

330 Startadresse Button 7

350 Startadresse Button 8

999   Reboot-Marker
Beim Neustart des Tastatur-Moduls wird hier eine 1 abgelegt. FHEM kann hierauf eine Aktion auslösen, die zum Beispiel Startwerte in die Register
schreibt, und anschließend dieses Register auf 0 setzt. So kann das Tastatur-Modul auch nach einem Neustart schnell die richtigen Werte anzeigen.


Angeschlossen wird das Modul mittels RS485 Modbus. Das sind zwei Adern A und B geringen Querschnitts. In meiner Variante habe ich eine 4-Draht-Leitung, welche auch noch 12V Gleichspannung liefert, denn so brauche ich nicht noch Netzteile (sieht man im Bild links ein wenig).
Das TFT im jetzigen Modus (Hintergrund-Beleuchtung voll an) benötigt etwas über 200mA. Der Spannungsregler wird da etwas warm. Da muß ich an der Platine noch was verbessern, zur Zeit sieht man ihn noch unten aus dem Modul herausragen. Aber das ist auch eine Sache des Gehäuses.

Werde mich die nächste Zeit mal dran setzen, eine Gehäuse zu zeichnen.