Zum Hauptinhalt springen

Benutzerdefinierte Konfiguration

Was dieses Beispiel zeigt​

Das Beispiel electrochemical-customConfig.py des Moduls erstellt eine eigene SensorConfig: die Empfindlichkeit der Zelle, den Nullpunkt-Offset, den ADC-Bereich und jede Einstellung des LMP91000. begin() sendet dann diese Konfiguration an das Board, statt eine integrierte Voreinstellung zu verwenden.

Die Werte im Beispiel gehören nicht zu diesem Board. Um die Zelle dieses Boards abzustimmen, gehen Sie von der Voreinstellung SENSOR_CL2 des Moduls aus und ändern Sie jeweils nur einen Wert. Importieren Sie die Konstanten, die Sie verwenden, wie im Beispiel: den Gain aus ads1115, den Rest aus ElectrochemicalGasSensor.

ArgumentWert von SENSOR_CL2
nano_amperes_per_ppm600.0
internal_zero_calibration0
ads_gainADS_GAIN_4_096V
tia_gainTIA_GAIN_120_KOHM
rloadRLOAD_33_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

Lassen Sie ref_source auf REF_EXTERNAL: Das Board hat eine 2,5-V-Referenz für das Front-End, und das Modul berechnet ppm mit 2,5 V.

Das Beispiel öffnet den I2C-Bus 0 mit SCL an Pin 22 und SDA an Pin 21. Passen Sie sie an Ihr Board an.

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

Examples/electrochemical-customConfig.py im Commit 623e1e6

→

Das Anschlussschema im Beispiel verbindet LMPEN mit einem GPIO. Bei diesem Board hält ein 10-kΩ-Widerstand LMPEN auf Low, und der Pin ist mit dem ATtiny404 verbunden, daher lassen Sie ihn unverbunden (siehe die Pin-Tabelle unter Hardware-Details).

Erwartetes Ergebnis:

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

Danach alle 2,5 s eine Zeile: Sensor reading: , die Konzentration in ppb mit fünf Nachkommastellen und PPB. Schlägt begin() fehl, gibt das Skript 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 Konfiguration einer Zelle. Auch die integrierten Voreinstellungen, darunter SENSOR_CL2, sind SensorConfig-Objekte.

ReturnsDas Konfigurationsobjekt, das an ElectrochemicalGasSensor() übergeben wird.

Parameter

TypNameBeschreibung
floatnano_amperes_per_ppmDie Empfindlichkeit der Zelle in nA pro ppm, die bei der ppm-Berechnung verwendet wird.
floatinternal_zero_calibrationSpannungs-Offset, der zu jeder Messung addiert wird.
intads_gainMessbereich des ADS1115, ADS_GAIN_6_144V bis ADS_GAIN_0_256V.
inttia_gainVerstärkung des LMP91000, TIA_GAIN_EXTERNAL oder TIA_GAIN_2_75_KOHM bis TIA_GAIN_350_KOHM.
intrloadLastwiderstand, RLOAD_10_OHM, RLOAD_33_OHM, RLOAD_50_OHM oder RLOAD_100_OHM.
intref_sourceREF_INTERNAL oder REF_EXTERNAL.
intinternal_zeroINTERNAL_ZERO_20_PERCENT, _50_PERCENT, _67_PERCENT oder INTERNAL_ZERO_BYPASSED.
intbias_signBIAS_SIGN_NEGATIVE oder BIAS_SIGN_POSITIVE.
intbiasBias als Anteil der Referenz, BIAS_0_PERCENT bis BIAS_24_PERCENT.
intfet_shortFET_SHORT_DISABLED oder FET_SHORT_ENABLED.
intop_modeBetriebsmodus, OP_MODE_3LEAD_AMP_CELL für normale Messung.
ElectrochemicalGasSensor(sensor_type, i2c=None, adc_addr=0x49, config_pin=None)returns ElectrochemicalGasSensor

Erstellt das Sensorobjekt. Bis zum Aufruf von begin() wird nichts an das Board gesendet.

ReturnsDas Sensorobjekt.

Parameter

TypNameBeschreibung
SensorConfigsensor_typeDie Konfiguration, hier das SENSOR_CUSTOM des Beispiels.
I2Ci2cEin fertiges machine.I2C-Objekt; das Beispiel übergibt eines. Wird es weggelassen, erstellt das Modul I2C(0, scl=Pin(22), sda=Pin(21)) beim Port esp32 und bei dem einen weiteren Board, das es am Namen erkennt (dort ebenfalls Pins 22 und 21); bei esp8266 I2C(scl=Pin(5), sda=Pin(4)); bei jedem anderen Board löst es Board not recognized, please pass an I2C object manually aus.
intadc_addrDie I2C-Adresse, 0x49, wenn sie weggelassen wird, wie im Beispiel. Bei einer Adresse von 0x30 bis 0x37, dem Bereich des ADDRESS-Schalters dieses Boards, kommuniziert begin() mit dem ATtiny404 des Boards; bei jeder anderen Adresse sucht es einen ADS1115 unter dieser Adresse und den LMP91000 unter 0x48 an dem übergebenen Bus.
intconfig_pinEin GPIO für den MENB-Eingang des LMP91000: Das Modul setzt ihn auf Low, während es den LMP91000 direkt konfiguriert, und sonst auf High. None, wenn er weggelassen wird, wie im Beispiel. Bei Adressen von 0x30 bis 0x37 ungenutzt.
sensor.begin()returns bool

Prüft, ob das Board antwortet, stellt Verstärkung und Datenrate des ADC der Konfiguration ein und schreibt Verstärkung und Last des Verstärkers, Referenz, internen Nullpunkt, Bias und Betriebsmodus in den LMP91000. Rufen Sie sie einmal vor dem Lesen auf.

ReturnsTrue, wenn das Board geantwortet hat und beide Konfigurationsschritte erfolgreich waren, sonst False.

sensor.getPPB()returns float

Führt eine Messung durch und rechnet sie mit den Werten der Konfiguration in ppb um: getPPM() mal 1000. Ein Ergebnis unter null wird als 0.0 zurückgegeben.

ReturnsDie Gaskonzentration in ppb.

Dieses Beispiel verwendet außerdem I2C und Pin aus dem machine-Modul von MicroPython sowie time.sleep_ms(); diese gehören nicht zu dieser Bibliothek, sondern sind Teil von MicroPython selbst.

Zusammenfassung​

begin() schreibt die Einstellungen von LMP91000 und ADC auf das Board, und getPPB() verwendet nano_amperes_per_ppm, internal_zero_calibration, die Verstärkung des Verstärkers und den internen Nullpunkt für die Berechnung. Führen Sie das Skript nach jeder Änderung erneut aus.