Messwerte werden endlich wieder erfasst
Vor einiger Zeit hatte ich bereits davon berichtet, dass wegen eines Defektes der MCP2221 als Brücke zwischen Raspberry Pi und dem I²C Bus via USB dienen muss. Das Problem an der Sache ist, dass hier scheinbar nicht das einzige Problem lag.
Verbindung des ADS1115 mit dem MCP2221
Der MCP2221 bietet von Hause aus einige Schnittstellen. Zusätzlich zur USB-Schnittstelle auch gleichzeitig noch eine RS485 Schnittstelle und auch den I²C Bus. Und letzteres sollte genutzt werden, um den ADS1115 über den MCP2221 wieder an den Raspberry anzubinden. Hier muss man allerdings direkt dazu sagen, dass man sich dabei deutlich in den Bereich der Zeigeradressierung und der Übersetzung von Bytes begibt. Der MCP2221 bietet hierfür glücklicherweise eine Klasse an, mit der entsprechende Objekte instanziiert werden, um Daten zu senden und zu empfangen. Aber: Holla die Waldfee… das ist alles andere als leicht. Wir bewegen uns hier auf einem ganz anderen Niveau. Die Adressierung im I²C-Bus wird hier bspw. lediglich über die hexadezimale Schreibweise vorgenommen.
import EasyMCP2221
mcp = EasyMCP2221.Device()
eeprom = mcp.I2C_Slave(0x50, reg_bytes = 2)
Gleichzeitig muss per Konfiguration der ADS1115 entsprechend eingestellt werden (das würde normalerweise über die dem zugehörige Bibliothek automatisch passieren), sodass die Daten korrekt übersetzt werden. Gleichzeitig ist darauf zu achten, dass die Teilnehmer im Bus die gleiche Baud-Rate haben… also in Summe eine lange Anweisung mit vielen Fehlerquellen. Schlussendlich muss ich zugeben, dass mir die Zeit leider an dieser Stelle nicht ausreichte, um mich in dieses Thema sinnvoll einzuarbeiten und die Anbindung korrekt vorzunehmen.
Eine Alternative ist allerdings auch schon da
Dankenswerter Weise verfügt der MCP2221 auch über eigene Pins, die eingestellt werden können. Grundsätzlich sind diese GPIOs mit einer werksseitigen Konfiguration eingestellt. Diese gilt es entsprechend zu überschreiben und aus den GPIO1 bis GPIO3 analoge Eingänge zu machen (GPIO0 hat diese Funktion nicht). Folglich habe ich einen kleinen Test-Code geschrieben, um zumindest an einem Eingang mal den Bodenfeuchtigkeitssensor zu einzulesen und die eingelesenen Werte direkt in Prozent umzurechnen.

Wie bereits erwähnt, wird hier die Bibliothek „EasyMCP2221“ verwendet, die mit dem vorliegenden MCP2221 auch anstandslos funktioniert. Mit der Code-Zeile mcp.set_pin_function() werden die Einstellungen der Pins vorgenommen. Im Anschluss daran wird noch der Referenz-Spannungswert angegeben, mit dem maximal zu rechnen ist. Da der Bodenfeuchtigkeitssensor bei vollständiger Trockenheit einen Spannungswert von 2,76V ausgibt, war der Referenzwert 4,096V zu wählen, da der Referenzwert 2,048V zu verfälschten Ergebnissen führen würde. Auch wenn der Bodenfeuchtigkeitssensor erwartungsgemäß niemals vollständig von Wasser umgeben sein sollte, macht es aber Sinn, den größeren Referenzwert zu verwenden, um keinen Messbereich zu verschenken.
Schlussendlich ergab die Ausführung des Programms die nachfolgende Rückmeldung (zu beachten ist, dass der Sensor im Wasser lag):

In der drittletzten Zeile sind die effektiven Spannungswerte zu sehen (wobei der zweite und der dritte Wert jeweils durch Störungen verursacht wurden, da hier keine Sensoren angeschlossen waren). In der vorletzten Zeile ist dann der Prozentwert aus der Umrechnung zu finden.
Ich denke, dass wir damit trotz dem Ausfall des I²C-Bus gut gerüstet sind, unser Projekt wie angedacht ausstatten zu können.
