Zum Hauptinhalt springen

Den Nullpunkt kalibrieren

Was dieses Beispiel zeigt​

Das Beispiel electrochemical-calibrateSensor.py wendet einen Nullpunkt-Offset an und gibt die Gaskonzentration alle 2,5 Sekunden in PPB aus.

Das Beispiel erstellt den Sensor mit adc_addr=0x49 und config_pin=32.

CUSTOM_CALIBRATION ist eine Spannung, die das Modul zur ADC-Spannung addiert, bevor es sie umrechnet. Der Kommentar im Beispiel nennt das Vorgehen: Stellen Sie in Luft ohne das Zielgas den Wert so ein, dass die Anzeige gerade eben 0 PPB beträgt.

Bevor Sie es ausführen:

  • Das Beispiel ist mit SENSOR_O3, der Ozon-Voreinstellung des Moduls, geschrieben, daher sind seine Werte keine H2S-Werte. Stellen Sie es nicht unverändert auf SENSOR_H2S um: Diese Voreinstellung ist für die Zelle SGX-4H2S-100 (1200 nA pro ppm) geschrieben. Das Datenblatt der Zelle SGX-4H2S-300 dieses Boards gibt ein Ausgangssignal von 460 ± 140 nA pro ppm an, daher fällt der Messwert mit dieser Voreinstellung etwa 2,6-mal zu niedrig aus. Übergeben Sie stattdessen eine eigene SensorConfig mit den SENSOR_H2S-Einstellungen und 460 nA pro ppm, wie Schnellstart zeigt.
  • Ändern Sie Pin(22) und Pin(21) auf die SCL- und SDA-Pins Ihres Controllers, falls sie abweichen.

Der Beispielcode​

# FILE: electrochemical-calibrateSensor.py

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

Erwartetes Ergebnis:

ShellMicroPython
Electrochemical Gas Sensor - Calibration Example
Sensor initialized successfully!

Danach folgt alle 2,5 Sekunden eine Zeile, die mit Sensor reading: beginnt, mit der Konzentration in PPB auf fünf Nachkommastellen. Das Modul meldet nie einen Wert unter null: Es gibt stattdessen 0 zurück, daher ist 0.00000 ein normaler Messwert. Wenn das Board nicht antwortet, gibt das Skript ERROR: Can't init the sensor! Check connections! aus und wartet.

Verwendete Funktionen​

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

Erstellt das Sensorobjekt. Der Sensortyp enthält die Front-End- und Umwandlungseinstellungen für eine Gaszelle. Die Adresse bestimmt, wie begin() mit dem Board kommuniziert: Eine Adresse von 0x30 bis 0x37 läuft über den ATtiny404 des Boards; jede andere Adresse, etwa die Standardadresse 0x49, geht an einen ADS1115 unter dieser Adresse und direkt an den LMP91000. Ein config_pin wird, falls angegeben, als Ausgang gesetzt und auf High getrieben.

ReturnsDas Sensorobjekt.

Parameter

NameTypBeschreibung
sensor_typeSensorConfigVoreinstellung des Moduls (SENSOR_CO, SENSOR_NO2, SENSOR_SO2, SENSOR_O3, SENSOR_NO, SENSOR_H2S, SENSOR_NH3, SENSOR_CL2) oder eine eigene SensorConfig. Für die Zelle dieses Boards übergeben Sie eine eigene mit 460 nA pro ppm.
i2cmachine.I2CDer I2C-Bus, an dem das Board angeschlossen ist. Ohne ihn öffnet das Modul selbst einen, aber nur auf den Boards, die es erkennt: ESP32-Builds von MicroPython und der eigene Build eines Soldered-Boards (I2C-Bus 0, SCL 22, SDA 21) sowie ESP8266-Builds (SCL 5, SDA 4). Auf jedem anderen Board löst es Board not recognized, please pass an I2C object manually aus.
adc_addrintDie Adresse, mit der begin() kommuniziert. Dieses Beispiel übergibt 0x49.
config_pinintEin GPIO, den das Modul auf High setzt und auf Low zieht, während es den LMP91000 direkt konfiguriert. Bei Adressen von 0x30 bis 0x37 ungenutzt. Dieses Beispiel übergibt 32.
begin()returns bool

Prüft bei einer Adresse von 0x30 bis 0x37, ob der ATtiny404 des Boards antwortet, sendet ihm die ADC-Verstärkung aus dem Sensortyp und die langsamste Datenrate und lässt ihn dann das LMP91000-Front-End konfigurieren; jeder Befehl wird bis zu 500 ms lang wiederholt. Bei jeder anderen Adresse prüft sie, ob ein ADS1115 unter dieser Adresse antwortet, setzt dessen Verstärkung und die langsamste Datenrate und konfiguriert dann den LMP91000 direkt, wobei config_pin während der Schreibvorgänge auf Low gezogen wird. Rufen Sie sie einmal vor dem Lesen auf.

ReturnsTrue, wenn jeder Schritt erfolgreich war, sonst False.

setCustomZeroCalibration(calibration)returns None

Legt den Nullpunkt-Offset fest: eine Spannung, die getPPM() zur ADC-Spannung addiert, bevor es sie umrechnet. Sie schreibt den Wert in das Sensortyp-Objekt und ersetzt damit dessen interne Nullpunktkalibrierung.

ReturnsNichts.

Parameter

NameTypBeschreibung
calibrationfloatOffset in Volt. Das Beispiel übergibt CUSTOM_CALIBRATION.
getPPB()returns float

Nimmt mit getPPM() einen Messwert auf und multipliziert ihn mit 1000.

ReturnsGaskonzentration in PPB.

getPPM()returns float

Die Alternative, die der Kommentar im Beispiel nennt. Nimmt einen ADC-Messwert auf, zieht den internen Nullpunkt des Front-Ends ab (2,5 V mal dessen Prozentwert), addiert die Nullpunktkalibrierung und teilt dann durch die Verstärkung des Verstärkers und durch die Zellempfindlichkeit in nA pro ppm aus dem Sensortyp. Ein Ergebnis unter 0 wird als 0.0 zurückgegeben.

ReturnsGaskonzentration in PPM.

Dieses Beispiel verwendet außerdem I2C und Pin aus dem machine-Modul von MicroPython, das nicht Teil des Soldered-Moduls ElectrochemicalGasSensor ist.

Alles zusammenfügen​

Erstellen Sie den Sensor, rufen Sie begin() auf und rufen Sie dann setCustomZeroCalibration() mit Ihrem Offset auf, bevor Sie Messwerte erfassen. Führen Sie das Skript in sauberer Luft aus, ändern Sie CUSTOM_CALIBRATION und führen Sie es erneut aus, bis die Anzeige gerade eben 0 PPB beträgt.