Neu: Die KI-Firewall überwacht die gesamte Plattform und erklärt jeden Vorfall in einfachen Worten. So funktioniert es

smbus2 write_i2c_block_data: Was ist das "cmd"-Byte für einen ADS1115?

smbus2 write_i2c_block_data: Was ist das "cmd"-Byte für einen ADS1115?

Gelöst 5 5

Von English mit KI übersetzt ·

Garten-Node-Projekt: Pi Zero 2 W, ADS1115 unter 0x48, AIN0 ist eine kapazitive Bodenfeuchtesonde und AIN1 die 12-V-Batterie über einen Spannungsteiler. Das Skript sendet beide Werte alle 5 Minuten an Hermetry.Ich wollte die großen Bibliotheken umgehen und selbst mit smbus2 mit dem ADS1115 kommunizieren. Ich habe das aus einem Forumsbeitrag kopiert:

bus.write_i2c_block_data(0x48, 0x01, [0xC3, 0x83])
time.sleep(0.01)
data = bus.read_i2c_block_data(0x48, 0x00, 2)
raw = data[1] << 8 | data[0]

Es läuft, aber die Zahlen sind unsinnig: Der Bodenwert springt zwischen etwa 900 und 52.000, obwohl sich nichts ändert. Die smbus2-Dokumentation beschreibt das zweite Argument als cmd. Welches Kommando ist das? Das ADS1115-Datenblatt erwähnt Kommandos nirgends, nur Register. Ich habe das Gefühl, dass mir etwas Grundlegendes fehlt.

♥ 1

Von English mit KI übersetzt ·

Ist cmd nicht ein Code, den der Chip definiert, wie z. B. „Konvertierung starten“?

Still waiting for the gateway to reconnect.
♥ 0

Von English mit KI übersetzt ·

+1, dieses Argument habe ich auch nie verstanden.

Ask me about 4–20 mA.
♥ 0

Von English mit KI übersetzt ·

„cmd“ ist SMBus-Bezeichnung. Bei einem SMBus-Blockschreibzugriff heißt das erste Byte nach der Adresse Command-Byte, und bei registerbasierten Chips wie dem ADS1115 ist dieses Byte der Registerzeiger. Ihre erste Zeile setzt den Zeiger also auf das Config-Register (0x01) und schreibt darin 0xC3 und dann 0x83. Auf dem Bus: Start, 0x90, 0x01, 0xC3, 0x83, Stopp.0xC383 bedeutet: eine Einzelwandlung starten, AIN0 gegen GND, Messbereich ±4,096 V, Einzelschussmodus, 128 Samples/s. Das Lesen setzt den Zeiger auf 0x00 (Conversion-Register) und liest zwei Bytes.Ihr Fehler liegt in der Byte-Reihenfolge. Der ADS1115 sendet zuerst das höchstwertige Byte, und das Ergebnis ist vorzeichenbehaftet:

data = bus.read_i2c_block_data(0x48, 0x00, 2)
raw = (data[0] << 8) | data[1]
if raw > 0x7FFF:
    raw -= 0x10000
volts = raw * 4.096 / 32768

Bei vertauschten Bytes wird eine kleine Änderung im niederwertigen Byte zu einem riesigen Sprung, und genau das ist Ihr 900 gegenüber 52.000. Für AIN1 ändern Sie die MUX-Bits: [0xD3, 0x83]. Und 10 ms reichen bei 128 SPS aus (eine Wandlung dauert etwa 8 ms), die Wartezeit ist also in Ordnung.

Timestamps in UTC or it didn't happen.
Akzeptierte Lösung♥ 7

Von English mit KI übersetzt ·

Tipp von den Inbetriebnahme-Skids: Notieren Sie während der Tests den Rohwert neben der Spannung. Wenn ein Messwert in drei Monaten falsch aussieht, erkennen Sie anhand des Diagramms sofort, ob ein Verstärkungsfehler (Gain) oder ein Sensorproblem vorliegt.

♥ 0

Von English mit KI übersetzt ·

Es war die Byte-Reihenfolge. Nachdem ich sie vertauscht habe, liegt der Bodenwert stabil bei 1.62 V. Wie Keisha vorgeschlagen hat, habe ich soil.raw neben soil.v hinzugefügt, und die Batterie an AIN1 zeigt nach der Teilerrechnung 12.7 V. Außerdem verstehe ich jetzt, was dieses Argument bedeutet, danke Aoife.

♥ 0
Ansicht von 6 Beiträgen – 1 bis 6 (von insgesamt 6)
  • Du musst angemeldet sein, um auf dieses Thema antworten zu können.

Mitdiskutieren

Melde dich an, um Fragen zu stellen und zu beantworten, hilfreiche Beiträge mit „Gefällt mir“ zu markieren und die Antwort zu kennzeichnen, die dein Problem gelöst hat. Jeder Beitrag bringt Punkte und Stufen.

Teilen