Zum Hauptinhalt springen

Zwei Sensoren an einem Bus

Was dieses Beispiel zeigt​

Das Beispiel electrochemical-twoSensors.py des Moduls liest zwei Boards am selben I2C-Bus aus. Es erzeugt pro Board ein Sensorobjekt, startet beide und gibt alle 2,5 Sekunden beide Messwerte in ppb aus.

Das Beispiel erzeugt sensor1 mit adc_addr=0x4A und config_pin=25 sowie sensor2 mit adc_addr=0x49 und config_pin=32, beide mit dem Ozon-Preset des Moduls, SENSOR_O3. SENSOR_NH3 ist das Preset für die Zelle dieses Boards, und die Umrechnung in ppm verwendet die Empfindlichkeit des Presets (-1000 nA/ppm für SENSOR_O3, 40 nA/ppm für SENSOR_NH3). So, wie das Beispiel ausgeliefert wird, sind die Messwerte daher keine Ammoniakwerte. Um Ammoniak zu messen, ändern Sie SENSOR_O3 in der Import-Zeile und in den beiden Zeilen, die die Sensoren erzeugen, in SENSOR_NH3. Das Beispiel öffnet I2C-Bus 0 mit Pin 22 (SCL) und Pin 21 (SDA).

Das Modul kommuniziert mit der ATtiny404-Brücke des Boards, wenn adc_addr zwischen 0x30 und 0x37 liegt; bei jedem anderen Wert, wie 0x4A und 0x49 im Beispiel, spricht es direkt einen ADS1115 unter dieser Adresse an. Auf diesem Board liegt der ADS1115 an den Pins SDA2/SCL2 der Stiftleiste, die von den Qwiic-Connectors nicht erreicht werden. Dieses Beispiel läuft daher nicht über Qwiic-Kabel. Verbinden Sie stattdessen den Controller mit der Stiftleiste jedes Boards: 3,3 V mit 3V3, GND mit GND, den SDA-Pin des Beispiels (21) mit SDA2 und dessen SCL-Pin (22) mit SCL2. JP2 bis JP4 legen die ADS1115-Adresse jedes Boards fest, wie in Hardware-Details beschrieben. Das Beispiel läuft dann wie geschrieben, ohne dass die Adressen geändert werden müssen.

Das Anschlussschema in den Kommentaren des Beispiels verbindet das LMPEN jedes Boards mit einem GPIO-Pin (25 und 32), weil zwei LMP91000-Chips an einem Bus dieselbe Adresse teilen. Lassen Sie LMPEN auf diesem Board unverbunden: Ein 10-kΩ-Widerstand zieht LMPEN bereits auf GND, und auch der ATtiny404 ist damit verbunden.

Der Beispielcode​

# FILE: electrochemical-twoSensors.py
# AUTHOR: Fran Fodor @ Soldered
# BRIEF: Two O3 sensor PPB reading example using two breakouts on one I2C bus.
# LAST UPDATED: 2026-05-21

# Connecting diagram:
#
# Qwiic------------------------>Qwiic
# LMPEN------------------------>25 (GPIO pin, required for I2C configuration)
#
# Qwiic------------------------>Qwiic (same bus)
# LMPEN------------------------>32 (GPIO pin, required for I2C configuration)
#
# Set different ADC I2C addresses on each breakout using the address jumpers.
# Both LMP91000 chips share address 0x48 — the LMPEN pin selects which one
# is active during configuration, so a GPIO pin is required for each sensor.

from machine import I2C, Pin
import time
from ElectrochemicalGasSensor import ElectrochemicalGasSensor, SENSOR_O3

# Initialize shared I2C bus
i2c = I2C(0, scl=Pin(22), sda=Pin(21))

# Sensor 1: ADC address 0x4A, LMPEN on pin 25
sensor1 = ElectrochemicalGasSensor(SENSOR_O3, i2c, adc_addr=0x4A, config_pin=25)

# Sensor 2: ADC address 0x49, LMPEN on pin 32
sensor2 = ElectrochemicalGasSensor(SENSOR_O3, i2c, adc_addr=0x49, config_pin=32)

# -------------------------------------------------------------------------
# Setup
# -------------------------------------------------------------------------
print("Electrochemical Gas Sensor - Two Sensors Example")

if not sensor1.begin():
print("ERROR: Can't init sensor 1! Check connections!")
while True:
time.sleep_ms(100)

print("Sensor 1 initialized successfully!")

if not sensor2.begin():
print("ERROR: Can't init sensor 2! Check connections!")
while True:
time.sleep_ms(100)

print("Sensor 2 initialized successfully!")

# -------------------------------------------------------------------------
# Main loop
# -------------------------------------------------------------------------
while True:
reading1 = sensor1.getPPB()
reading2 = sensor2.getPPB()

print("Sensor 1 reading: {:.5f} PPB".format(reading1))
print("Sensor 2 reading: {:.5f} PPB".format(reading2))

time.sleep_ms(2500)

🔗Das vollständige Beispiel öffnen

electrochemical-twoSensors.py im Commit 623e1e6

→

Die Thonny-Shell zeigt:

ShellMicroPython
Electrochemical Gas Sensor - Two Sensors Example
Sensor 1 initialized successfully!
Sensor 2 initialized successfully!

Danach folgen alle 2,5 Sekunden zwei Zeilen, Sensor 1 reading: und Sensor 2 reading:, jeweils in ppb mit fünf Nachkommastellen.

Gibt ein Aufruf von begin() False zurück, gibt das Beispiel stattdessen ERROR: Can't init sensor 1! Check connections! (oder sensor 2) aus und hält an.

Verwendete Funktionen​

ElectrochemicalGasSensor(sensor_type, i2c=None, adc_addr=0x49, config_pin=None)returns ElectrochemicalGasSensor

Erzeugt ein Sensorobjekt. Erzeugen Sie eines pro Board, jeweils mit eigener adc_addr. adc_addr bestimmt, wie begin() mit dem Board kommuniziert: Von 0x30 bis 0x37 wird das ATtiny-Brückenprotokoll verwendet; jeder andere Wert wird als eigene I2C-Adresse des ADC verwendet.

ReturnsDas Sensorobjekt.

Parameter

ParameterTypBeschreibung
sensor_typeSensorConfigDas Zellen-Preset. SENSOR_NH3 ist das Preset für die Zelle dieses Boards.
i2cI2CIhr I2C-Objekt. Beide Sensoren verwenden dasselbe.
adc_addrintDie Adresse, unter der das Modul das jeweilige Board anspricht: eine Brückenadresse von 0x30 bis 0x37 oder andernfalls eine ADS1115-Adresse. Standardwert 0x49. Das Beispiel übergibt die ADS1115-Adressen 0x4A für Sensor 1 und 0x49 für Sensor 2. Die eigene Adresse dieses Boards ist seine Brückenadresse, die mit dem ADDRESS-Schalter von 0x30 bis 0x37 eingestellt wird.
config_pinint oder NoneEine GPIO-Pin-Nummer, die das Modul auf Low setzt, während es den LMP91000 dieses Boards konfiguriert, und danach auf High, wenn adc_addr außerhalb von 0x30 bis 0x37 liegt. Das Beispiel übergibt 25 und 32. Standardwert None. Wird von 0x30 bis 0x37 nicht verwendet.
begin()returns bool

Bei einer Adresse von 0x30 bis 0x37 wird geprüft, ob die Brücke dieses Boards antwortet, und es werden ihr die ADC- und Analog-Frontend-Einstellungen aus dem Preset gesendet. Bei jeder anderen Adresse wird der ADS1115 direkt unter dieser Adresse gestartet und der LMP91000 konfiguriert. Rufen Sie die Funktion vor jeder Messung einmal für jeden Sensor auf.

ReturnsTrue, wenn jeder Schritt erfolgreich war. False, wenn die Brücke nicht innerhalb von 500 ms mit OK geantwortet oder einen Fehler gemeldet hat, wenn das Starten des ADS1115 fehlgeschlagen ist oder wenn die Konfiguration des Analog-Frontends fehlgeschlagen ist.

getPPB()returns float

Führt eine Messung mit diesem Sensor durch und gibt sie in Parts per Billion zurück. Ein Ergebnis unter null wird als 0 zurückgegeben.

ReturnsgetPPM() multipliziert mit 1000.

Alles zusammenfügen​

Geben Sie jedem Board eine eigene Adresse, erzeugen Sie pro Board ein Sensorobjekt auf dem gemeinsamen I2C-Objekt und rufen Sie begin() für jedes auf. Gibt ein begin() False zurück, nennt das Beispiel den betreffenden Sensor und hält an.