Zum Hauptinhalt springen

Den Nullpunkt kalibrieren

Was dieses Beispiel zeigt​

Das Beispiel electrochemical-calibrateSensor.py des Moduls addiert Ihren eigenen Nullpunkt-Offset zu jedem Messwert. Führen Sie es dort aus, wo keine Spur des Zielgases vorhanden ist, und passen Sie CUSTOM_CALIBRATION an, bis der Messwert gerade eben 0 ppb beträgt.

Das Beispiel erstellt den Sensor mit dem Ozon-Preset des Moduls, SENSOR_O3, adc_addr=0x49 und config_pin=32. 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 seine Messwerte daher keine Ammoniakwerte. Um Ammoniak zu messen, ändern Sie SENSOR_O3 in der Import-Zeile und in der Zeile, die den Sensor erstellt, in SENSOR_NH3. Das Beispiel öffnet den I2C-Bus 0 an Pin 22 (SCL) und Pin 21 (SDA).

Das Modul kommuniziert mit der ATtiny404-Bridge des Boards nur, wenn adc_addr zwischen 0x30 und 0x37 liegt. Jeder andere Wert, etwa das 0x49, das dieses Beispiel übergibt, wird als I2C-Adresse eines ADS1115 aufgefasst, mit dem das Modul direkt kommuniziert, wobei config_pin auf Low gesetzt ist, während es den LMP91000 konfiguriert. Auf diesem Board liegt der ADS1115 an den Header-Pins SDA2/SCL2, die von den Qwiic-Connectors nicht erreicht werden. Dieses Beispiel läuft daher nicht über das Qwiic-Kabel. Verbinden Sie stattdessen den Controller mit dem Header: 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 GPIO 32. Lassen Sie LMPEN auf diesem Board unverbunden: Ein 10-kΩ-Widerstand zieht ihn bereits auf GND, und auch der ATtiny404 ist damit verbunden.

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)

🔗Das vollständige Beispiel öffnen

electrochemical-calibrateSensor.py im Commit 623e1e6

→

Die Thonny-Shell zeigt:

ShellMicroPython
Electrochemical Gas Sensor - Calibration Example
Sensor initialized successfully!

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

Wenn begin() False zurückgibt, gibt das Beispiel stattdessen ERROR: Can't init the sensor! Check connections! aus und stoppt.

Verwendete Funktionen​

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

Erstellt das Sensorobjekt. 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_typeSensorConfigDas Zellen-Preset. SENSOR_NH3 ist das Preset für die Zelle dieses Boards.
i2cI2CIhr I2C-Objekt.
adc_addrintDie Adresse, mit der das Modul kommuniziert. Standard 0x49; das Beispiel übergibt 0x49. 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 auf Low setzt, während es den LMP91000 konfiguriert, und danach auf High, wenn adc_addr außerhalb von 0x30 bis 0x37 liegt; das Beispiel übergibt 32. Standard None. Wird von 0x30 bis 0x37 nicht verwendet.
begin()returns bool

Bei einer Adresse von 0x30 bis 0x37 wird geprüft, ob die Bridge antwortet, und die ADC- und Analog-Front-End-Einstellungen aus dem Preset werden an sie gesendet. Bei jeder anderen Adresse wird der ADS1115 direkt auf dieser Adresse gestartet und der LMP91000 konfiguriert. Rufen Sie sie einmal vor jeder Messung auf.

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 Analog-Front-Ends fehlgeschlagen ist.

setCustomZeroCalibration(calibration)returns None

Legt die Spannung fest, die zu jedem Messwert addiert wird, nachdem der interne Nullpunkt des Front-Ends entfernt wurde. Sie ersetzt die internal_zero_calibration des Presets, die für SENSOR_NH3 0 beträgt.

ReturnsNichts.

Parameter

ParameterTypBeschreibung
calibrationfloatOffset in Volt. Wählen Sie ihn so, dass saubere Luft gerade eben 0 anzeigt.
getPPB()returns float

Nimmt einen Messwert mit angewendetem Offset auf und gibt ihn in Parts per Billion zurück. Ein Ergebnis unter null wird als 0 zurückgegeben.

ReturnsgetPPM() multipliziert mit 1000.

getPPM()returns float

Derselbe Messwert in ppm. Das Beispiel nennt ihn in einem Kommentar als Alternative.

ReturnsDie Gaskonzentration in ppm.

Alles zusammenfügen​

Beachten Sie, dass ein Ergebnis unter null als 0 ausgegeben wird, sodass ein Messwert von genau 0 einen zu niedrigen Offset verbergen kann. Sobald saubere Luft gerade eben 0 anzeigt, rufen Sie in Ihrem eigenen Programm nach begin() die Funktion setCustomZeroCalibration() mit diesem Wert auf.