Seite 1 von 1

Kommastelle im Wiegewert

Verfasst: Dienstag 28. Juli 2020, 20:41
von Petro
Hallo,
Ich bin übers 3D drucken zum Raspberry Pi gekommen und bin jetzt bei Python gelandet. Ich bin total begeistert was man alles machen kann. Ich habe mir schon ein Buch gekauft und den Python komplett Kurs mit Videos. Allerdings bin ich erst 3Wochen dabei und das meiste ist für mich noch Chinesisch 😞


Ich habe natürlich gelesen das Ihr hier keine Hausaufgaben lösen wollt, ich bin auch kein Schüler und Student bin ich auch nicht.

Ich bin trotzdem blutiger Anfänger!!!

Jetzt zu meinem Problem.
Ich würde gerne das die Waage das Ergebnis nicht in Gramm sondern in Kg mit 2 Nachkommastellen ausgibt z.b. 12,45 kg.

Ich habe mir schon in den letzten Nächten die Augen im WWW plat geschaut und nix gefunden.

Würde mir einer von Euch helfen 🙄

Gruß Petro



#!/usr/bin/python


import time, os, datetime, sys
import RPi.GPIO as GPIO

EMULATE_HX711=False

referenceUnit = 1

if not EMULATE_HX711:
import RPi.GPIO as GPIO
from hx711 import HX711
else:
from emulated_hx711 import HX711


# Zuordnung der GPIO Pins (ggf. anpassen)
LCD_RS = 4
LCD_E = 17
LCD_DATA4 = 18
LCD_DATA5 = 22
LCD_DATA6 = 23
LCD_DATA7 = 24

LCD_WIDTH = 16 # Zeichen je Zeile
LCD_LINE_1 = 0x80 # Adresse der ersten Display Zeile
LCD_LINE_2 = 0xC0 # Adresse der zweiten Display Zeile
LCD_CHR = GPIO.HIGH
LCD_CMD = GPIO.LOW
E_PULSE = 0.0005
E_DELAY = 0.0005

def lcd_send_byte(bits, mode):
# Pins auf LOW setzen
GPIO.output(LCD_RS, mode)
GPIO.output(LCD_DATA4, GPIO.LOW)
GPIO.output(LCD_DATA5, GPIO.LOW)
GPIO.output(LCD_DATA6, GPIO.LOW)
GPIO.output(LCD_DATA7, GPIO.LOW)
if bits & 0x10 == 0x10:
GPIO.output(LCD_DATA4, GPIO.HIGH)
if bits & 0x20 == 0x20:
GPIO.output(LCD_DATA5, GPIO.HIGH)
if bits & 0x40 == 0x40:
GPIO.output(LCD_DATA6, GPIO.HIGH)
if bits & 0x80 == 0x80:
GPIO.output(LCD_DATA7, GPIO.HIGH)
time.sleep(E_DELAY)
GPIO.output(LCD_E, GPIO.HIGH)
time.sleep(E_PULSE)
GPIO.output(LCD_E, GPIO.LOW)
time.sleep(E_DELAY)
GPIO.output(LCD_DATA4, GPIO.LOW)
GPIO.output(LCD_DATA5, GPIO.LOW)
GPIO.output(LCD_DATA6, GPIO.LOW)
GPIO.output(LCD_DATA7, GPIO.LOW)
if bits&0x01==0x01:
GPIO.output(LCD_DATA4, GPIO.HIGH)
if bits&0x02==0x02:
GPIO.output(LCD_DATA5, GPIO.HIGH)
if bits&0x04==0x04:
GPIO.output(LCD_DATA6, GPIO.HIGH)
if bits&0x08==0x08:
GPIO.output(LCD_DATA7, GPIO.HIGH)
time.sleep(E_DELAY)
GPIO.output(LCD_E, GPIO.HIGH)
time.sleep(E_PULSE)
GPIO.output(LCD_E, GPIO.LOW)
time.sleep(E_DELAY)

def display_init():
lcd_send_byte(0x33, LCD_CMD)
lcd_send_byte(0x32, LCD_CMD)
lcd_send_byte(0x28, LCD_CMD)
lcd_send_byte(0x0C, LCD_CMD)
lcd_send_byte(0x06, LCD_CMD)
lcd_send_byte(0x01, LCD_CMD)

def lcd_message(message):
message = message.ljust(LCD_WIDTH," ")
for i in range(LCD_WIDTH):
lcd_send_byte(ord(message),LCD_CHR)


def cleanAndExit():
print("Cleaning...")

if not EMULATE_HX711:
GPIO.cleanup()

print("Bye!")
sys.exit()

if __name__ == '__main__':
# initialisieren
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(LCD_E, GPIO.OUT)
GPIO.setup(LCD_RS, GPIO.OUT)
GPIO.setup(LCD_DATA4, GPIO.OUT)
GPIO.setup(LCD_DATA5, GPIO.OUT)
GPIO.setup(LCD_DATA6, GPIO.OUT)
GPIO.setup(LCD_DATA7, GPIO.OUT)

display_init()




hx = HX711(5, 6)
hx.set_reading_format("MSB", "MSB")
hx.set_reference_unit(88.437)
hx.reset()
hx.tare()

print("Tara fertig! jetzt wiegen....")



while True:
try:
val = hx.get_weight(5)
msg1 = str(int(val)) + " g Rest GAS "
print(msg1)

lcd_send_byte(LCD_LINE_1, LCD_CMD)
lcd_message(msg1)
lcd_send_byte(LCD_LINE_2, LCD_CMD)
lcd_message("bei 5200g leer")



hx.power_down()
hx.power_up()
time.sleep(0.1)



except (KeyboardInterrupt, SystemExit):
cleanAndExit()

    Re: Kommastelle im Wiegewert

    Verfasst: Dienstag 28. Juli 2020, 21:53
    von sparrow
    Setze deinen Code bitte in Code Tags. Die erscheinen Automatisch, wenn du den </> Button im vollständigen Editor klickst.

    Wenn du "Waage" schreibst, meinst du das lcs-Display, oder? Dort schreibst du ja bereits hin. Wenn du kg statt gramm haben möchtest, warum teilst du die Gramm dann nicht eindach durch 1000?

    Re: Kommastelle im Wiegewert

    Verfasst: Mittwoch 29. Juli 2020, 08:11
    von Sirius3
    Python2 solltest Du nicht mehr benutzen. Am Code sieht man das nicht direkt, aber die erste Zeile sagt das. Benutze Python3.
    RPi.GPIO wird zweimal importiert, einmal nur, wenn man nicht im Emulator ist. Heißt, der Emulator-Code funktioniert nicht und kann weg.
    Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 4 und mal 2.
    Funktionsnamen werden wie Variablen komplett klein geschrieben, cleanAndExit hält sich nicht daran, ist auch komisch, dass man innerhalb einer while-Schleife Strg+C abfängt um dann die Schleife in einer Funktion mit exit brutal abzubrechen, statt einfach das Programm sein natürliches Ende finden zu lassen.
    Warnungen sind dazu da, dass man sie behebt, nicht dass man sie ignoriert. Dazu muß cleanup auch immer aufgerufen werden, nicht nur bei StrG+C.
    os und datetime werden importiert aber nicht genutzt. referenceUnit wird definiert und nicht benutzt.
    In `lcd_message`: man iteriert nicht über einen Index sondern über die Zeichen direkt. In Python3 liefert das Iterieren über einen Bytestring gleich die richtigen Zahlen.
    Strings setzt man nicht mit + zusammen, sondern benutzt Format-Strings.
    Benutze keine Abkürzungen, was soll das 1 bei msg1?

    Code: Alles auswählen

    #!/usr/bin/env python3
    import time
    import RPi.GPIO as GPIO
    from hx711 import HX711
    
    # Zuordnung der GPIO Pins (ggf. anpassen)
    LCD_RS = 4
    LCD_E  = 17
    LCD_DATA_PINS = [18, 22, 23, 24]
    
    LCD_WIDTH = 16      # Zeichen je Zeile
    LCD_LINE_1 = 0x80   # Adresse der ersten Display Zeile
    LCD_LINE_2 = 0xC0   # Adresse der zweiten Display Zeile
    LCD_CHR = GPIO.HIGH
    LCD_CMD = GPIO.LOW
    E_PULSE = 0.0005
    E_DELAY = 0.0005
    
    def lcd_set_nibble(bits):
        for pin in LCD_DATA_PINS:
            bits, on = divmod(bits, 2)
            GPIO.output(pin, GPIO.HIGH if on else GPIO.LOW)
        time.sleep(E_DELAY)    
        GPIO.output(LCD_E, GPIO.HIGH)  
        time.sleep(E_PULSE)
        GPIO.output(LCD_E, GPIO.LOW)  
        time.sleep(E_DELAY)      
    
    def lcd_send_byte(bits, mode):
        # Pins auf LOW setzen
        GPIO.output(LCD_RS, mode)
        lcd_set_nibble(bits<<4)
        lcd_set_nibble(bits)
    
    def display_init():
        for byte in [0x33, 0x32, 0x28, 0x0C, 0x06, 0x01]:
            lcd_send_byte(byte, LCD_CMD)
    
    def lcd_message(line, message):
        lcd_send_byte(line, LCD_CMD)
        message = f"{message:{LCD_WIDTH}.{LCD_WIDTH}s}".encode('ASCII')
        for character in message:
            lcd_send_byte(character, LCD_CHR)
    
    def initialize():
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(LCD_E, GPIO.OUT)
        GPIO.setup(LCD_RS, GPIO.OUT)
        GPIO.setup(LCD_DATA_PINS, GPIO.OUT)
        display_init()
          
    def main():
        try:
            initialize()
            hx = HX711(5, 6)
            hx.set_reading_format("MSB", "MSB")
            hx.set_reference_unit(88.437)
            hx.reset()
            hx.tare()
        
            print("Tara fertig! jetzt wiegen....")
            while True:
                hx.power_up()
                time.sleep(0.1)
                weight = hx.get_weight(5)
                hx.power_down()
                message =  f"{weight/1000:.2f}kg Rest GAS"
                print(message)
                lcd_message(LCD_LINE_1, message)
                lcd_message(LCD_LINE_2, "bei 5.2kg leer")
        except KeyboardInterrupt:
            pass
        finally:
            GPIO.cleanup()
    
    if __name__ == '__main__':
        main()

    Re: Kommastelle im Wiegewert

    Verfasst: Mittwoch 29. Juli 2020, 11:34
    von Petro
    Hallo sparrow,
    das mit dem Code </> wusste ich noch nicht. Werde ich beim nächsten mal machen🙋🏼‍♂️
    Das mit dem/1000 hatte ich über die Reference machen könne ( ist aber nicht die schönste Lösung) aber letztendlich habe ich das Komma nicht hin bekommen.
    Das im LCD ist ja nur die die Beschriftung. Das hatte ich schon so eingefügt, der Wert war aber noch Gramm ohne Komma.

    Hallo Sirius3,

    „ ich bin total fertig und beeindruckt!!!!“

    Das was du im Kommentar geschrieben hast, muss ich mir heute Abend erstmal in Ruhe anschauen (bin noch auf Arbeit)

    Ich werde den Code ausprobieren und ihn gegen meinen( aus mehreren Teilen zurecht kopiert) halten und analysieren. Ich denke aus Fehlern und natürlich Büchern kann man am meisten lernen.

    Ich finde es total geil was ihr hier macht, das würde ich auch gerne können!!

    Ich melde mich heute Abend nochmal ob es geklappt hat!!

    Euch beiden vielen lieben Dank, das ihr überhaupt geantwortet habt und euch so eine Mühe gemacht habt.

    🙋🏼‍♂️🙋🏼‍♂️🙋🏼‍♂️

    Code: Alles auswählen

    #!/usr/bin/env python3
    import time
    import RPi.GPIO as GPIO
    from hx711 import HX711
    
    # Zuordnung der GPIO Pins (ggf. anpassen)
    LCD_RS = 4
    LCD_E  = 17
    LCD_DATA_PINS = [18, 22, 23, 24]
    
    LCD_WIDTH = 16      # Zeichen je Zeile
    LCD_LINE_1 = 0x80   # Adresse der ersten Display Zeile
    LCD_LINE_2 = 0xC0   # Adresse der zweiten Display Zeile
    LCD_CHR = GPIO.HIGH
    LCD_CMD = GPIO.LOW
    E_PULSE = 0.0005
    E_DELAY = 0.0005
    
    def lcd_set_nibble(bits):
        for pin in LCD_DATA_PINS:
            bits, on = divmod(bits, 2)
            GPIO.output(pin, GPIO.HIGH if on else GPIO.LOW)
        time.sleep(E_DELAY)    
        GPIO.output(LCD_E, GPIO.HIGH)  
        time.sleep(E_PULSE)
        GPIO.output(LCD_E, GPIO.LOW)  
        time.sleep(E_DELAY)      
    
    def lcd_send_byte(bits, mode):
        # Pins auf LOW setzen
        GPIO.output(LCD_RS, mode)
        lcd_set_nibble(bits<<4)
        lcd_set_nibble(bits)
    
    def display_init():
        for byte in [0x33, 0x32, 0x28, 0x0C, 0x06, 0x01]:
            lcd_send_byte(byte, LCD_CMD)
    
    def lcd_message(line, message):
        lcd_send_byte(line, LCD_CMD)
        message = f"{message:{LCD_WIDTH}.{LCD_WIDTH}s}".encode('ASCII')
        for character in message:
            lcd_send_byte(character, LCD_CHR)
    
    def initialize():
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(LCD_E, GPIO.OUT)
        GPIO.setup(LCD_RS, GPIO.OUT)
        GPIO.setup(LCD_DATA_PINS, GPIO.OUT)
        display_init()
          
    def main():
        try:
            initialize()
            hx = HX711(5, 6)
            hx.set_reading_format("MSB", "MSB")
            hx.set_reference_unit(88.437)
            hx.reset()
            hx.tare()
        
            print("Tara fertig! jetzt wiegen....")
            while True:
                hx.power_up()
                time.sleep(0.1)
                weight = hx.get_weight(5)
                hx.power_down()
                message =  f"{weight/1000:.2f}kg Rest GAS"
                print(message)
                lcd_message(LCD_LINE_1, message)
                lcd_message(LCD_LINE_2, "bei 5.2kg leer")
        except KeyboardInterrupt:
            pass
        finally:
            GPIO.cleanup()
    
    if __name__ == '__main__':
        main()
        
        

    Re: Kommastelle im Wiegewert

    Verfasst: Mittwoch 29. Juli 2020, 14:37
    von Petro
    Hallo Sirius3,

    ich hab es ausprobiert.
    Der Kommawert ist da es gibt aber Fehlermeldungen Display Zeigt auch was an aber nur Waagrecht Striche und nicht der Text und den Wiegewert.

    hd44780_test.py:47: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    GPIO.setup(LCD_E, GPIO.OUT)
    hd44780_test.py:48: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    GPIO.setup(LCD_RS, GPIO.OUT)
    hd44780_test.py:49: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    GPIO.setup(LCD_DATA_PINS, GPIO.OUT)
    /home/pi/hx711.py:21: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    GPIO.setup(self.PD_SCK, GPIO.OUT)

    Re: Kommastelle im Wiegewert

    Verfasst: Mittwoch 29. Juli 2020, 19:47
    von Sirius3
    Die Warnungen kommen daher, dass Du vorher nicht ordentlich aufgeräumt hast.
    Schreibfehler, es muß so heißen:

    Code: Alles auswählen

    def lcd_send_byte(bits, mode):
        GPIO.output(LCD_RS, mode)
        lcd_set_nibble(bits>>4)
        lcd_set_nibble(bits)
    

    Re: Kommastelle im Wiegewert

    Verfasst: Mittwoch 29. Juli 2020, 20:36
    von Petro
    Hi,
    den Schreibfehler hab ich bereinigt und die Anzeige im LCD funktioniert:

    Diese Fehler stehen aber immer noch an.
    wie bekomme ich die weg??


    hd44780_test.py:47: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    GPIO.setup(LCD_E, GPIO.OUT)
    hd44780_test.py:48: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    GPIO.setup(LCD_RS, GPIO.OUT)
    hd44780_test.py:49: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    GPIO.setup(LCD_DATA_PINS, GPIO.OUT)
    /home/pi/hx711.py:21: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
    GPIO.setup(self.PD_SCK, GPIO.OUT)

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 07:03
    von Petro
    Wo kommen die Warnungen her?
    Was löst sie aus?
    Wie bekomme ich sie weg?

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 07:46
    von Sirius3
    Ich weiß nicht, was Du sonst noch mit dem Display machst? Das Programm hier räumt jedenfalls sauber wieder auf.

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 07:50
    von Petro
    Hmm,
    Eigentlich benutze ich das Display nur als Waage.
    Sind die Warnungen schlimm?

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 08:04
    von sparrow
    Sie bedeuten genau das, was dort steht. Dort wird .setup für "Kanäle" aufgerufen, die bereits in Benutzung sind. Ich würde mich zumindest auf die Suche machen, woran das liegt.
    GPIO.cleanup() räumt entsprechend auf. Und in dem Code von Sirius3 wird dafür gesorgt, dass das durch finally auf jeden Fall aufgerufen wird. Wenn dem nicht so ist, liegt irgend etwa im Argen.

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 08:23
    von Petro
    Ok,

    In meinem alten Code kamen diese Warnungen nicht.
    Kann es sein das mein alter Code da mit rein spielt?

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 08:28
    von Sirius3
    Solange Du ihn nicht ausführst, kann der nicht reinspielen.

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 08:39
    von Petro
    Nein ich führe immer nur einen aus.
    Ich habe allerdings noch ein Taster zum ein und soft aus schalten vom Raspberry Pi. Außerdem noch eine Externe Power und Status LED die das läuft natürlich auch über die GPIO‘s. Da hab ich aber nix verändert. Das ging ohne Warnungen mit dem alten Code.

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 08:53
    von Sirius3
    Führst Du immer nur den neuen aus?

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 09:04
    von Petro
    Ja, der alte steht halt mit im Verzeichnis.
    Hab ihn aber mit einer zusätzlichen 1 im Namen umbenannt.

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 09:42
    von Sirius3
    Dann mußt Du noch irgendetwas anderes machen. Kommen die Meldungen jedes mal, auch wenn Du das Programm gleich zweimal hintereinander startest?

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 09:48
    von Petro
    Ich glaube ja, das müsste ich aber heute Abend nochmal testen wenn ich Zuhause bin.

    Ich melde mich dann heute Abend.

    Re: Kommastelle im Wiegewert

    Verfasst: Donnerstag 30. Juli 2020, 17:59
    von Petro
    ich habe es eben ausprobiert, ja bei jedem Start kommen erst die Warnungen.
    Dann kommt:

    Tara fertig! Jetzt wiegen....
    0.0kg Rest GAS
    0.0kg Rest GAS
    .
    .
    .
    .