Mehrere Messwerte mitteln
Was dieses Beispiel zeigt
Das Beispiel averagedMeasurement nimmt fünf Messwerte auf, wartet nach jedem drei Sekunden, bildet den Mittelwert, gibt ihn in PPM aus, wartet 2,5 Sekunden und beginnt von vorn. Es erstellt den Sensor mit der Standardadresse der Bibliothek, 0x49.
NUM_READINGS und SECS_BETWEEN_READINGS legen fest, wie viele Messwerte gemittelt werden und wie viele Sekunden nach jedem Messwert vergehen.
Das Beispiel ist mit SENSOR_CO, dem Preset der Bibliothek für Kohlenmonoxid, 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
Schnellstart
zeigt.
Der Beispielcode
// Include the required library
#include "Electrochemical-Gas-Sensor-SOLDERED.h"
// How many readings to average from and how long to wait between them
#define NUM_READINGS 5
#define SECS_BETWEEN_READINGS 3
// Configurations for each of the sensor types are in sensorConfigData.h in the library's 'src' folder
// Create the sensor object with the according type
ElectrochemicalGasSensor sensor(SENSOR_CO);
// If you are using a custom I2C address (for multiple sensors) use:
// ElectrochemicalGasSensor sensor(SENSOR_CO, 0x4A, 25);
// For more details on this, see customAddress.ino
void setup()
{
Serial.begin(115200); // For debugging
// Init 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);
}
Serial.println("Sensor initialized successfully!");
}
void loop()
{
// Make the averaged reading
// This is a blocking function, so it will take a while before code continues
double reading = sensor.getAveragedPPM(NUM_READINGS, SECS_BETWEEN_READINGS);
// If PPB is more relevant for your sensor, you can use:
// double reading = sensor.getAveragedPPB(NUM_READINGS, SECS_BETWEEN_READINGS);
// 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:
Sensor initialized successfully!
Danach folgt eine Zeile, die mit Sensor reading: beginnt, mit der gemittelten Konzentration in PPM auf fünf Nachkommastellen. Mit den Einstellungen des Beispiels nimmt jeder Mittelwert fünf Messwerte mit jeweils 3 Sekunden Wartezeit auf, danach wartet der Sketch 2,5 Sekunden, sodass etwa alle 17,5 Sekunden eine neue Zeile erscheint. 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 noneErstellt 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, geht an einen ADS1115 unter dieser Adresse und direkt an den LMP91000.
ReturnsKonstruktor.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
_t | sensorType | Preset 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. |
_adcAddr | uint8_t | Die Adresse, mit der begin() kommuniziert. Dieses Beispiel lässt sie weg, daher wird die Standardadresse 0x49 (DEFAULT_ADC_ADDR) verwendet. |
_configPin | int | Ein 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 lässt ihn weg (-1, keiner). |
bool begin()returns boolStartet I2C und wählt anhand der Adresse, wie mit dem Board kommuniziert wird. Bei einer Adresse von 0x30 bis 0x37 prüft es, 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 es einen ADS1115 unter dieser Adresse mit derselben Verstärkung und Datenrate. In beiden Fällen konfiguriert es anschließend das LMP91000-Front-End. Rufen Sie es einmal vor dem Lesen auf.
Returnstrue, wenn alle Schritte erfolgreich waren, sonst false.
double getAveragedPPM(uint8_t _numMeasurements = 5, uint8_t _secondsDelay = 2)returns doubleNimmt mit getPPM() _numMeasurements Messwerte auf, wartet nach jedem _secondsDelay Sekunden und gibt deren Mittelwert zurück. Es blockiert, bis alle Messwerte aufgenommen sind.
ReturnsGemittelte Gaskonzentration in PPM.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
_numMeasurements | uint8_t | Wie viele Messwerte gemittelt werden. Das Beispiel übergibt NUM_READINGS (5). |
_secondsDelay | uint8_t | Sekunden, die nach jedem Messwert gewartet wird. Das Beispiel übergibt SECS_BETWEEN_READINGS (3). |
double getAveragedPPB(uint8_t _numMeasurements = 5, uint8_t _secondsDelay = 2)returns doubleDie auskommentierte Alternative im Beispiel: Gibt getAveragedPPM() mit denselben Argumenten zurück, multipliziert mit 1000. Es blockiert, bis alle Messwerte aufgenommen sind.
ReturnsGemittelte Gaskonzentration in PPB.
Parameter
| Name | Typ | Beschreibung |
|---|---|---|
_numMeasurements | uint8_t | Wie viele Messwerte gemittelt werden. |
_secondsDelay | uint8_t | Sekunden, die nach jedem Messwert gewartet wird. |
Zusammenfassung
Erstellen Sie einen ElectrochemicalGasSensor mit einem Sensortyp, rufen Sie begin() einmal in
setup() auf und rufen Sie dann getAveragedPPM() oder getAveragedPPB() mit der Anzahl der
Messwerte und der Wartezeit nach jedem auf. Jeder Aufruf blockiert etwa _numMeasurements
mal _secondsDelay Sekunden lang.