Zum Hauptinhalt springen

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​

Select Board
averagedMeasurement.ino
// 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:

Serial MonitorAutoscrollShow timestampNewline115200 baud
Message (Enter to send message to the board)
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 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, geht an einen ADS1115 unter dieser Adresse und direkt an den 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 lässt sie weg, daher wird die Standardadresse 0x49 (DEFAULT_ADC_ADDR) verwendet.
_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 lässt ihn weg (-1, keiner).
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 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 double

Nimmt 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

NameTypBeschreibung
_numMeasurementsuint8_tWie viele Messwerte gemittelt werden. Das Beispiel übergibt NUM_READINGS (5).
_secondsDelayuint8_tSekunden, die nach jedem Messwert gewartet wird. Das Beispiel übergibt SECS_BETWEEN_READINGS (3).
double getAveragedPPB(uint8_t _numMeasurements = 5, uint8_t _secondsDelay = 2)returns double

Die 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

NameTypBeschreibung
_numMeasurementsuint8_tWie viele Messwerte gemittelt werden.
_secondsDelayuint8_tSekunden, 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.