Zum Hauptinhalt springen

Nullpunktkalibrierung

Was dieses Beispiel zeigt​

Das Beispiel calibrateSensor der Bibliothek addiert mit setCustomZeroCalibration() eine feste Offset-Spannung zu jedem Messwert. Stellen Sie in Luft ohne das Zielgas den Offset so ein, dass die Spannung nach der Kalibrierung ungefähr 0 beträgt, wie es der Kommentar im Beispiel angibt.

Das Beispiel erzeugt den Sensor mit SENSOR_NH3, dem Preset für Ammoniak. Die Bibliothek berechnet ppm aus den Empfindlichkeits- und Verstärkungseinstellungen des Presets; das Preset für die Chlorzelle dieses Boards ist SENSOR_CL2.

Um die Spannungen beim Einstellen des Offsets zu sehen, öffnen Sie in der installierten Bibliothek src/Electrochemical-Gas-Sensor-SOLDERED.h und entfernen Sie das // vor #define ELECTROCHEMICAL_SENSOR_DEBUG. Jeder Aufruf von getPPM() gibt dann zusätzlich die Rohspannung, die Spannung ohne den Referenzwert und die Spannung nach der Kalibrierung aus.

Der Beispielcode​

Select Board
calibrateSensor.ino
/**
**************************************************
*
* @file calibrateSensor.ino
* @brief See how to calibrate an electrochemical sensor
*
* To successfully run the sketch:
* - Uncomment the #define in the library header file
* - Connect LMPEN pin to GND or a GPIO pin so the breakout can be configured
* - Run the sketch and open serial monitor at 115200 baud!
*
*
* @authors Robert @ soldered.com
***************************************************/

// 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);
}

Der Kommentar im Header verlangt, LMPEN zu verbinden. Auf diesem Board hält ein 10-kΩ-Widerstand LMPEN auf Low, und der Pin ist mit dem ATtiny404 verdrahtet, daher lassen Sie ihn unverbunden (siehe die Pin-Tabelle auf Hardware-Details).

Erwartetes Ergebnis:

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

Danach folgt alle 2,5 s eine Zeile Sensor reading: , wie im Quick Start. Bei aktiviertem Debug-Define geht jedem Messwert Electrochemical gas sensor readings: voraus, gefolgt von drei Zeilen, Raw voltage measurement:, Voltage without reference value: und Voltage after calibration:, jeweils mit dem Wert in Volt auf zehn Nachkommastellen. Schlägt begin() fehl, 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 ElectrochemicalGasSensor

Erzeugt das Sensorobjekt. Es speichert nur die Einstellungen; an das Board wird nichts gesendet, bevor begin() aufgerufen wird.

ReturnsDas Sensorobjekt.

Parameter

TypNameBeschreibung
sensorType_tDas Zellen-Preset. Das Beispiel übergibt SENSOR_NH3; die SGX-4CL2-Zelle dieses Boards hat das Preset SENSOR_CL2.
uint8_t_adcAddrDie I2C-Adresse, DEFAULT_ADC_ADDR (0x49), wenn sie weggelassen wird; 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 einen ADS1115 unter dieser Adresse und den LMP91000 direkt am Bus.
int_configPinEin GPIO, den begin() auf Low setzt, während es den LMP91000 direkt konfiguriert; das Beispiel übergibt 32. -1 (keiner), wenn er weggelassen wird. Bei den Adressen 0x30 bis 0x37 ungenutzt.
bool begin()returns bool

Startet Wire, prüft, ob das Board antwortet, setzt Verstärkung und Datenrate des ADC gemäß Preset und konfiguriert den LMP91000 mit den Einstellungen des Presets. Rufen Sie es einmal in setup() vor dem Lesen auf.

Returnstrue, wenn das Board geantwortet hat und beide Konfigurationsschritte erfolgreich waren, sonst false.

void setCustomZeroCalibration(double calibration)returns void

Legt die Spannung fest, die getPPM() zu jedem Messwert addiert, nachdem es die interne Nullspannung abgezogen hat. Sie ersetzt die Nullpunktkalibrierung des Presets, die in SENSOR_CL2 den Wert 0 hat.

ReturnsNichts.

Parameter

TypNameBeschreibung
doublecalibrationDer Offset in Volt. Das Beispiel verwendet customCalibration (0.05).
double getPPM()returns double

Nimmt einen Messwert auf und rechnet ihn in ppm um: Es zieht die interne Nullspannung ab (die 2,5-V-Referenz mal dem internen Nullpunktanteil des Presets in Prozent), addiert die Nullpunktkalibrierung, teilt durch die Verstärkung des Verstärkers und durch die Empfindlichkeit des Presets in nA pro ppm. Ein Ergebnis unter null wird als 0 zurückgegeben.

ReturnsDie Gaskonzentration in ppm.

Das Beispiel verwendet außerdem Serial und delay(), die zum Arduino-Core gehören, nicht zu dieser Bibliothek.

Zusammenfassung​

Lassen Sie den Sketch in Luft ohne das Zielgas laufen, lesen Sie Voltage after calibration: ab und ändern Sie customCalibration, bis diese Spannung ungefähr 0 beträgt. Behalten Sie den gefundenen Wert und rufen Sie setCustomZeroCalibration() in Ihrem eigenen Sketch nach begin() damit auf.