@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.
Variable & Display
- __blackjack__
- User
- Beiträge: 14036
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Das heißt ich sollte es so umschreiben, bzw würde es so passen?
Programmname = ADC
Das heißt ich könnte die Funktion so aufrufen:
Dies würde dann den 1 Kanal auslesen oder?
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()
Code: Alles auswählen
import ADC
ADC.Stromwert(1)
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:
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()
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.
Ich versuche mein Bestes jedoch versteh ich jetzt nicht ganz war da oben passiert.
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__'
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__'
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.
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.
- 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
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
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.
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?
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)
Es würde reichen verschiedene Bereiche als zum Beispiel 10% zu definieren.
Kann mir da jemand helfen?
- 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
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
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?
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?
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
Also alle 0,2V ca. sinkt die Kapazität um 20%
Vielleicht hänge ich auch gerade ein bisschen und denke zu kompliziert
- noisefloor
- User
- Beiträge: 4187
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Gruß, noisefloor
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...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?
Gruß, noisefloor