Zum Hauptinhalt springen

Nullpunktkalibrierung

Was dieses Beispiel zeigt​

Das Beispiel electrochemical-calibrateSensor.py des Moduls addiert mit setCustomZeroCalibration() eine feste Offset-Spannung zu jedem Messwert. Stellen Sie CUSTOM_CALIBRATION in Luft ohne das Zielgas so ein, dass der Messwert gerade eben 0 beträgt, wie es der Kommentar im Beispiel beschreibt.

Das Beispiel erzeugt den Sensor mit SENSOR_O3, dem Preset für die Ozonzelle. Das Modul berechnet jeden Messwert aus den Empfindlichkeits- und Verstärkungseinstellungen des Presets; das Preset für die Chlorzelle dieses Boards ist SENSOR_CL2.

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

Der Beispielcode​

# FILE: electrochemical-calibrateSensor.py
# AUTHOR: Fran Fodor @ Soldered
# BRIEF: Sensor zero-point calibration example.
# LAST UPDATED: 2026-05-21

# Connecting diagram:
#
# Qwiic------------------------>Qwiic
# LMPEN------------------------>32 (GPIO pin, required for configuration)

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

# This value is added to the voltage read from the ADC.
# In an environment with 0 of the target gas, the reading after calibration
# should be just barely 0 PPB — adjust this value until that is the case.
CUSTOM_CALIBRATION = 0

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

# Custom ADC address (0x49 default) and GPIO pin for LMPEN
sensor = ElectrochemicalGasSensor(SENSOR_O3, i2c, adc_addr=0x49, config_pin=32)

# -------------------------------------------------------------------------
# Setup
# -------------------------------------------------------------------------
print("Electrochemical Gas Sensor - Calibration Example")

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

# Apply the zero-point calibration offset
sensor.setCustomZeroCalibration(CUSTOM_CALIBRATION)

print("Sensor initialized successfully!")

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

# O3 is typically measured in PPB
# Switch to getPPM() if PPM is more relevant for your use case
print("Sensor reading: {:.5f} PPB".format(reading))

time.sleep_ms(2500)

🔗Vollständiges Beispiel öffnen

Examples/electrochemical-calibrateSensor.py bei Commit 623e1e6

→

Der Anschlussplan im Beispiel verbindet LMPEN mit GPIO 32. Auf diesem Board hält ein 10-kΩ-Widerstand LMPEN auf Low, und der Pin ist mit dem ATtiny404 verbunden. Lassen Sie ihn daher unbeschaltet (siehe die Pin-Tabelle unter Hardware-Details).

Erwartetes Ergebnis:

ShellMicroPython
Electrochemical Gas Sensor - Calibration Example
Sensor initialized successfully!

Danach folgt 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​

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

Erzeugt das Sensorobjekt. Über I2C wird nichts gesendet, bis begin() aufgerufen wird.

ReturnsDas Sensorobjekt.

Parameter

TypeNameDescription
SensorConfigsensor_typeDas Zellen-Preset. Das Beispiel übergibt SENSOR_O3; die SGX-4CL2-Zelle dieses Boards hat das Preset SENSOR_CL2.
I2Ci2cEin fertiges machine.I2C-Objekt; das Beispiel übergibt eines. Wird es weggelassen, erzeugt das Modul I2C(0, scl=Pin(22), sda=Pin(21)) auf dem Port esp32 und auf dem einen weiteren Board, das es am Namen erkennt (dort ebenfalls die Pins 22 und 21); auf esp8266 I2C(scl=Pin(5), sda=Pin(4)); auf jedem anderen Board löst es Board not recognized, please pass an I2C object manually aus.
intadc_addrDie I2C-Adresse, standardmäßig 0x49; das Beispiel übergibt 0x49. 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 an dieser Adresse nach einem ADS1115 und am übergebenen Bus nach dem LMP91000 bei 0x48.
intconfig_pinEin GPIO für den MENB-Eingang des LMP91000: Das Modul setzt ihn auf Low, solange es den LMP91000 direkt konfiguriert, sonst auf High; das Beispiel übergibt 32. Standardmäßig None. Für die Adressen 0x30 bis 0x37 ungenutzt.
sensor.begin()returns bool

Prüft, ob das Board antwortet, stellt die ADC-Verstärkung und die Datenrate des Presets ein und konfiguriert den LMP91000 mit den Einstellungen des Presets. Rufen Sie es einmal vor dem Lesen auf.

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

sensor.setCustomZeroCalibration(calibration)returns None

Legt die Spannung fest, die getPPM() und getPPB() nach Abzug der internen Nullspannung zu jedem Messwert addieren. Sie ersetzt die Nullpunktkalibrierung des Presets, die in SENSOR_CL2 den Wert 0 hat.

ReturnsNichts.

Parameter

TypeNameDescription
floatcalibrationDer Offset in Volt. Das Beispiel verwendet CUSTOM_CALIBRATION (0).
sensor.getPPB()returns float

Nimmt einen Messwert auf und rechnet ihn in ppb um: getPPM() mal 1000. getPPM() zieht die interne Nullspannung ab, addiert die Nullpunktkalibrierung, teilt durch die Verstärkung des Verstärkers und die Empfindlichkeit des Presets und gibt für ein Ergebnis unter null 0.0 zurück.

ReturnsDie Gaskonzentration in ppb.

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

Alles zusammenfügen​

Führen Sie das Skript in sauberer Luft aus und ändern Sie CUSTOM_CALIBRATION, bis der Messwert gerade eben 0 ppb beträgt. Werte unter null werden als 0 gemeldet, daher sagt ein Messwert von genau 0 nicht, wie weit der Offset den Wert unter null belässt. Verwenden Sie den gefundenen Wert in Ihrem eigenen Skript mit setCustomZeroCalibration() nach begin().