Wägenmodul

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Grantelbart
User
Beiträge: 8
Registriert: Freitag 13. Dezember 2019, 20:07

Servus Zusammen,

Ich bin recht neu in dem Thema.
Aktuell nutze ich dieses py skript für meine Waage.
Ich benötige eine weitere ausgabe weiß aber leider nicht wie ich das Umsetze.
Benötigt wird Folgendes.

Am LCD die Augabe wie lange die Wage belastet wird.
dies Soll bei Tag 1 beginnen wenn sie bereits 2 Std. durchgehend mit mehr als 500g belastet wird.
Timer soll zurück gesetzt werden wenn sie 2 Std. lang nicht belastet wird.

Code: Alles auswählen

#! /usr/bin/python2                                                                                                                                                                                                                                                                                                                                                                                                                                                                       import time
import sys
import lcddriver
import RPi.GPIO as GPIO
import math                          
                                                                                                                                                                                                                                                                                                                                                                                                                                                     lcd = lcddriver.lcd()
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          EMULATE_HX711=False

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

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

	if not EMULATE_HX711:
		GPIO.cleanup()
	print("Bye!")
	sys.exit()
	
hx = HX711(5, 6)
hx.set_reading_format("MSB", "MSB")
hx.set_reference_unit(339)
hx.reset()
hx.tare()

print("Tare done! Add weight now...")

while True:
	try:
		val = max(0, int(hx.get_weight(5)))
		print(val)
		
		hx.power_down()
		hx.power_up()
		time.sleep(0.1)                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
	
	except (KeyboardInterrupt, SystemExit):
		cleanAndExit()
		
	#LCD Bereinigung
	lcd.lcd_clear()
	#Messwerte auf LCD schreiben
	lcd.lcd_display_string(str(val), 1)
	lcd.lcd_display_string(time.strftime("%d.%m.%Y %H:%M:%S"), 2)
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Irgendetwas ist sehr komisch mit dem Quelltext Da sind sehr viele Leerzeichen drin. Zum Beispiel ist in der allerersten Zeile nach sehr viel Leeraum noch ein ``import time`` das ziemlich sicher ohne die ganzen Leerzeichen in eine eigene Zeile sollte.

Und in Zeile 6 ist viel Whitespace und auch in Zeile 7 sind zu viele Leerzeichen vor dem eigentlichen Inhalt. Da wundere ich mich gerade ob das Zufall ist das die Anzahl der Zeichen in Zeile 6 und 7 genau 1337 ergibt. WTF‽

Wenn das behoben ist: Zwischen #! und dem Rest der She-Bang-Zeile gehört kein Leerzeichen.

Python 2 sollte man nicht mehr verwenden. Das hat in einem halben Monat sein EOL erreicht.

Eingerückt wird mit vier Leerzeichen pro Ebene.

Das `math`-Modul wird importiert aber nirgends verwendet.

``as`` bei Importen ist zum Umbenennen gedacht, das GPIO-Modul wird aber gar nicht umbenannt. Ausserdem wird das Modul potentiell zweimal importiert — einmal reicht aber völlig.

Importe gehören an den Anfang vom Modul.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). `referenceUnit` würde also als Variable `reference_unit` oder als Konstante `REFERENCE_UNIT` heissen — falls der Wert überhaupt irgendwo verwendet würde. Und `clean_and_exit()` statt `cleanAndExit()`.

Abkürzungen die nicht allgemein verbreitet sind sollte man nicht als Namen verwenden. Also nicht `hx` für `weight_sensor` und auch nicht `val` wenn man `value` meint aber vielleicht doch eher `weight`.

Innerhalb des ``try``-Blocks sollte kein `SystemExit` vorkommen können. Und die Aufräumarbeiten sollten nicht nur dann passieren wenn der Benutzer Strg+C drückt, sondern auch in allen anderen Fällen in denen die das Hauptprogramm beendet wird. Dafür ist ``finally`` gedacht. Und der ``try``-Block muss dann auch alles umfassen. Dann benötigt man auch den `sys.exit()`-Aufruf nicht mehr und in eine eigene Funktion würde ich den Teil dann auch nicht auslagern.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import time

import lcddriver
import RPi.GPIO as GPIO

EMULATE_HX711 = False

if EMULATE_HX711:
    from emulated_hx711 import HX711
else:
    from hx711 import HX711


def main():
    try:
        lcd = lcddriver.lcd()
        weight_sensor = HX711(5, 6)
        weight_sensor.set_reading_format("MSB", "MSB")
        weight_sensor.set_reference_unit(339)
        weight_sensor.reset()
        weight_sensor.tare()
        print("Tare done! Add weight now...")
        while True:
            weight = max(0, int(weight_sensor.get_weight(5)))
            print(weight)

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

            lcd.lcd_clear()
            lcd.lcd_display_string(str(weight), 1)
            lcd.lcd_display_string(time.strftime("%d.%m.%Y %H:%M:%S"), 2)
    except KeyboardInterrupt:
        pass  # User can end this with Ctrl+C.
    finally:
        print("Cleaning...")
        if not EMULATE_HX711:
            GPIO.cleanup()
        print("Bye!")


if __name__ == "__main__":
    main()
Bei der Beschreibung was erreicht werden soll ist mir nicht ganz klar was gefordert ist. Auf jeden Fall kann ich schon mal sagen, dass Du das eher nicht mit dem `time`-Modul machen solltest, sondern mit dem `datetime`-Modul.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Grantelbart
User
Beiträge: 8
Registriert: Freitag 13. Dezember 2019, 20:07

Ja ich konnte den Quellcode nicht sauber heraus kopieren.
Also die Waage wird am Tag häufiger belastet.
Wenn diese Belastung länger als X Zeit dauert soll diese Anfangen Zeit zu nehmen bis das Gewicht X Zeit wieder die Waage verlässt.
Danach sollte ein Tara ausgelöst werden

Code: Alles auswählen

#! /usr/bin/python2
# -*- coding: utf-8 -*-

import time
import sys
import lcddriver
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM) #Zählweise der GPIO-PINS auf der Platine, analog zu allen Beispielen
GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_UP) #Taster ist an GPIO-Pin 23 angeschlossen

#Schnittstellenbeschreibung
lcd = lcddriver.lcd()                            #LCD

EMULATE_HX711=False

referenceUnit = 1

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

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

    if not EMULATE_HX711:
        GPIO.cleanup()

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

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

print("Tare done! Add weight now...")
lcd.lcd_display_string("Waage gestartet", 4)
time.sleep(5.2)

while True:
    input_state = GPIO.input(25)
    if input_state == False:
        print("Tara ausgefüht")
        lcd.lcd_display_string("Waage wird genullt", 4)
        hx.tare()
        time.sleep(0.2)


    try:
        val = max(0, int(hx.get_weight(5)))
        print(val)

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

    except (KeyboardInterrupt, SystemExit):
            cleanAndExit()

    #LCD Bereinigung
    lcd.lcd_clear()
    #Messwerte auf LCD schreiben
    lcd.lcd_display_string(str(val), 1)
    lcd.lcd_display_string(time.strftime("%d.%m.%Y %H:%M:%S"), 2)
    
Grantelbart
User
Beiträge: 8
Registriert: Freitag 13. Dezember 2019, 20:07

Nachtrag:
Habe das gesamte auf python 3.6 geupdated
Antworten