Zum Hauptinhalt springen

Benutzerdefinierte Konfiguration des Analog-Frontends

Was dieses Beispiel zeigt​

Das Beispiel electrochemical-customConfig.py des Moduls erstellt eine eigene SensorConfig, statt eine Voreinstellung zu verwenden, und sendet diese Einstellungen an das analoge Frontend LMP91000 und an den ADC. Nutzen Sie es, wenn Sie die Verstärkung, die interne Nullstellung oder den Nullpunkt-Offset selbst anpassen möchten.

Das Beispiel erstellt den Sensor mit der eigenen SENSOR_CUSTOM und ohne adc_addr, daher wird die Standardadresse des Moduls verwendet. Die Werte im Beispiel gehören zur Ozon-Zelle. Für die Zelle dieses Boards sind die unten aufgeführten Werte der Voreinstellung SENSOR_NH3 ein Ausgangspunkt. Drei davon (ADS_GAIN_4_096V, INTERNAL_ZERO_20_PERCENT und BIAS_SIGN_POSITIVE) sind in den Importen des Beispiels nicht enthalten, fügen Sie sie also hinzu: ADS_GAIN_4_096V stammt aus ads1115, die beiden anderen aus ElectrochemicalGasSensor.

Das Modul kommuniziert mit der ATtiny404-Bridge des Boards nur, wenn adc_addr zwischen 0x30 und 0x37 liegt. Jeder andere Wert, etwa die Standardadresse 0x49, die dieses Beispiel verwendet, wird als I2C-Adresse eines ADS1115 aufgefasst, mit dem das Modul direkt kommuniziert. Auf diesem Board liegt der ADS1115 an den Pins SDA2/SCL2 der Stiftleiste, die die Qwiic-Connectors nicht erreichen. Dieses Beispiel läuft daher nicht über das Qwiic-Kabel. Verbinden Sie stattdessen den Controller mit der Stiftleiste: 3,3 V mit 3V3, GND mit GND, den SDA-Pin des Beispiels (21) mit SDA2 und den SCL-Pin (22) mit SCL2. Das Beispiel läuft dann wie geschrieben, ohne Änderung der Adresse.

Das Anschlussdiagramm in den Kommentaren des Beispiels verbindet LMPEN mit einem GPIO-Pin. Lassen Sie LMPEN auf diesem Board unverbunden: Ein 10-kΩ-Widerstand zieht ihn bereits auf GND, und auch der ATtiny404 ist damit verbunden.

ArgumentWert für SENSOR_NH3
nano_amperes_per_ppm40.0
internal_zero_calibration0
ads_gainADS_GAIN_4_096V
tia_gainTIA_GAIN_35_KOHM
rloadRLOAD_10_OHM
ref_sourceREF_EXTERNAL
internal_zeroINTERNAL_ZERO_20_PERCENT
bias_signBIAS_SIGN_POSITIVE
biasBIAS_0_PERCENT
fet_shortFET_SHORT_DISABLED
op_modeOP_MODE_3LEAD_AMP_CELL

Der Beispielcode​

# FILE: electrochemical-customConfig.py
# AUTHOR: Fran Fodor @ Soldered
# BRIEF: Custom LMP91000 configuration example for any electrochemical sensor.
# LAST UPDATED: 2026-05-21

# Connecting diagram:
#
# Qwiic------------------------>Qwiic
# LMPEN------------------------>GPIO pin (see config_pin parameter below)

from machine import I2C, Pin
import time
from ElectrochemicalGasSensor import (
ElectrochemicalGasSensor, SensorConfig,
TIA_GAIN_35_KOHM, RLOAD_10_OHM, REF_EXTERNAL,
INTERNAL_ZERO_67_PERCENT, BIAS_SIGN_NEGATIVE, BIAS_0_PERCENT,
FET_SHORT_DISABLED, OP_MODE_3LEAD_AMP_CELL,
)
from ads1115 import ADS_GAIN_2_048V

# Custom sensor configuration — edit these values to match your sensor's datasheet.
#
# nanoAmperesPerPPM: Sensitivity from the sensor datasheet (nA/PPM)
# internalZeroCalibration: Voltage offset added to zero the reading in clean air
# adsGain: ADS1115 full-scale range (ADS_GAIN_6_144V .. ADS_GAIN_0_256V)
# tia_gain: TIA feedback resistor (TIA_GAIN_2_75_KOHM .. TIA_GAIN_350_KOHM)
# rload: Load resistor (RLOAD_10_OHM .. RLOAD_100_OHM)
# ref_source: Reference voltage source (REF_INTERNAL / REF_EXTERNAL)
# internal_zero: Internal zero percentage (INTERNAL_ZERO_20/50/67_PERCENT or _BYPASSED)
# bias_sign: Bias polarity (BIAS_SIGN_NEGATIVE / BIAS_SIGN_POSITIVE)
# bias: Bias percentage of Vref (BIAS_0_PERCENT .. BIAS_24_PERCENT)
# fet_short: FET short (FET_SHORT_DISABLED / FET_SHORT_ENABLED)
# op_mode: Operating mode (OP_MODE_3LEAD_AMP_CELL for normal operation)
SENSOR_CUSTOM = SensorConfig(
nano_amperes_per_ppm=-1000.0,
internal_zero_calibration=-0.0012,
ads_gain=ADS_GAIN_2_048V,
tia_gain=TIA_GAIN_35_KOHM,
rload=RLOAD_10_OHM,
ref_source=REF_EXTERNAL,
internal_zero=INTERNAL_ZERO_67_PERCENT,
bias_sign=BIAS_SIGN_NEGATIVE,
bias=BIAS_0_PERCENT,
fet_short=FET_SHORT_DISABLED,
op_mode=OP_MODE_3LEAD_AMP_CELL,
)

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

sensor = ElectrochemicalGasSensor(SENSOR_CUSTOM, i2c)

# -------------------------------------------------------------------------
# Setup
# -------------------------------------------------------------------------
print("Electrochemical Gas Sensor - Custom Config Example")

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

print("Sensor initialized successfully!")

# -------------------------------------------------------------------------
# Main loop
# -------------------------------------------------------------------------
while True:
reading = sensor.getPPB()

print("Sensor reading: {:.5f} PPB".format(reading))

time.sleep_ms(2500)

🔗Vollständiges Beispiel öffnen

electrochemical-customConfig.py im Commit 623e1e6

→

Die Thonny-Shell zeigt:

ShellMicroPython
Electrochemical Gas Sensor - Custom Config Example
Sensor initialized successfully!

Danach folgt alle 2,5 Sekunden eine Zeile, die mit Sensor reading: beginnt, in ppb mit fünf Nachkommastellen.

Gibt begin() den Wert False zurück, gibt das Beispiel stattdessen ERROR: Can't init the sensor! Check connections! aus und hält an.

Verwendete Funktionen​

SensorConfig(nano_amperes_per_ppm, internal_zero_calibration, ads_gain, tia_gain, rload, ref_source, internal_zero, bias_sign, bias, fet_short, op_mode)returns SensorConfig

Enthält die Einstellungen einer Zelle: ihre Empfindlichkeit und ihren Nullpunkt-Offset für die ppm-Umrechnung, den ADC-Bereich sowie Verstärkung, Last, Referenz, internen Nullpunkt, Bias, FET-Kurzschluss und Betriebsmodus des LMP91000.

ReturnsDas Konfigurationsobjekt, das an ElectrochemicalGasSensor übergeben wird.

Parameter

ParameterBeschreibung
nano_amperes_per_ppmEmpfindlichkeit der Zelle in nA pro ppm, aus dem Datenblatt der Zelle.
internal_zero_calibrationSpannungs-Offset, der addiert wird, um die Messung in sauberer Luft auf null zu setzen.
ads_gainVollausschlagbereich des ADC, ADS_GAIN_6_144V bis ADS_GAIN_0_256V.
tia_gainRückkopplungswiderstand des Verstärkers, TIA_GAIN_2_75_KOHM bis TIA_GAIN_350_KOHM, oder TIA_GAIN_EXTERNAL.
rloadLastwiderstand, RLOAD_10_OHM bis RLOAD_100_OHM.
ref_sourceREF_INTERNAL oder REF_EXTERNAL. Die ppm-Umrechnung setzt die 2,5-V-Referenz des Boards voraus.
internal_zeroINTERNAL_ZERO_20_PERCENT, _50_PERCENT, _67_PERCENT oder INTERNAL_ZERO_BYPASSED.
bias_signBIAS_SIGN_NEGATIVE oder BIAS_SIGN_POSITIVE.
biasBias als Prozentsatz der Referenz, BIAS_0_PERCENT bis BIAS_24_PERCENT.
fet_shortFET_SHORT_DISABLED für den Normalbetrieb oder FET_SHORT_ENABLED.
op_modeOP_MODE_3LEAD_AMP_CELL für den Normalbetrieb; es gibt auch Deep-Sleep-, Standby-, 2-Leiter- und Temperaturmodi.
ElectrochemicalGasSensor(sensor_type, i2c=None, adc_addr=0x49, config_pin=None)returns ElectrochemicalGasSensor

Erstellt das Sensorobjekt mit einer beliebigen SensorConfig, einer Voreinstellung oder Ihrer eigenen. adc_addr legt fest, wie begin() mit dem Board kommuniziert: Von 0x30 bis 0x37 wird das ATtiny-Bridge-Protokoll verwendet; jeder andere Wert wird als eigene I2C-Adresse des ADC verwendet.

ReturnsDas Sensorobjekt.

Parameter

ParameterTypBeschreibung
sensor_typeSensorConfigIhre Konfiguration, hier SENSOR_CUSTOM.
i2cI2CIhr I2C-Objekt.
adc_addrintDie Adresse, mit der das Modul kommuniziert. Standard ist 0x49, die dieses Beispiel verwendet. Auf diesem Board stellt der ADDRESS-Schalter die Adresse der Bridge von 0x30 bis 0x37 ein.
config_pinint oder NoneEine GPIO-Pin-Nummer, die das Modul während der Konfiguration des LMP91000 auf Low und danach auf High setzt, wenn adc_addr außerhalb von 0x30 bis 0x37 liegt. Standard ist None. Von 0x30 bis 0x37 wird sie nicht verwendet.
begin()returns bool

Konfiguriert die ADC-Verstärkung und schreibt die drei LMP91000-Registerwerte, die aus Ihrer SensorConfig erzeugt werden: über die Bridge des Boards, wenn die Adresse 0x30 bis 0x37 ist, oder bei jeder anderen Adresse direkt an den ADS1115 und den LMP91000.

ReturnsTrue, wenn jeder Schritt erfolgreich war. False, wenn die Bridge 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 analogen Frontends fehlgeschlagen ist.

getPPB()returns float

Nimmt eine Messung auf und rechnet sie mit der Verstärkung, dem internen Nullpunkt, dem Offset und der Empfindlichkeit Ihrer Konfiguration um. Ein Ergebnis unter null wird als 0 zurückgegeben.

ReturnsDie Konzentration in ppb.

Zusammenfassung​

begin() packt Ihre SensorConfig in die drei Einstellungsregister des LMP91000 und schreibt sie, und jede Messung verwendet dieselben Felder für die Umrechnung. Ändern Sie jeweils nur ein Argument und vergleichen Sie es mit den oben genannten Werten für SENSOR_NH3.