Den Nullpunkt kalibrieren
Was dieses Beispiel zeigt
Das Beispiel calibrateSensor der Bibliothek addiert einen eigenen Nullpunkt-Offset zu jeder Messung. Führen Sie es an einem Ort ohne Ammoniak aus und passen Sie customCalibration so lange an, bis die Spannung nach der Kalibrierung ungefähr 0 beträgt. Verwenden Sie danach denselben Offset in Ihrem eigenen Sketch, zeigt saubere Luft knapp 0 ppm an.
Das Beispiel verwendet das Preset SENSOR_NH3, das Preset der Bibliothek für die Zelle dieses Boards, und übergibt die Adresse 0x49 mit GPIO 32 als Konfigurationspin.
Die Bibliothek kommuniziert nur dann mit der ATtiny404-Bridge des Boards, wenn die Adresse zwischen 0x30 und 0x37 liegt. Jede andere Adresse, etwa die 0x49, die dieses Beispiel übergibt, wird als I2C-Adresse eines ADS1115 aufgefasst, mit dem die Bibliothek direkt kommuniziert, wobei der Konfigurationspin beim Konfigurieren des LMP91000 auf Low liegt. Auf diesem Board sitzt der ADS1115 an den Pins SDA2/SCL2 der Stiftleiste, die die Qwiic-Connectors nicht erreichen. Deshalb läuft dieses Beispiel nicht über das Qwiic-Kabel. Verbinden Sie den Controller stattdessen mit der Stiftleiste: 3,3 V mit 3V3, GND mit GND, SDA mit SDA2 und SCL mit SCL2. Das Beispiel läuft dann wie geschrieben, ohne dass die Adresse geändert werden muss.
In den Kommentaren des Beispiels wird LMPEN mit GND oder einem GPIO-Pin verbunden. Lassen Sie LMPEN auf diesem Board unverbunden: Ein 10-kΩ-Widerstand zieht ihn bereits auf GND, und auch der ATtiny404 ist damit verbunden.
Um die Spannungen zu sehen, die Sie anpassen, öffnen Sie die Datei Electrochemical-Gas-Sensor-SOLDERED.h der Bibliothek und entfernen Sie das // vor dieser Zeile:
#define ELECTROCHEMICAL_SENSOR_DEBUG
Der Beispielcode
/**
**************************************************
*
* @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 Serial Monitor zeigt:
Sensor initialized successfully!
Anschließend folgt alle 2,5 Sekunden eine Zeile Sensor reading: in ppm. Ist die Debug-Zeile aktiviert, stehen vor jeder Messung Electrochemical gas sensor readings: und drei Spannungen: Raw voltage measurement:, Voltage without reference value: und Voltage after calibration:, jeweils in Volt.
Gibt begin() den Wert false zurück, gibt das Beispiel stattdessen 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 noneErstellt das Sensorobjekt. begin() wählt anhand der Adresse, wie mit dem Board kommuniziert wird: Von 0x30 bis 0x37 wird die ATtiny404-Bridge verwendet; jede andere Adresse wird als eigene I2C-Adresse des ADS1115 verwendet.
ReturnsKonstruktor.
Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
_t | sensorType | Das Zellen-Preset, hier SENSOR_NH3, das Preset für die Zelle dieses Boards. |
_adcAddr | uint8_t | Die Adresse, hier 0x49. Auf diesem Board stellt der ADDRESS-Schalter die Adresse der Bridge von 0x30 bis 0x37 ein. |
_configPin | int | Ein GPIO, den die Bibliothek beim Konfigurieren des LMP91000 auf Low setzt, wenn die Adresse außerhalb von 0x30 bis 0x37 liegt, hier 32. Wird von 0x30 bis 0x37 nicht verwendet. |
bool begin()returns boolStartet I2C. Bei einer Adresse von 0x30 bis 0x37 prüft die Funktion, ob die Bridge antwortet, und sendet ihr die ADC-Einstellungen aus dem Preset; bei jeder anderen Adresse startet sie den ADS1115 direkt mit dieser Adresse. Danach konfiguriert sie das analoge Frontend des LMP91000.
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 das Konfigurieren des analogen Frontends fehlgeschlagen ist.
void setCustomZeroCalibration(double calibration)returns voidLegt die Spannung fest, die getPPM() zu jeder Messung addiert, nachdem der interne Nullpunkt des Frontends entfernt wurde. Sie ersetzt die internalZeroCalibration des Presets, die für SENSOR_NH3 den Wert 0 hat.
ReturnsNichts.
Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
calibration | double | Offset in Volt. Wählen Sie ihn so, dass die Spannung nach der Kalibrierung ungefähr 0 beträgt, wenn kein Zielgas vorhanden ist. |
double getPPM()returns doubleNimmt eine Messung vor und rechnet sie in ppm um, wobei Ihr Kalibrierungs-Offset angewendet wird. Ein Ergebnis unter null wird als 0 zurückgegeben.
ReturnsDie Gaskonzentration in ppm.
Alles zusammenfügen
Bestimmen Sie den Offset einmal in sauberer Luft bei eingeschalteter Debug-Ausgabe und rufen Sie dann in Ihrem eigenen Sketch nach begin() die Funktion setCustomZeroCalibration() mit diesem Wert auf. Kommentieren Sie die Debug-Zeile danach wieder aus, damit Ihr Sketch nur ausgibt, was Sie angefordert haben.