Der Code bei den ihr mir geholfen habet, läuft schon länger stabil auf verschieden Geräten.
Aktueller Code: https://bpa.st/UXWQ
link hier im Forum viewtopic.php?f=31&t=46798&start=15#p362337
Für ein neues Projekt möchte ich den Code Umschreiben, weil ich zusätzliche Ein und Ausgänge benötige.
damit es etwas übersichtlicher wird werde ich es Nurmehr für einen Geräte Typ auslegen.
Wenn ihr den Code kurz überfliegt, was sollte ich noch ändern?
Vermutlich sollte ich das Logging in eine Funkton verschieben, das hatte aber damals nicht funktioniert.
Hättet ihr da ein Beispiel bzw eine Anleitung zur Hand?
Mein Problem gleich am Anfang ist das Auslesen der Bits und zu Bytes zusammen Fasen.
Es werden bis zu 8 PCF8574 I2C IO Erweiterung Module , mit je 8 ein oder Ausgängen werden.
Den zustand dieser IO´s möchte ich auslesen und wieder per Udp als zahl versenden, wenn möglich au 2mal, also je 4 Bytes auf einmal.
Aber es sieht so aus als wäre die Variable nicht Groß Genugt, der Wert wir Negative wenn ich Bit 8 von Byte 4 auf 1 setze.
Code: Alles auswählen
>>> pcf_io_werte_in()
0
>>> pcf_io_werte_out()
-2122252032
>>>
Code: Alles auswählen
pi@keller-pi:~ $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pcf8574 import PCF8574
>>> import numpy as np
>>>
>>> #Konstaten
... I2C_PORT_NUMMER = 1
>>> PCF1_ADDRESS = 0x20 #Eingänge
>>> PCF2_ADDRESS = 0x21 #Ausgänge
>>> PCF3_ADDRESS = 0x22 #Eingänge
>>> PCF4_ADDRESS = 0x23 #Ausgänge
>>> PCF5_ADDRESS = 0x24 #Eingänge
>>> PCF6_ADDRESS = 0x25 #Ausgänge
>>> PCF7_ADDRESS = 0x26 #reserve
>>> PCF7_ADDRESS = 0x27 #reserve
>>>
>>>
>>> #variablen werden noch in eine funktion geschrieben
... pcf1 = PCF8574(I2C_PORT_NUMMER, PCF1_ADDRESS)
>>> pcf3 = PCF8574(I2C_PORT_NUMMER, PCF3_ADDRESS)
>>> pcf5 = PCF8574(I2C_PORT_NUMMER, PCF5_ADDRESS)
>>> pcf7 = PCF8574(I2C_PORT_NUMMER, PCF5_ADDRESS)
>>>
>>> pcf2 = PCF8574(I2C_PORT_NUMMER, PCF2_ADDRESS)
>>> pcf4 = PCF8574(I2C_PORT_NUMMER, PCF4_ADDRESS)
>>> pcf6 = PCF8574(I2C_PORT_NUMMER, PCF6_ADDRESS)
>>> pcf8 = PCF8574(I2C_PORT_NUMMER, PCF6_ADDRESS)
>>>
>>>
>>> #zum Testen die Ein und Ausgänge in einen bestimmten zustand setzen
... pcf1.port = [False, False, False, False, False, False, False, False ]
>>> pcf2.port = [False, False, False, False, False, False, False, False ]
>>> pcf3.port = [False, False, False, False, False, False, False, False]
>>> pcf4.port = [True, False, False, False, False, False, False, True]
>>> pcf5.port = [False, False, False, False, False, False, False, False]
>>> pcf6.port = [False, False, False, False, False, False, False, False]
>>> pcf7.port = [False, False, False, False, False, False, False, False]
>>> pcf8.port = [True, False, False, False, False, False, False, True]
>>>
>>>
>>>
>>> def pcf_io_werte_in():
... """pcf_io_werte auslesen
... bitwise operations """
... try:
... pcf_io_werte_1 = np.multiply(np.array(pcf1.port), 1)
... pcf_io_werte_3 = np.multiply(np.array(pcf3.port), 1)
... pcf_io_werte_5 = np.multiply(np.array(pcf5.port), 1)
... pcf_io_werte_7 = np.multiply(np.array(pcf7.port), 1)
... pcf_io_binär = np.concatenate((pcf_io_werte_7, pcf_io_werte_5, pcf_io_werte_3, pcf_io_werte_1))
... pcf_io_integer = 0
... for bit in pcf_io_binär:
... pcf_io_integer = (pcf_io_integer << 1) | bit
... return pcf_io_integer
... except Exception:
... print("error")
...
>>>
>>> def pcf_io_werte_out():
... """pcf_io_werte auslesen
... bitwise operations """
... try:
... pcf_io_werte_2 = np.multiply(np.array(pcf2.port), 1)
... pcf_io_werte_4 = np.multiply(np.array(pcf4.port), 1)
... pcf_io_werte_6 = np.multiply(np.array(pcf6.port), 1)
... pcf_io_werte_8 = np.multiply(np.array(pcf8.port), 1)
... pcf_io_binär = np.concatenate((pcf_io_werte_8, pcf_io_werte_6, pcf_io_werte_4, pcf_io_werte_2,))
... pcf_io_integer = 0
... for bit in pcf_io_binär:
... pcf_io_integer = (pcf_io_integer << 1) | bit
... return pcf_io_integer
... except Exception:
... print("error")
...
>>>
>>> pcf_io_werte_in()
0
>>> pcf_io_werte_out()
-2122252032
>>>