76 lines
1.9 KiB
Python
76 lines
1.9 KiB
Python
import smbus
|
|
import time
|
|
import json
|
|
|
|
# Adressen der beiden MCP23017 Chips
|
|
MP = 0x20 # Ausgang rechte Hälfte
|
|
|
|
|
|
# Register-Adressen für den MCP23017
|
|
IODIRA = 0x00 # Eingang / Ausgang A
|
|
IODIRB = 0x01 # Eingang / Ausgang B
|
|
GPIOA = 0x12 # GPIO A
|
|
GPIOB = 0x13 # GPIO B
|
|
|
|
# Initialisiere den I2C Bus
|
|
bus = smbus.SMBus(1)
|
|
|
|
|
|
def default():
|
|
# Schleife für alle Registeradressen (0x00 bis 0x15)
|
|
for register in range(0x00, 0x16):
|
|
bus.write_byte_data(MP, register, 0x00)
|
|
|
|
# Konfiguriere alle Pins auf Chip 1 als Ausgang (A und B)
|
|
def configure_chip1_as_output():
|
|
bus.write_byte_data(MP, IODIRA, 0x00) # Setze alle Pins von A als Ausgang
|
|
bus.write_byte_data(MP, IODIRB, 0x00) # Setze alle Pins von B als Ausgang
|
|
|
|
|
|
|
|
# Hauptprogramm
|
|
def main():
|
|
default()
|
|
time.sleep(0.5)
|
|
configure_chip1_as_output()
|
|
|
|
# Teste alle Pins auf Chip 1 (A0-A7, B0-B7)
|
|
for pin in range(32): # 0 bis 31
|
|
#print(f"Setze Pin {pin} auf HIGH auf Chip 1")
|
|
|
|
|
|
bus.write_byte_data(MP, GPIOA, 0x00)
|
|
|
|
|
|
if pin < 16:
|
|
# Setze den gewählten Pin auf HIGH
|
|
if pin < 8: # Pins A0-
|
|
|
|
bus.write_byte_data(MP, IODIRA, ~(1 << pin))
|
|
|
|
bus.write_byte_data(MP, GPIOA, 1 << pin)
|
|
|
|
|
|
print("====================" + str(pin) + "==========================")
|
|
|
|
time.sleep(0.2) # Kurze Pause, damit die Änderung sichtbar wird
|
|
|
|
wert = bus.read_byte_data(MP, GPIOA)
|
|
|
|
|
|
|
|
for j in range(8): # Lese 4*8=32 Pins
|
|
bitmaske = 1 << j # Erstelle eine Maske: 1, 2, 4, 8, 16, ...
|
|
|
|
wert_bitweise = bool(wert & bitmaske) # Isoliere das entsprechende Bit
|
|
|
|
|
|
if wert_bitweise == True:
|
|
print("Gefunden: " + str(j))
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|