I2C-Analog-Input-Modul mit Python und TkInter

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.

I2C-Analog-Input Modul einlesen

I2C-Analog-Input Modul einlesen

 

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

 

Speichere in deinen Favoriten diesen permalink.

2 Kommentare

  1. 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert