Jump to content

Pyhton LCD Seitenwechsel ??


saschakp

Recommended Posts

Hallo,

möchte gern das mein LCD Display alle 5 sek. was anderes auf dem

Diplay anzeigt (Seiten).

Wie bekomme ich das hin?

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-  

import socket
import sys
import time
import math

HOST = "192.168.2.32"
PORT = 4223
UID = "9LY" # Change to your UID

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_lcd_20x4 import LCD20x4


if __name__ == "__main__":
    ipcon = IPConnection() # Create IP connection
    lcd = LCD20x4(UID, ipcon) # Create device object
    ipcon.connect(HOST, PORT) # Connect to brickd
    # Don't use device before ipcon is connected

    # Turn backlight on
    lcd.backlight_on()

    # "Seite 1"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite1')
    lcd.write_line(1, 0, 'Seite1')
    lcd.write_line(2, 0, 'Seite1')
    lcd.write_line(3, 0, 'Seite1')
    time.sleep(5)
    
    # "Seite 2"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite2')
    lcd.write_line(1, 0, 'Seite2')
    lcd.write_line(2, 0, 'Seite2')
    lcd.write_line(3, 0, 'Seite2')
    time.sleep(5)
    
    # "Seite 3"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite3')
    lcd.write_line(1, 0, 'Seite3')
    lcd.write_line(2, 0, 'Seite3')
    lcd.write_line(3, 0, 'Seite3')
    time.sleep(5)
    
    # "Seite 4"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite4')
    lcd.write_line(1, 0, 'Seite4')
    lcd.write_line(2, 0, 'Seite4')
    lcd.write_line(3, 0, 'Seite4')
    time.sleep(5)



    raw_input('Press key to exit\n') # Use input() in Python 3
    ipcon.disconnect()

 

Müsste da ein schleife einbauen oder?

 

lg

Sascha

Link to comment
Share on other sites

Du kannst um die Seite 1 bis Seite 4 eine Endlosschleife einbauen. Dabei in Python die Einrückungen nicht vergessen. Dein Programm/Thread wird sich dadurch aber nie selbst beenden und muss von dir manuell beendet werden.

 

while (TRUE):
    # "Seite 1"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite1')
    lcd.write_line(1, 0, 'Seite1')
    lcd.write_line(2, 0, 'Seite1')
    lcd.write_line(3, 0, 'Seite1')
    time.sleep(5)
    
    # "Seite 2"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite2')
    lcd.write_line(1, 0, 'Seite2')
    lcd.write_line(2, 0, 'Seite2')
    lcd.write_line(3, 0, 'Seite2')
    time.sleep(5)
    
    # "Seite 3"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite3')
    lcd.write_line(1, 0, 'Seite3')
    lcd.write_line(2, 0, 'Seite3')
    lcd.write_line(3, 0, 'Seite3')
    time.sleep(5)
    
    # "Seite 4"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite4')
    lcd.write_line(1, 0, 'Seite4')
    lcd.write_line(2, 0, 'Seite4')
    lcd.write_line(3, 0, 'Seite4')
    time.sleep(5)

Link to comment
Share on other sites

Ich weiß nicht ob das in Pyhton geht, ich habe sowas mal mit Lazarus gemacht.

 

Die Idee ist einfach: Jede Seite ist ein eigen Ständige Objekt/Klasse.

So ist jede Seite unabhängig und eigenständig. Aber sie können auf angeschlossen Bricks zugreifen, in dem sie mit einer Verbindungs Klasse "Verbunden" werden. Diese verwaltet die Bricks und hier müssen die Bricks auch Installisiert werden.

 

Meldet ein Temperatur Sensor jetzt eine Event, kann dieses Event einfach an die Aktuelle Seite weiter gereicht werden. Die Verbindungs Klasse Fungiert auch gleichzeitig als PageList.

 

Ich nehme mal an, so ähnlich könnte man es auch in Pyhton machen.

 

Vielleicht ist es etwas übertrieben, aber es könnte sich Lohnen. Über die Button am LCD könnten die Seiten gewechselt werden.

Link to comment
Share on other sites

Danke für die Antworten,

wenn ich "While (TRUE)" einfüge kommen folgende meldungen:

Traceback (most recent call last):
  File "lcd.py", line 26, in <module>
    while (TRUE):
NameError: name 'TRUE' is not defined
Exception in thread Brickd-Receiver (most likely raised during interpreter shutdown):Exception in thread Disconnect-Prober (most likely raised during interpreter shutdown):
Traceback (most recent call last):
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
  File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner

  File "/usr/lib/python2.7/threading.py", line 505, in run  File "/usr/lib/python2.7/threading.py", line 505, in run

  File "/usr/local/lib/python2.7/dist-packages/tinkerforge.egg/tinkerforge/ip_connection.py", line 617, in receive_loop  File "/usr/local/lib/python2.7/dist-packages/tinkerforge.egg/tinkerforge/ip_connection.py", line 752, in disconnect_probe_loop

<type 'exceptions.TypeError'>: 'NoneType' object is not callable  File "/usr/lib/python2.7/Queue.py", line 174, in get

<type 'exceptions.TypeError'>: 'NoneType' object is not callable

 

Das mit den Buttons ist die CallBack funktion?

Muss mich da mal reinlesen.

 

lg

Sascha

 

Link to comment
Share on other sites

Mir ist ein Fehler unterlaufen, sorry. Es muss heißen True und nicht TRUE. Außerdem kann man die Klammer weglassen.

 

while True:
    # "Seite 1"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite1')
    lcd.write_line(1, 0, 'Seite1')
    lcd.write_line(2, 0, 'Seite1')
    lcd.write_line(3, 0, 'Seite1')
    time.sleep(5)
    
    # "Seite 2"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite2')
    lcd.write_line(1, 0, 'Seite2')
    lcd.write_line(2, 0, 'Seite2')
    lcd.write_line(3, 0, 'Seite2')
    time.sleep(5)
    
    # "Seite 3"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite3')
    lcd.write_line(1, 0, 'Seite3')
    lcd.write_line(2, 0, 'Seite3')
    lcd.write_line(3, 0, 'Seite3')
    time.sleep(5)
    
    # "Seite 4"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Seite4')
    lcd.write_line(1, 0, 'Seite4')
    lcd.write_line(2, 0, 'Seite4')
    lcd.write_line(3, 0, 'Seite4')
    time.sleep(5)

Link to comment
Share on other sites

  • 3 months later...

Das mit den Seitenwechsel klappt ja ganz gut,

habe es auch hinbekommen das er Werte von verschiedenen Bricks anzeigt.

Nur er läd die Werte nicht neu, wenn ich das Script starte holt er

sich die Werte und dann bleiben die bestehen.

Wie muss ich das mit der schleife machen damit er sich die

werte jedesmal neu holt bzw aktualisiert?

 

##!/usr/bin/env python
# -*- coding: utf-8 -*-  

import socket
import sys
import time
import math
import os

HOST1 = "192.168.2.157" # MasterBrick Flur mit Ethernet
HOST2 = "192.168.2.156" # MasterBrick Esszimmer mit Wireless LAN
PORT = 4223 # Port von den Bricks
UID_L = "9LY" #
UID_B = "jXQ" #Barometer inkl. Temperatur
UID_A = "jxV" 
UID_M = "68USSm" #MasterBrick 1
UID_T1 = "Temp1" # Temperatur Aussen
UID_T2 = "dUj" # Temperatur Flur 
UID_F = "ka6" # Luftfeuchte

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_lcd_20x4 import LCD20x4
from tinkerforge.bricklet_barometer import Barometer
from tinkerforge.bricklet_ambient_light import AmbientLight
from tinkerforge.brick_master import Master
from tinkerforge.bricklet_temperature import Temperature
from tinkerforge.bricklet_humidity import Humidity

if __name__ == "__main__":
    ipcon1 = IPConnection() 
    ipcon2 = IPConnection() 
    lcd = LCD20x4(UID_L, ipcon1) 
    b = Barometer(UID_B, ipcon2) 
    temp1 = Temperature(UID_T1, ipcon2)
    temp2 = Temperature(UID_T2, ipcon1)
    al = AmbientLight(UID_A, ipcon1) 
    h = Humidity(UID_F, ipcon2) 
    master = Master(UID_M, ipcon2) 
    ipcon1.connect(HOST1, PORT) 
    ipcon2.connect(HOST2, PORT) 
    lcd.backlight_on() 

    # Don't use device before ipcon is connected
    air_pressure = b.get_air_pressure()/1000.0
    altitude = b.get_altitude()/100.0
    illuminance = al.get_illuminance()/10.0
    bartemp = b.get_chip_temperature()/100.0
    esszimm = temp1.get_temperature()/100.0
    flur = temp2.get_temperature()/100.0
    voltage = master.get_stack_voltage()
    current = master.get_stack_current()
    wifi = master.get_wifi_configuration()
    wifistatus = master.get_wifi_status()
    wifipower = master.get_wifi_power_mode()
    wifihost = master.get_wifi_hostname()
    usbvoltage = master.get_usb_voltage()
    masterid = master.get_identity()
    feuchte = h.get_humidity()/10.0

    lcd.backlight_on()

os.system('clear')

while True:

    
    # "Seite 1"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Aussen: ' + str(esszimm) + '')
    lcd.write_line(0, 13, ' \xdfC')
    lcd.write_line(1, 0, ' Buero: ' + str(21.82) + '')
    lcd.write_line(1, 13, ' \xdfC')
    lcd.write_line(2, 0, '  Flur: ' + str(flur) + '')
    lcd.write_line(2, 13, ' \xdfC')
    lcd.write_line(3, 0, ' EssZi: ' + str(bartemp) + '')
    lcd.write_line(3, 13, ' \xdfC')
    time.sleep(10)

     # "Seite 2"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Luftdr.: ' + str(air_pressure) + '')
    lcd.write_line(0, 15, ' mbr')
    lcd.write_line(1, 0, 'Feuchte: ' + str(feuchte) + '')
    lcd.write_line(1, 15, ' %')
    lcd.write_line(2, 0, '  Licht: ' + str(illuminance) + '')
    lcd.write_line(2, 15, ' Lux')
    lcd.write_line(3, 0, '  ' + str() + '')
    lcd.write_line(3, 13, ' ')
    time.sleep(10)    

 

lg Sascha

Link to comment
Share on other sites

Habe die Lösung:

 

...
...
from tinkerforge.bricklet_temperature import Temperature
from tinkerforge.bricklet_humidity import Humidity

def restart_program():
    python = sys.executable
    os.execl(python, python, * sys.argv)
    

if __name__ == "__main__":
    ipcon1 = IPConnection() # Create IP connection
    ipcon2 = IPConnection() # Create IP connection
...
...
...
...
restart_program() # Skript neustarten

 

lg Sascha

Link to comment
Share on other sites

Sehe ich das richtig, dass du das Programm neu startest? Du kannst auch einfach in der while schleife die werte über die API neu Abfragen. Macht das Programm dann schneller und ist außerdem schöner ;)

 

Wozu hast du mehrere ipconnections geöffnet? Hängen die Sensoren alle an einem Master oder hast du mehrere Master an verschiedenen Computern / Master Extensions?

Link to comment
Share on other sites

Hey,

habe gerade festgestellt das das Script doch nicht so 100% funktioniert.

Es beendet sich mit einem Timeout.

 

Dieser Code hier hat ja auch nicht funktioniert,

da er zwar durchläuft, aber die Werte nicht aktualisieren.

Hast du eine Idee?

 

Habe einen Mäster per WLAN im Esszimmer (Temp, Baro, Luft)

Ein Master hängt im Flur (LCD, Temp, Licht)

 

Wahrscheinlich wäre es mit der CallBack Funktion besser,

aber das habe ich noch nicht hinbekommen, das er mehrere

Master abfragt und die dann noch in das LCD schreibt und

dann noch verschiedene Buttons abfragt.

 

##!/usr/bin/env python
# -*- coding: utf-8 -*-  

import socket
import sys
import time
import math
import os

HOST1 = "192.168.2.157" # MasterBrick Flur mit Ethernet
HOST2 = "192.168.2.156" # MasterBrick Esszimmer mit Wireless LAN
PORT = 4223 # Port von den Bricks
UID_L = "9LY" #
UID_B = "jXQ" #Barometer inkl. Temperatur
UID_A = "jxV" 
UID_M = "68USSm" #MasterBrick 1
UID_T1 = "Temp1" # Temperatur Aussen
UID_T2 = "dUj" # Temperatur Flur 
UID_F = "ka6" # Luftfeuchte

from tinkerforge.ip_connection import IPConnection
from tinkerforge.bricklet_lcd_20x4 import LCD20x4
from tinkerforge.bricklet_barometer import Barometer
from tinkerforge.bricklet_ambient_light import AmbientLight
from tinkerforge.brick_master import Master
from tinkerforge.bricklet_temperature import Temperature
from tinkerforge.bricklet_humidity import Humidity

if __name__ == "__main__":
    ipcon1 = IPConnection() 
    ipcon2 = IPConnection() 
    lcd = LCD20x4(UID_L, ipcon1) 
    b = Barometer(UID_B, ipcon2) 
    temp1 = Temperature(UID_T1, ipcon2)
    temp2 = Temperature(UID_T2, ipcon1)
    al = AmbientLight(UID_A, ipcon1) 
    h = Humidity(UID_F, ipcon2) 
    master = Master(UID_M, ipcon2) 
    ipcon1.connect(HOST1, PORT) 
    ipcon2.connect(HOST2, PORT) 
    lcd.backlight_on() 

    # Don't use device before ipcon is connected
    air_pressure = b.get_air_pressure()/1000.0
    altitude = b.get_altitude()/100.0
    illuminance = al.get_illuminance()/10.0
    bartemp = b.get_chip_temperature()/100.0
    esszimm = temp1.get_temperature()/100.0
    flur = temp2.get_temperature()/100.0
    voltage = master.get_stack_voltage()
    current = master.get_stack_current()
    wifi = master.get_wifi_configuration()
    wifistatus = master.get_wifi_status()
    wifipower = master.get_wifi_power_mode()
    wifihost = master.get_wifi_hostname()
    usbvoltage = master.get_usb_voltage()
    masterid = master.get_identity()
    feuchte = h.get_humidity()/10.0

    lcd.backlight_on()

os.system('clear')

while True:

    
    # "Seite 1"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Aussen: ' + str(esszimm) + '')
    lcd.write_line(0, 13, ' \xdfC')
    lcd.write_line(1, 0, ' Buero: ' + str(21.82) + '')
    lcd.write_line(1, 13, ' \xdfC')
    lcd.write_line(2, 0, '  Flur: ' + str(flur) + '')
    lcd.write_line(2, 13, ' \xdfC')
    lcd.write_line(3, 0, ' EssZi: ' + str(bartemp) + '')
    lcd.write_line(3, 13, ' \xdfC')
    time.sleep(10)

     # "Seite 2"
    lcd.clear_display()
    lcd.write_line(0, 0, 'Luftdr.: ' + str(air_pressure) + '')
    lcd.write_line(0, 15, ' mbr')
    lcd.write_line(1, 0, 'Feuchte: ' + str(feuchte) + '')
    lcd.write_line(1, 15, ' %')
    lcd.write_line(2, 0, '  Licht: ' + str(illuminance) + '')
    lcd.write_line(2, 15, ' Lux')
    lcd.write_line(3, 0, '  ' + str() + '')
    lcd.write_line(3, 13, ' ')
    time.sleep(10)    

 

lg Sascha

Link to comment
Share on other sites

Lernen durch schmerz  :P

So sollte es jetzt laufen:

 

...
...
if __name__ == "__main__":
    while True:
        ipcon1 = IPConnection() # Create IP connection
        ipcon2 = IPConnection() # Create IP connection
        lcd = LCD20x4(UID_L, ipcon1) # Create device object
        b = Barometer(UID_B, ipcon2) # Create device object
        temp1 = Temperature(UID_T1, ipcon2)
        temp2 = Temperature(UID_T2, ipcon1)
        al = AmbientLight(UID_A, ipcon1) # Create device object
        h = Humidity(UID_F, ipcon2) # Create device object
        master = Master(UID_M, ipcon2) # Create device object
        ipcon1.connect(HOST1, PORT) # Connect to brickd
        ipcon2.connect(HOST2, PORT) 
...
...

 

"while True:" muss richtig eingerückt sein und der rest darunter auch.

Ohh mann war ich dämlich.

 

lg Sascha

p.s. schöne Ostern.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...