import serial import binascii import math import mariadb # aktuell ist es so programmiert, dass es annimmt, dass in kg gemessen wird (andere Einheiten liefern also flasche Ergebnisse) # das was man noch dazuprogrammieren kann, ist wenn mehrere Teile auf der Waage liegen, ob dann die Typen noch immer erkannt werden db_config = { 'user': 'dbUser', 'password': 'dbPassword', 'host': 'localhost', 'database': 'projectGeislinger', 'port': 3306 # Standard port for MariaDB } # Establishing the connection conn = mariadb.connect(**db_config) # Create a cursor to execute queries cursor = conn.cursor() # Konfiguration der seriellen Schnittstelle ser = serial.Serial('/dev/ttyUSB0', 9600) waageEingeschwungen = False def wahrscheinlichkeitsDichte(x,mue, var): # in der Funktion wird der Wahrscheinlichkeitsdichtenwert der Variable x für eine bestimmte Normalverteilung berechnet standardabweichung = var**0.5 result = 1/(standardabweichung * (2*math.pi)**0.5 ) * math.exp(-0.5 * ((x-mue)/standardabweichung)**2) return result def numberSmallerObjects(numberBiggerObjects, messungWaage, mue1,mue2, sigma2): for i in range(1,10000): #damit wird geprüft, ob eh auch ein Objekt vom Typ1 auf der Waage liegt, oder nur ein Objekt vom Typ2 # eigentlich müsste da 3*sigma drinnen stehen, um 99,7% der Fälle abzudecken, aber das ist nur bei einer gültigen Normalverteilung zutreffend (mit ausreichend Messungen) if (messungWaage-numberBiggerObjects*(mue2+10*sigma2))/mue1 > 0: print((messungWaage-numberBiggerObjects*(mue2+10*sigma2))/mue1) if i > (messungWaage-numberBiggerObjects*mue2)/mue1: return i else: return -1 def main(): print("connection is open: ", ser.is_open) print("port to which it is connected: ", ser.portstr) #an die Waage den Befehl senden, dass sie ausgelesen werden soll ser.write(b'getWeight\n') #ser.write(b'tare\n') serialString = ser.readline().decode('utf-8').rstrip() #Auslesen des Serial-Strings/der Messung der Waage # wenn am Ende des Strings kg steht, dann ist die Waage eingeschwungen - das wird hiermit überprüft lenString = len(serialString)-1 if serialString[lenString] == "g" and serialString[lenString-1] == "k": print("ist eingeschwungen") waageEingeschwungen = True else: print("die Waage ist noch nicht eingeschwungen") waageEingeschwungen = False #aus dem String werden alle Zeichen, welche nicht zur Darstellung der Zahl benötigt werden entfernt intString = "" for i in serialString: if i=="-" or i=="0" or i=="." or i=="1" or i=="2" or i=="3" or i=="4" or i=="5" or i=="6" or i=="7" or i=="8" or i=="9": intString = intString + i print("Wert, welcher von der Waage ausgelesen wurde: " + intString + "kg") # wenn die Waage nicht eingeschwungen ist, dann soll auch nichts weiter gemacht werden if( waageEingeschwungen == True): # Define the SQL query sql_query = "SELECT * FROM projectGeislinger.Einzelteile" # Execute the query cursor.execute(sql_query) # Fetch results results = cursor.fetchall() # Display data print("Ausgabe der Daten der Datenbank:") for row in results: print(row) # in der Folge wird nun berechnet, welcher Normalverteilung die Messung am ehesten entspricht dBId = 0 maxPropDensity = 0 for row in results: propDens = wahrscheinlichkeitsDichte(float(intString) ,row[2], row[3]) if propDens > maxPropDensity: maxPropDensity = propDens dBId = row[0] #Ausgabe des Bauteiltypen, welchem die Messung am ehesten entspricht for row in results: if row[0] == dBId: print(row[1]) #propDens = wahrscheinlichkeitsDichte(0.042 ,results[0][2], results[0][3]) #print(propDens) ser.close() print("connection is open: ", ser.is_open) if __name__ == "__main__": main()