Analogwerte vom I2HAE-Modul einlesen
Das Programmbeispiel liest auf Tastendruck die Analogwerte von der Eingangskarte ein, schreibt den Wert in ein Label und gibt ihn in einer Balkengrafik aus.
Programmcode
import tkinter from tkinter import * from tkinter import ttk import smbus bus = smbus.SMBus(1) mainWin = Tk() mainWin.title('Analoge Eingabe') def wert(label,kanal,pb): #Variablen für Label,Kanal,Progressbar def read(): var = bus.read_i2c_block_data(0x08,kanal,11) #Werte von Board in 11 stelliges Array schreiben val = var[2]*256+var[1] #Berechnung der korrekten Zahlenwerte aus dem Array label.config(text=str(val)) #Umwandeln der Integer Zahl in eine String Ziffer + Ausgabe in Label label.after(20, read) #read() wird nach 20 ms erneut ausgeführt pb.config(value=val) #Value der Progressbar wird angepasst read() #Label für Kanalbestimmung (unwichtig) bai1 = ttk.Label(mainWin, width=9, text='Kanal 1: ') bai1.grid(row=1,column=1) bai2 = ttk.Label(mainWin, width=9, text='Kanal 2: ') bai2.grid(row=2,column=1) bai3 = ttk.Label(mainWin, width=9, text='Kanal 3: ') bai3.grid(row=3,column=1) bai4 = ttk.Label(mainWin, width=9, text='Kanal 4: ') bai4.grid(row=4,column=1) bai5 = ttk.Label(mainWin, width=9, text='Kanal 5: ') bai5.grid(row=5,column=1) #Label für Digitale Darstellung labelai1 = ttk.Label(mainWin, width=5) labelai1.grid(row=1,column=2) labelai2 = ttk.Label(mainWin, width=5) labelai2.grid(row=2,column=2) labelai3 = ttk.Label(mainWin, width=5) labelai3.grid(row=3,column=2) labelai4 = ttk.Label(mainWin, width=5) labelai4.grid(row=4,column=2) labelai5 = ttk.Label(mainWin, width=5) labelai5.grid(row=5,column=2) #Progressbar für Analoge Darstellung pb1 = ttk.Progressbar(mainWin, orient='horizontal', maximum=990, length=100, mode='determinate') pb1.grid(row=1,column=3) pb2 = ttk.Progressbar(mainWin, orient='horizontal', maximum=990, length=100, mode='determinate') pb2.grid(row=2,column=3) pb3 = ttk.Progressbar(mainWin, orient='horizontal', maximum=990, length=100, mode='determinate') pb3.grid(row=3,column=3) pb4 = ttk.Progressbar(mainWin, orient='horizontal', maximum=990, length=100, mode='determinate') pb4.grid(row=4,column=3) pb5 = ttk.Progressbar(mainWin, orient='horizontal', maximum=990, length=100, mode='determinate') pb5.grid(row=5,column=3) #Die wert-Funktion wird mit den 3 Parametern bestückt wert(labelai1,0x00,pb1) wert(labelai2,0x01,pb2) wert(labelai3,0x02,pb3) wert(labelai4,0x03,pb4) wert(labelai5,0x04,pb5) mainWin.mainloop()
Hallo,
ich habe einige Fragen zum obigen Code.
Zunächst zu def read():
Warum ist das Array 11-stellig? müssten 9 Stellen nicht ausreichen?
Die Zeile danach dient meines Verständnisses zur Umrechnung von binär zu dezimal. Warum wird jedoch var[2] mit 256 multipliziert? Müsste die 256-er Potenz nicht bei var[8] stehen?
Zuletzt zum Maximum der Progressbar. Das Eingangsmodul spuckt mir ja maximal einen Wert von 1023 aus. Wird „val“ dann bei 990 abgesägt, oder wird der Wert skalliert?
Viele Grüße
S. Ehrismann
Hallo,
1 Byte Zeiger + 5*2 Byte Analogwerte = 11 Byte
Wie die Werte im Array liegen wird hier beschrieben: I2C-Analog Input 5 Kanäle 0-10V 10 Bit
Das HIGH-Byte wird mit 256 multipliziert und zum LOW-Byte dazu addiert.
Anscheinend ging unser Poti nur bis 9,9V so dass mein Sohn die Skalierung entsprechend eingestellt hat. 1023 als Endwert ist richtig.