GeislingerProject/readScale_Stand01.07.py
2024-07-02 12:42:04 +02:00

139 lines
4.1 KiB
Python

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()