Zum Hauptinhalt springen

Zwei Sensoren auslesen

Was dieses Beispiel zeigt​

Das Beispiel electrochemical-twoSensors.py erstellt zwei Sensorobjekte an einem I2C-Bus, jeweils mit eigener ADC-Adresse und eigenem Konfigurationspin, und gibt beide Messwerte alle 2,5 Sekunden in PPB aus. Es erstellt Sensor 1 mit adc_addr=0x4A und config_pin=25 sowie Sensor 2 mit adc_addr=0x49 und config_pin=32.

Bevor Sie es ausführen:

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

Der Beispielcode​

# FILE: electrochemical-twoSensors.py

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

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

# Sensor 1: ADC address 0x4A, LMPEN on pin 25
sensor1 = ElectrochemicalGasSensor(SENSOR_O3, i2c, adc_addr=0x4A, config_pin=25)

# Sensor 2: ADC address 0x49, LMPEN on pin 32
sensor2 = ElectrochemicalGasSensor(SENSOR_O3, i2c, adc_addr=0x49, config_pin=32)

# -------------------------------------------------------------------------
# Setup
# -------------------------------------------------------------------------
print("Electrochemical Gas Sensor - Two Sensors Example")

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

print("Sensor 1 initialized successfully!")

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

print("Sensor 2 initialized successfully!")

# -------------------------------------------------------------------------
# Main loop
# -------------------------------------------------------------------------
while True:
reading1 = sensor1.getPPB()
reading2 = sensor2.getPPB()

print("Sensor 1 reading: {:.5f} PPB".format(reading1))
print("Sensor 2 reading: {:.5f} PPB".format(reading2))

time.sleep_ms(2500)

Das vollständige Beispiel öffnen

Erwartetes Ergebnis:

ShellMicroPython
Electrochemical Gas Sensor - Two Sensors Example
Sensor 1 initialized successfully!
Sensor 2 initialized successfully!

Danach folgen alle 2,5 Sekunden eine Zeile Sensor 1 reading: und eine Zeile Sensor 2 reading:, jeweils mit der Konzentration in PPB auf fünf Nachkommastellen. Antwortet ein Sensor nicht, gibt das Skript ERROR: Can't init sensor 1! Check connections! (bzw. sensor 2) aus und wartet.

Verwendete Funktionen​

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

Erstellt pro Gaszelle ein Sensorobjekt, jeweils mit eigener Adresse und eigenem Konfigurationspin. 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 angegebener config_pin wird als Ausgang gesetzt und auf High gelegt.

ReturnsDas Sensorobjekt.

Parameter

NameTypeDescription
sensor_typeSensorConfigPreset aus dem Modul (SENSOR_CO, SENSOR_NO2, SENSOR_SO2, SENSOR_O3, SENSOR_NO, SENSOR_H2S, SENSOR_NH3, SENSOR_CL2) oder eine benutzerdefinierte SensorConfig. Für die Zelle dieses Boards übergeben Sie eine benutzerdefinierte mit 460 nA pro ppm.
i2cmachine.I2CDer I2C-Bus, über den kommuniziert wird. Beide Objekte teilen sich denselben Bus.
adc_addrintDie Adresse, mit der begin() kommuniziert. Dieses Beispiel übergibt 0x4A für Sensor 1 und 0x49 für Sensor 2.
config_pinintEin GPIO, den das Modul auf High hält und auf Low zieht, während es den LMP91000 dieses Sensors direkt konfiguriert. Bei Adressen von 0x30 bis 0x37 ungenutzt. Dieses Beispiel übergibt 25 für Sensor 1 und 32 für Sensor 2.
begin()returns bool

Bei einer Adresse von 0x30 bis 0x37 wird geprüft, ob der ATtiny404 des Boards unter dieser Adresse antwortet; anschließend werden ihm die ADC-Verstärkung aus dem Sensortyp und die langsamste Datenrate gesendet, danach lässt man ihn das LMP91000-Frontend konfigurieren; jeder Befehl wird bis zu 500 ms lang wiederholt. Bei jeder anderen Adresse wird geprüft, ob unter dieser Adresse ein ADS1115 antwortet, seine Verstärkung und die langsamste Datenrate werden gesetzt, dann wird der LMP91000 direkt konfiguriert, wobei config_pin während der Schreibvorgänge auf Low gezogen wird. Rufen Sie es einmal für jedes Sensorobjekt auf.

ReturnsTrue, wenn alle Schritte erfolgreich waren, sonst False.

getPPB()returns float

Nimmt mit getPPM() einen Messwert für dieses Sensorobjekt auf und multipliziert ihn mit 1000.

ReturnsGaskonzentration in PPB.

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

Zusammengefasst​

Öffnen Sie einen I2C-Bus, erstellen Sie pro Gaszelle ein ElectrochemicalGasSensor-Objekt, jeweils mit eigener Adresse und eigenem Konfigurationspin, rufen Sie bei jedem begin() auf und lesen Sie dann jeden mit getPPB() aus.