Kommastelle im Wiegewert

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Petro
User
Beiträge: 11
Registriert: Dienstag 28. Juli 2020, 20:07

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()
    Benutzeravatar
    sparrow
    User
    Beiträge: 4195
    Registriert: Freitag 17. April 2009, 10:28

    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?
    Sirius3
    User
    Beiträge: 17754
    Registriert: Sonntag 21. Oktober 2012, 17:20

    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()
    Petro
    User
    Beiträge: 11
    Registriert: Dienstag 28. Juli 2020, 20:07

    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()
        
        
    Petro
    User
    Beiträge: 11
    Registriert: Dienstag 28. Juli 2020, 20:07

    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)
    Sirius3
    User
    Beiträge: 17754
    Registriert: Sonntag 21. Oktober 2012, 17:20

    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)
    
    Petro
    User
    Beiträge: 11
    Registriert: Dienstag 28. Juli 2020, 20:07

    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)
    Petro
    User
    Beiträge: 11
    Registriert: Dienstag 28. Juli 2020, 20:07

    Wo kommen die Warnungen her?
    Was löst sie aus?
    Wie bekomme ich sie weg?
    Sirius3
    User
    Beiträge: 17754
    Registriert: Sonntag 21. Oktober 2012, 17:20

    Ich weiß nicht, was Du sonst noch mit dem Display machst? Das Programm hier räumt jedenfalls sauber wieder auf.
    Petro
    User
    Beiträge: 11
    Registriert: Dienstag 28. Juli 2020, 20:07

    Hmm,
    Eigentlich benutze ich das Display nur als Waage.
    Sind die Warnungen schlimm?
    Benutzeravatar
    sparrow
    User
    Beiträge: 4195
    Registriert: Freitag 17. April 2009, 10:28

    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.
    Petro
    User
    Beiträge: 11
    Registriert: Dienstag 28. Juli 2020, 20:07

    Ok,

    In meinem alten Code kamen diese Warnungen nicht.
    Kann es sein das mein alter Code da mit rein spielt?
    Sirius3
    User
    Beiträge: 17754
    Registriert: Sonntag 21. Oktober 2012, 17:20

    Solange Du ihn nicht ausführst, kann der nicht reinspielen.
    Petro
    User
    Beiträge: 11
    Registriert: Dienstag 28. Juli 2020, 20:07

    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.
    Sirius3
    User
    Beiträge: 17754
    Registriert: Sonntag 21. Oktober 2012, 17:20

    Führst Du immer nur den neuen aus?
    Petro
    User
    Beiträge: 11
    Registriert: Dienstag 28. Juli 2020, 20:07

    Ja, der alte steht halt mit im Verzeichnis.
    Hab ihn aber mit einer zusätzlichen 1 im Namen umbenannt.
    Sirius3
    User
    Beiträge: 17754
    Registriert: Sonntag 21. Oktober 2012, 17:20

    Dann mußt Du noch irgendetwas anderes machen. Kommen die Meldungen jedes mal, auch wenn Du das Programm gleich zweimal hintereinander startest?
    Petro
    User
    Beiträge: 11
    Registriert: Dienstag 28. Juli 2020, 20:07

    Ich glaube ja, das müsste ich aber heute Abend nochmal testen wenn ich Zuhause bin.

    Ich melde mich dann heute Abend.
    Petro
    User
    Beiträge: 11
    Registriert: Dienstag 28. Juli 2020, 20:07

    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
    .
    .
    .
    .
    Antworten