#Beispiel Relais.py
#https://www.anhahe.de/
#sudo apt-get install python-smbus
#Unter Einstellung/Rasperry-Pi-Konfiguration IC2 Aktivieren
#sudo Pinout Listet all Pin
#sudo i2cdetect -l gibt I2C Adapter aus
#sudo i2cdetect -y 1 RPI ist Revision 2 deswegen 1
from tkinter import *
import smbus
import time
import RPi.GPIO as GPIO
# Open the bus
bus = smbus.SMBus(1) #Revision 2
#MCP23008
MCP23008address =0x20 # MCP23008 Adress IC2
MCP23008RegisterIODIR =0x00 # Register IODIR MCP23008 IO7 IO6 IO5 IO4
MCP23008RegisterIPOL =0x01 # Register IPOL MCP23008 IP7 IP6 IP5 IP4 IP3
MCP23008RegisterGPINTEN =0x02 # Register GPINTEN MCP23008 GPINT7
MCP23008RegisterDEFVAL =0x03 # Register DEFVAL MCP23008 DEF7 DEF6
MCP23008RegisterINTCON =0x04 # Register INTCON MCP23008 IOC7 IOC6
MCP23008RegisterIOCON =0x05 # Register IOCON MCP23008 — — SREAD
MCP23008RegisterGPPU =0x06 # Register GPPU MCP23008 PU7 PU6 PU5
MCP23008RegisterINTF =0x07 # Register INTF MCP23008 INT7 INT6 INT5
MCP23008RegisterINTCAP =0x08 # Register INTCAP MCP23008 ICP7 ICP6
MCP23008RegisterGPIO =0x09 # Register GPIO MCP23008 GP7 GP6 GP5
MCP23008RegisterOLAT =0x0A # Register OLAT MCP23008 OL7 OL6 OL5
# Set up the pins as output
#Address pins are always enabled on MCP23008. MCP23S08 IOCON muss bit 3
bus.write_byte_data( MCP23008address, MCP23008RegisterIODIR, 0x00 )
#Setzt MCP23008 auf I/O Ausgang (Outout)
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, 0x00 )
#alle Relais aus 0x00 beim Starten
#Operator
Bezeichnung
Beispiel
#~x
Bitweises Not
Ausgabe=0x03 also b0000 0011 (Taste auf
#Tastertur AltGr +*)
# Ausgabe=Ausgabe & ~0x01 (also b0000 0001)
#Ausgabe: 0x02 (b0000 0010)
#|x
Binary OR
Ausgabe=0x03 (Taste auf Tastertur AltGr
#<>)
# Ausgabe=Ausgabe & ~0x04 Ausgabe: 0x07
#https://wiki.python.org/moin/BitwiseOperators
def Relais():
global Ausgabe
Ausgabe=0x00
if (CheckVar1.get()==0):
Ausgabe=Ausgabe & ~0x01
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
# Relais1 Ausschalten
if (CheckVar1.get()==1):
Ausgabe=Ausgabe | 0x01
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
# Relais1 Einschalten
if (CheckVar2.get()==0):
Ausgabe=Ausgabe & ~0x02
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar2.get()==1):
Ausgabe=Ausgabe | 0x02
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar3.get()==0):
Ausgabe=Ausgabe & ~0x04
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar3.get()==1):
Ausgabe=Ausgabe | 0x04
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar4.get()==0):
Ausgabe=Ausgabe & ~0x08
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar4.get()==1):
Ausgabe=Ausgabe | 0x08
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar5.get()==0):
Ausgabe=Ausgabe & ~0x10
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar5.get()==1):
Ausgabe=Ausgabe | 0x10
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar6.get()==0):
Ausgabe=Ausgabe & ~MCP23008address
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar6.get()==1):
Ausgabe=Ausgabe | MCP23008address
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar7.get()==0):
Ausgabe=Ausgabe & ~0x40
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar7.get()==1):
Ausgabe=Ausgabe | 0x40
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
if (CheckVar8.get()==0):
Ausgabe=Ausgabe & ~0x80
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
# Relais 8 Ausschalten
if (CheckVar8.get()==1):
Ausgabe=Ausgabe | 0x80
bus.write_byte_data( MCP23008address, MCP23008RegisterGPIO, Ausgabe )
# Relais 8 Einschalten
# Ein Fenster erstellen
fenster = Tk()
#Checkbox 8 Stück mit pack ins Fenster zeichen mit place die Position
CheckVar1 = IntVar()
C1 = Checkbutton(fenster, text = "Relais 1", variable = CheckVar1,command=Relais)
C1.pack()
C1.place(x=50, y=50) #von oben links
CheckVar2 = IntVar()
C2 = Checkbutton(fenster, text = "Relais 2", variable = CheckVar2,command=Relais)
C2.pack()
C2.place(x=50, y=75)
CheckVar3 = IntVar()
C3 = Checkbutton(fenster, text = "Relais 3", variable = CheckVar3,command=Relais)
C3.pack()
C3.place(x=50, y=100)
CheckVar4 = IntVar()
C4 = Checkbutton(fenster, text = "Relais 4", variable = CheckVar4,command=Relais)
C4.pack()
C4.place(x=50, y=125)
CheckVar5 = IntVar()
C5 = Checkbutton(fenster, text = "Relais 5", variable = CheckVar5,command=Relais)
C5.pack()
C5.place(x=50, y=150)
CheckVar6 = IntVar()
C6 = Checkbutton(fenster, text = "Relais 6", variable = CheckVar6,command=Relais)
C6.pack()
C6.place(x=50, y=175)
CheckVar7 = IntVar()
C7 = Checkbutton(fenster, text = "Relais 7", variable = CheckVar7,command=Relais)
C7.pack()
C7.place(x=50, y=200)
CheckVar8 = IntVar()
C8 = Checkbutton(fenster, text = "Relais 8", variable = CheckVar8,command=Relais)
C8.pack()
C8.place(x=50, y=225)
# Fenster Breite, Höhe
w = 1000 # Breite Tk fenster
h = 650 # Höhe Tk fenster
# Lese Bildschirm Auflösung
ws = fenster.winfo_screenwidth() # Breite Auflösung vom Bildschirm
hs = fenster.winfo_screenheight() # Höhe
# Berechnung der Mitte
x = (ws/2) - (w/2)
y = (hs/2) - (h/2)
fenster.geometry('%dx%d+%d+%d' % (w, h, x, y)) # Setz Fenster in Mitte
fenster.resizable(0,0) # Fenster ist in der Groesse nicht
veraenderbar
fenster.title("Steuerung UniPi www.AnHaHe.de") #Beschriftung Kopfzeile
buttonschliessen = Button(fenster, text='Fenster Schliessen', width=25,
command=fenster.destroy)
buttonschliessen.pack()
buttonschliessen.place(x=745, y=620)
fenster.mainloop()