Zum Hauptinhalt springen

Den Nullpunkt kalibrieren

Was dieses Beispiel zeigt​

Das Beispiel calibrateSensor wendet einen Nullpunkt-Offset an und gibt die Gaskonzentration alle 2,5 Sekunden in PPM aus. Es erstellt den Sensor mit der Adresse 0x49 und dem Konfigurationspin 32.

customCalibration ist eine Spannung, die die Bibliothek zur ADC-Spannung addiert, bevor sie diese umrechnet. Der Kommentar im Beispiel beschreibt das Vorgehen: Passen Sie in einer Umgebung ohne das Zielgas den Wert an, bis die Spannung nach der Kalibrierung ungefähr 0 beträgt.

Um diese Spannung zu sehen, sollen Sie im Beispiel eine Zeile in der Header-Datei der Bibliothek, Electrochemical-Gas-Sensor-SOLDERED.h, auskommentieren:

//#define ELECTROCHEMICAL_SENSOR_DEBUG

Ist sie definiert, gibt jeder Aufruf von getPPM() zusätzlich die rohe Spannungsmessung, die Spannung ohne den Referenzwert und die Spannung nach der Kalibrierung aus.

Das Beispiel ist mit SENSOR_NH3, dem Ammoniak-Preset der Bibliothek, geschrieben, daher sind seine PPM-Werte keine H2S-Werte. Stellen Sie es nicht unverändert auf das Preset SENSOR_H2S der Bibliothek um: Dieses Preset ist für die Zelle SGX-4H2S-100 mit einer Empfindlichkeit von 1200 nA pro ppm geschrieben, während dieses Board die Zelle SGX-4H2S-300 trägt, deren Datenblatt ein Ausgangssignal von 460 ± 140 nA pro ppm angibt. Mit SENSOR_H2S fällt der Messwert etwa 2,6-mal zu niedrig aus. Übergeben Sie stattdessen einen benutzerdefinierten Sensortyp mit den Einstellungen von SENSOR_H2S und 460 nA pro ppm, wie in der Kurzanleitung gezeigt.

Der Beispielcode​

Select Board
calibrateSensor.ino
// Include the required library
#include "Electrochemical-Gas-Sensor-SOLDERED.h"

// This is the custom value we set for the calibration voltage
// This value is added to the voltage read from the ADC
// In an environment with 0 of the target gas, the voltage after calibration should be
// roughly 0, adjust customCalibration to get it to that value.
const double customCalibration = 0.05;


// Create the sensor object with the according type
ElectrochemicalGasSensor sensor(SENSOR_NH3, 0x49, 32);



void setup()
{
Serial.begin(115200); // For debugging

// Initialize the breakout
if (!sensor.begin())
{
// Can't init? Notify the user and go to infinite loop
Serial.println("ERROR: Can't init the sensor! Check connections!");
while (true)
delay(100);
}

//Set the custom calibration value
sensor.setCustomZeroCalibration(customCalibration);

Serial.println("Sensor initialized successfully!");
}

void loop()
{
// Make the reading
double reading = sensor.getPPM();
// This function will also print debug messages if the #define in
// the header file of the library is uncommented
// It will print:
// - The raw voltage measurement
// - Voltage without reference value
// - Voltage after calibration
// These values can help you adjust the internal zero calibration



// Print the reading with 5 digits of precision
Serial.print("Sensor reading: ");
Serial.print(reading, 5);
Serial.println(" PPM");

// Wait a bit before reading again
delay(2500);
}

Erwartetes Ergebnis:

Serial MonitorAutoscrollShow timestampNewline115200 baud
Message (Enter to send message to the board)
Sensor initialized successfully!

Danach folgt alle 2,5 Sekunden eine Zeile, die mit Sensor reading: beginnt, mit der Konzentration in PPM auf fünf Dezimalstellen. Die Bibliothek meldet nie einen Wert unter null: Sie gibt stattdessen 0 zurück, daher ist 0.00000 ein normaler Messwert. Ist ELECTROCHEMICAL_SENSOR_DEBUG definiert, gehen jedem Messwert die Zeilen Electrochemical gas sensor readings:, Raw voltage measurement:, Voltage without reference value: und Voltage after calibration: voraus, jede Spannung in Volt auf zehn Dezimalstellen. Antwortet der Sensor nicht, gibt der Sketch ERROR: Can't init the sensor! Check connections! aus und hält an.

Verwendete Funktionen​

ElectrochemicalGasSensor(sensorType _t, uint8_t _adcAddr = DEFAULT_ADC_ADDR, int _configPin = -1)returns none

Erstellt das Sensorobjekt. Der Sensortyp enthält die Front-End- und Umrechnungseinstellungen 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, führt zu einem ADS1115 unter dieser Adresse und direkt zum LMP91000.

ReturnsKonstruktor.

Parameter

NameTypBeschreibung
_tsensorTypePreset aus der Bibliothek (SENSOR_CO, SENSOR_NO2, SENSOR_SO2, SENSOR_O3, SENSOR_NO, SENSOR_H2S, SENSOR_NH3, SENSOR_CL2) oder ein benutzerdefinierter sensorType. Übergeben Sie für die Zelle dieses Boards einen benutzerdefinierten mit 460 nA pro ppm.
_adcAddruint8_tDie Adresse, mit der begin() kommuniziert. Dieses Beispiel übergibt 0x49.
_configPinintEin GPIO, den die Bibliothek auf High hält und auf Low zieht, während sie den LMP91000 direkt konfiguriert. Wird bei Adressen von 0x30 bis 0x37 ignoriert. Dieses Beispiel übergibt 32.
bool begin()returns bool

Startet I2C und wählt anhand der Adresse, wie mit dem Board kommuniziert wird. Bei einer Adresse von 0x30 bis 0x37 prüft sie, ob der ATtiny404 des Boards antwortet, und sendet ihm die ADC-Verstärkung aus dem Sensortyp mit der niedrigsten Datenrate; jeder Befehl wartet bis zu 500 ms auf eine Antwort. Bei jeder anderen Adresse startet sie einen ADS1115 unter dieser Adresse mit derselben Verstärkung und Datenrate, setzt den Konfigurationspin als Ausgang auf High und zieht ihn auf Low, während sie den LMP91000 konfiguriert. Rufen Sie sie einmal vor dem Auslesen auf.

Returnstrue, wenn jeder Schritt erfolgreich war, andernfalls false.

void setCustomZeroCalibration(double calibration)returns void

Legt den Nullpunkt-Offset fest: eine Spannung, die getPPM() addiert, nachdem der interne Nullpunkt des Front-Ends abgezogen wurde, und bevor in PPM umgerechnet wird. Sie ersetzt die interne Nullpunktkalibrierung des Sensortyps für dieses Objekt.

ReturnsNichts.

Parameter

NameTypBeschreibung
calibrationdoubleOffset in Volt. Das Beispiel übergibt customCalibration (0,05).
double getPPM()returns double

Liest den ADC aus, subtrahiert den internen Nullpunkt des Front-Ends (2,5 V mal dessen Prozentwert), addiert die Nullpunktkalibrierung und teilt dann durch die Verstärkung des Verstärkers und durch die Zellenempfindlichkeit in nA pro ppm aus dem Sensortyp. Ein Ergebnis unter 0 wird als 0 zurückgegeben. Ist ELECTROCHEMICAL_SENSOR_DEBUG definiert, gibt sie außerdem die drei Spannungen aus.

ReturnsGaskonzentration in PPM.

Alles zusammen​

Erstellen Sie den Sensor, rufen Sie begin() auf und rufen Sie dann setCustomZeroCalibration() mit Ihrem Offset auf, bevor Sie Messwerte erfassen. Führen Sie den Sketch dort aus, wo kein Zielgas vorhanden ist, ändern Sie customCalibration und laden Sie ihn erneut hoch, bis die Spannung nach der Kalibrierung ungefähr 0 beträgt.