I2C-Digital-Output-Modul mit Python und TkInter am Raspberry

In diesem Beitrag wollen wir zeigen wie man die I2C-Module mit Python ansteuern kann.

Als Visualisierung bzw. zum Bedienen wird TkInter benutzt.

 

Ausgänge vom I2HA-Modul mit Button-Tasten EIN und AUS schalten

Unsere Demo-Bedienoberfläche hat acht EIN- und acht AUS-Tasten. Diese werden im Programm hinter den Kommentaren

#EIN-Button-Layout

und

#AUS-Button-Layout

definiert.

So sieht’s aus:

I2C-Output Modul mit Tasten steuern

I2C-Output Modul mit Tasten steuern

 

Module importieren und Globale Variable definieren

im Hauptprogramm werden einige  Module importiert.

Außerdem braucht jede Ausgabekarte eine globale Variable die wir einfach mal o1 für die erste Output-karte nennen

import tkinter
from tkinter import *
from tkinter import ttk
import smbus

bus = smbus.SMBus(1)
mainWin = Tk()
mainWin.title(‘LED_TEST’)

o1 = 0

diese Variable wird dann in den Unterprogrammen der Tasten manipuliert.

Falls der Import vom SM-Bus nicht funktioniert muss dieser erst noch auf dem Raspberry-Pi installiert werden. Diese Anleitung hilft dabei recht gut. https://pypi.python.org/pypi/smbus-cffi

 

Funktion Bit setzten / rücksetzten in Variable

Das Setzten und das Rücksetzten eines einzelnen Bits in einer Variable haben wir in Funktionen gepackt.
Die Ausgabe in die Python Shell kann auch weg gelassen werden.

#Funktion Setze Bit in Variable / Function Set Bit in byte
def
set_bit(value, bit):
print(value | (1<<bit))    #Ausgabe in der Python Shell
return value | (1<<bit)

#Funktion rücksetzte Bit in Variable / Function reset Bit in byte
def
clear_bit(value, bit):
print(value & ~(1<<bit))    #Ausgabe in der Python Shell
return value & ~(1<<bit)

 

Schaltbefehl der Ausgänge auf Button

Wird z.B. die EIN-Taste gedrückt, ruft sich das Unterprogramm der entsprechenden Taste auf.

Beispiel Taste 1 EIN

def button_1e():
global o1
o1 = set_bit(o1, 0)
bus.write_byte(0x20,255set_bit(o1, 0))

In der zweiten Zeile wird angegeben, dass im Unterprogramm die globale Variable o1 verwendet werden soll.

In der dritten Zeile wird in der globalen Variable das Bit null gesetzt

In der vierten Zeile wird die Variable invertiert und auf den I2C-Bus zum Slave an Adresse 0x20 übertragen.

 

Programmcode

import tkinter
from tkinter import *
from tkinter import ttk
import smbus

bus = smbus.SMBus(1)
mainWin = Tk()
mainWin.title('LED_TEST')

o1 = 0

#Funktion Setze Bit in Variable / Function Set Bit in byte
def set_bit(value, bit):
    print(value | (1<<bit))
    return value | (1<<bit)

#Funktion rücksetzte Bit in Variable / Function reset Bit in byte
def clear_bit(value, bit):
    print(value & ~(1<<bit))
    return value & ~(1<<bit)


#Buttonbefehle
def button_1e():
    global o1
    o1 = set_bit(o1, 0)
    bus.write_byte(0x20,255-o1)
def button_2e():
    global o1
    o1 = set_bit(o1, 1)
    bus.write_byte(0x20,255-o1)
def button_3e():
    global o1
    o1 = set_bit(o1, 2)
    bus.write_byte(0x20,255-o1)
def button_4e():
    global o1
    o1 = set_bit(o1, 3)
    bus.write_byte(0x20,255-o1)
def button_5e():
    global o1
    o1 = set_bit(o1, 4)
    bus.write_byte(0x20,255-o1)
def button_6e():
    global o1
    o1 = set_bit(o1, 5)
    bus.write_byte(0x20,255-o1)
def button_7e():
    global o1
    o1 = set_bit(o1, 6)
    bus.write_byte(0x20,255-o1)
def button_8e():
    global o1
    o1 = set_bit(o1, 7)
    bus.write_byte(0x20,255-o1)


def button_1a():
    global o1
    o1 = clear_bit(o1, 0)
    bus.write_byte(0x20,255-o1)
def button_2a():
    global o1
    o1 = clear_bit(o1, 1)
    bus.write_byte(0x20,255-o1)
def button_3a():
    global o1
    o1 = clear_bit(o1, 2)
    bus.write_byte(0x20,255-o1)
def button_4a():
    global o1
    o1 = clear_bit(o1, 3)
    bus.write_byte(0x20,255-o1)
def button_5a():
    global o1
    o1 = clear_bit(o1, 4)
    bus.write_byte(0x20,255-o1)
def button_6a():
    global o1
    o1 = clear_bit(o1, 5)
    bus.write_byte(0x20,255-o1)
def button_7a():
    global o1
    o1 = clear_bit(o1, 6)
    bus.write_byte(0x20,255-o1)
def button_8a():
    global o1
    o1 = clear_bit(o1, 7)
    bus.write_byte(0x20,255-o1)


#EIN-Button-Layout
label_1 = ttk.Label(mainWin, text='Ein').grid(column=1,row=1)
Button_1 = ttk.Button(mainWin, text='LED 1', command = button_1e).grid(column=1,row=2)
Button_2 = ttk.Button(mainWin, text='LED 2', command = button_2e).grid(column=1,row=3)
Button_3 = ttk.Button(mainWin, text='LED 3', command = button_3e).grid(column=1,row=4)
Button_4 = ttk.Button(mainWin, text='LED 4', command = button_4e).grid(column=1,row=5)
Button_5 = ttk.Button(mainWin, text='LED 5', command = button_5e).grid(column=1,row=6)
Button_6 = ttk.Button(mainWin, text='LED 6', command = button_6e).grid(column=1,row=7)
Button_7 = ttk.Button(mainWin, text='LED 7', command = button_7e).grid(column=1,row=8)
Button_8 = ttk.Button(mainWin, text='LED 8', command = button_8e).grid(column=1,row=9)

#AUS-Button-Layout
label_1 = ttk.Label(mainWin, text='Aus').grid(column=2,row=1)
Button_1a = ttk.Button(mainWin, text='LED 1', command = button_1a).grid(column=2,row=2)
Button_2a = ttk.Button(mainWin, text='LED 2', command = button_2a).grid(column=2,row=3)
Button_3a = ttk.Button(mainWin, text='LED 3', command = button_3a).grid(column=2,row=4)
Button_4a = ttk.Button(mainWin, text='LED 4', command = button_4a).grid(column=2,row=5)
Button_5a = ttk.Button(mainWin, text='LED 5', command = button_5a).grid(column=2,row=6)
Button_6a = ttk.Button(mainWin, text='LED 6', command = button_6a).grid(column=2,row=7)
Button_7a = ttk.Button(mainWin, text='LED 7', command = button_7a).grid(column=2,row=8)
Button_8a = ttk.Button(mainWin, text='LED 8', command = button_8a).grid(column=2,row=9)

mainWin.mainloop()


 

 

 

 

 

 

Schreibe einen Kommentar

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