Variable & Display

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14036
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Consti9_9: Die Funktion ist ja noch länger geworden durch kopieren und einfügen des immer gleichen Codeblocks. Das wurde doch schon gesagt das man das nicht dreimal macht, und dann schon gar nicht acht mal. Das Auslesen *eines* Kanals sollte in *einer* Funktion stehen, die die Kanalnummer als Argument bekommt und den Stromwert als Rückgabewert an den Aufrufer zurück gibt.

Die gezeigte Funktion sollte auch nichts mit `print()` ausgeben und auch am Ende nicht warten. Eine Funktion sollte genau eine, in sich geschlossene Aufgabe ausführen. Du willst an anderer Stelle entscheiden können ob/wie lange gewartet wird, zwischen den Messungen und wie das Ergebnis weiterverarbeitet werden soll (Ausgabe mit `print()`, auf einer GUI, in eine Datenbank, in eine Logdatei, …). Das hat alles nichts in einer Funktion zu suchen die eine Messung durchführen soll.

Faustregel: Wenn Du anfängst Namen zu nummerieren, machst Du mit 99,9%iger Wahrscheinlichkeit etwas falsch. Gleiches gilt für solche massiven kopieren, einfügen, und ganz leicht ändern Aktionen. Da will man die Daten heraus ziehen und eine Schleife schreiben, und eventuell auch eine Funktion für den Schritt der in der Schleife ausgeführt wird. Du hast da auch `l` gar nicht angepasst, es wird also bei vielen Kopien der falsche Wert ausgegeben.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Consti9_9
User
Beiträge: 24
Registriert: Dienstag 4. Dezember 2018, 09:09

Das heißt ich sollte es so umschreiben, bzw würde es so passen?
Programmname = ADC

Code: Alles auswählen

from mcp3208 import MCP3208 #import des MCP Moduls
import time #import des Zeitmoduls um Zeitverzögerungen zu erstellen
adc = MCP3208() #Namen um MCP ansprechen zu können und zu verkürzen
global  a #Definition Variable a
import numpy #Import der Bibliothek für Mittelwerte



def Stromwert():
        werte_n = [] #Liste erstellen
        for i in range(32):
            werte_n.append(adc.read(n)) #Auslesen des 0. Kanals
        #print(werte_n) #Ausgabe der Werte in einer Liste aufgrund append
        a = 3103 - numpy.mean(werte_n) #Berechnen der Differenz
        j = (a/185)*1 #Berechnen des vorhandenen Stroms laut Berechnung
        werte_n = [] #Liste erstellen
        after()
Das heißt ich könnte die Funktion so aufrufen:

Code: Alles auswählen

import ADC

ADC.Stromwert(1)
Dies würde dann den 1 Kanal auslesen oder?
Sirius3
User
Beiträge: 18268
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist ja jetzt nur geraten. `n` und `after` sind nicht definiert. Die Liste nach gebrauch mit einer leeren Liste zu überschreiben ist unnötig. Und `j` wird gar nicht verwendet.
Vielleicht hilft Dir ja ein bißchen Code, zu verstehen, was wir meinen:

Code: Alles auswählen

import tkinter as tk
from mcp3208 import MCP3208

def get_voltage(adc, channel):
    values = [
        adc.read(0)
        for _ in range(32)
    ]
    return (3103 - sum(values) / len(values)) / 185

def update_voltage(adc, label):
    voltage = get_voltage(adc, 0)
    label['text'] = '{} V'.format(voltage)
    label.after(1000, update_voltage, adc, label)

def main():
    adc = MCP3208()
    win = tk.Tk()
    exit_button = tk.Button(win, text="Exit", command=win.destroy)
    exit_button.pack()
    voltage = tk.Label(win)
    voltage.pack()
    update_voltage(adc, voltage)
    win.mainloop()

if __name__ == '__main__':
    main()
Consti9_9
User
Beiträge: 24
Registriert: Dienstag 4. Dezember 2018, 09:09

Es war zwar nicht geraten aber gut okay, der obige Code bringt mir auch nicht sehr viel weil ich als Anfänger nicht jeden Befehl kenne.
Ich versuche mein Bestes jedoch versteh ich jetzt nicht ganz war da oben passiert.
Consti9_9
User
Beiträge: 24
Registriert: Dienstag 4. Dezember 2018, 09:09

Beziehungsweise ich formuliere das genauer, den ersten Teil verstehe ich mit der Rechnung. Der zweite Teil erstellt ja das Label und schreibt hier immer den geupdateten Wert hinein? Und im dritten Teil wird das ganz normale Display initialisiert. Jedoch weis ich nicht so recht wie ich jetzt weiter mache.

1. Kann ich jetzt meine vorhandene Initialisierung und die ganzen definierten Taster in das def main(): schreiben
2. Das def update_voltage muss ich jedoch für alle 8 Kanäle einfügen oder?
3. Was ist das __name__ == '__mein__'
Benutzeravatar
sparrow
User
Beiträge: 4537
Registriert: Freitag 17. April 2009, 10:28

Zu 1:
Nein. Nicht deine. Schau dir den Code an, probiere ihn aus und versuche zu verstehen, was jede Codezeile tut.
Dann versuch eine zweite Anzeige hinzuzufügen. Das sind, wenn ich das richtig sehe, 2 Zeilen Code.
Wenn du eine 3. hinzufügen willst, wirst du merken, dass du dafür erneut 2 Zeilen hinzufügen musst, die den ersten sehr ähneln. Möglicherweise willst du Namen mit Nummern vergeben. An der Stelle solltest du dann merken, dass man das mit einer Schleife löst, die die fast identischen Sachen x-Mal tut.

Zu 2:
Nein. Das ist eine Funktion. Die musst du nur aufrufen. Ich würde die Parameter noch im den channel erweitern, wenn ich das alles korrekt verstehe.

Zu 3:
__name__ ist __main__ wenn das Modul, in dem es steht, gestartet und nicht importiert wurde.
Dieser Zweizeiler ist Standard unter Python um so eine main()-Funktion aufzurufen, die dann quasi der Einstiegspunkt ist.
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

GUI Programmierung (mit Python) erfordert ein Grundverständnis von der Objektorientierung von Python sowie ein Grundverständnis des Einsatzes von Klassen und deren Methode. Ohne kannst du das nicht verstehen.

Wenn du das Grundverständnis nicht hast - was ja scheinbar noch der Fall ist - dann musst halt einen Schritt zurück und dir nochmal ein paar Grundlagen durchlesen, z.B. im offiziellen Python-Tutorial.
Sirius 3 hat dir ja netterweise schon eine Steilvorlage für eine minimale Version deines Programms gegeben. Im nächsten Schritt könntest du das z.B. in eine Klasse übertragen, damit das Programm besser erweiterbar ist.

Gruß, noisefloor
Consti9_9
User
Beiträge: 24
Registriert: Dienstag 4. Dezember 2018, 09:09

Hallo zusammen,

habe es jetzt geschafft das mir alle Stromwerte angezeigt werden und habe diese auch schon an eine gewünschte Stelle platzieren können.
Jetzt ist meine letzte Hürde eine Akkuspannung als Prozentwert auszugeben. Hierbei habe ich schon mit den folgendem Code die Spannung angezeigt.

Code: Alles auswählen

def get_voltage(adc, channel):
    values = [
        adc.read(0)
        for _ in range(32)
    ]
    return (3103 - sum(values) / len(values))*3.6363

def update_voltage(adc, label):
    voltage = get_voltage(adc, 0)
    label['text'] = '{} V'.format(voltage)
    label.after(1000, update_voltage, adc, label)
Jetzt ist meine Frage wie ich es schaffe das ich einen Prozentwert !EBENFALLS! ausgeben kann. Weil ich bräuchte ja somit eigentlich eine If-Funktion oder?
Es würde reichen verschiedene Bereiche als zum Beispiel 10% zu definieren.

Kann mir da jemand helfen?
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich verstehe die Frage nicht wirklich... Du brauchst dir doch nur den Prozentwert auszurechnen und in einem Label ausgeben zu lassen. Von Prinzip genau so wie die absolute Spannung.

Gruß, noisefloor
Consti9_9
User
Beiträge: 24
Registriert: Dienstag 4. Dezember 2018, 09:09

Das heißt im Grunde nehm ich so eine "Funktion" wie def get_voltage und rechne mir dort die Prozent aus? Und brauche ich dann eine art update_prozent auch noch?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was ist denn eine "Funktion" in Anfuehrungsstrichen? Keine wirkliche Funktion?

Du *kannst* eine weitere Funktion machen, aber warum? Warum kannst du aus dem Wert voltage den du schon hast nicht einfach einen Prozentwert errechnen, und den dann entweder in den bestehenden Text einbauen, oder eben ein zweites Label , dass die Prozente darstellen soll, damit bestuecken?
Consti9_9
User
Beiträge: 24
Registriert: Dienstag 4. Dezember 2018, 09:09

Naja die Akkuspannung liegt ja zwischen 12V und 11V und dazwischen bewegen sich die 100% eines Lithium Akkus. Deshalb kann ich das ja nicht einfach umrechnen?
Also alle 0,2V ca. sinkt die Kapazität um 20%
Vielleicht hänge ich auch gerade ein bisschen und denke zu kompliziert
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

100*(voltage-11) ist ja nicht wirklich kompliziert. Aber die Frage war vorher ja nicht wie, sondern wo.
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Naja die Akkuspannung liegt ja zwischen 12V und 11V und dazwischen bewegen sich die 100% eines Lithium Akkus. Deshalb kann ich das ja nicht einfach umrechnen?
Wenn du keine absolute Bezugsgröße hast (also was 100% ist), dann kannst du nie Prozentrechnung betreiben. Da kann selbst eine ober-geniale Programmiersprache wie Python nichts dran ändern...

Gruß, noisefloor
Antworten