Zum Hauptinhalt springen

Gemittelte Messung

Was dieses Beispiel zeigt​

Das Beispiel averagedMeasurement der Bibliothek nimmt mehrere Messwerte auf, wartet dazwischen und gibt deren Mittelwert aus. Die Mittelung glättet das Rauschen eines einzelnen Messwerts.

Das Beispiel erzeugt den Sensor mit SENSOR_CO, dem Preset der Bibliothek für Kohlenmonoxid, und ohne Adresse, sodass die Standardadresse der Bibliothek verwendet wird. SENSOR_NH3 ist das Preset der Bibliothek für die SGX-4NH3-Zelle auf diesem Board, und die Umrechnung in ppm verwendet die Empfindlichkeit des Presets: 70 nA/ppm für SENSOR_CO, 40 nA/ppm für SENSOR_NH3. In der ausgelieferten Fassung sind die Messwerte des Beispiels daher keine Ammoniak-ppm. Um Ammoniak zu messen, ändern Sie in der Zeile, die den Sensor erzeugt, SENSOR_CO in SENSOR_NH3.

Die Bibliothek kommuniziert mit der ATtiny404-Bridge des Boards, wenn die Adresse zwischen 0x30 und 0x37 liegt, und bei jeder anderen Adresse direkt mit einem ADS1115 unter dieser Adresse, etwa der Standardadresse 0x49, die dieses Beispiel verwendet. Auf diesem Board liegt der ADS1115 an den Pins SDA2/SCL2 der Stiftleiste, die die Qwiic-Connectors nicht erreichen, daher läuft dieses Beispiel nicht über das Qwiic-Kabel. Verbinden Sie stattdessen den Controller 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 Änderung der Adresse.

Die Kommentare des Beispiels verbinden LMPEN mit GND oder einem GPIO-Pin. Lassen Sie LMPEN auf diesem Board unverbunden: Ein 10-kΩ-Widerstand zieht ihn bereits auf GND, und auch der ATtiny404 ist mit ihm verbunden.

Der Beispielcode​

Select Board
averagedMeasurement.ino
/**
**************************************************
*
* @file averagedMeasurement.ino
* @brief See how to use a built-in function to make an averaged measurement
*
* To successfully run the sketch:
* - 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"

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

Der Serial Monitor zeigt:

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

Danach erscheint eine Zeile, die mit Sensor reading: beginnt, mit dem Mittelwert in ppm. Fünf Messungen mit je 3 Sekunden Wartezeit danach dauern 15 Sekunden, hinzu kommt die Pause von 2,5 Sekunden, sodass etwa alle 17,5 Sekunden eine neue Zeile erscheint.

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 none

Erzeugt das Sensorobjekt. begin() entscheidet 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. Wird die Adresse weggelassen, wie in diesem Beispiel, gilt DEFAULT_ADC_ADDR, 0x49.

ReturnsKonstruktor.

Parameter

ParameterTypBeschreibung
_tsensorTypeDas Zellen-Preset. SENSOR_NH3 ist das Preset für die Zelle dieses Boards.
_adcAddruint8_tDie Adresse. Standard ist DEFAULT_ADC_ADDR (0x49). Auf diesem Board legt der ADDRESS-Schalter die Adresse der Bridge von 0x30 bis 0x37 fest.
_configPinintEin GPIO, den die Bibliothek während der Konfiguration des LMP91000 auf Low setzt, wenn die Adresse außerhalb von 0x30 bis 0x37 liegt. Wird von 0x30 bis 0x37 nicht verwendet. Standard ist -1, kein Pin.
bool begin()returns bool

Startet 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 unter dieser Adresse. Anschließend 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 die Konfiguration des analogen Frontends fehlgeschlagen ist.

double getAveragedPPM(uint8_t _numMeasurements = 5, uint8_t _secondsDelay = 2)returns double

Nimmt _numMeasurements Messwerte mit getPPM() auf, wartet nach jedem _secondsDelay Sekunden und gibt deren Mittelwert zurück. Die Funktion blockiert, bis alle Messungen abgeschlossen sind.

ReturnsDie gemittelte Konzentration in ppm.

Parameter

ParameterTypBeschreibung
_numMeasurementsuint8_tWie viele Messwerte gemittelt werden. Standard ist 5.
_secondsDelayuint8_tSekunden Wartezeit nach jedem Messwert. Standard ist 2.
double getAveragedPPB(uint8_t _numMeasurements = 5, uint8_t _secondsDelay = 2)returns double

Derselbe Mittelwert wie bei getAveragedPPM(), in Parts per Billion. Das Beispiel zeigt ihn in einem Kommentar als Alternative.

ReturnsgetAveragedPPM() multipliziert mit 1000.

Parameter

ParameterTypBeschreibung
_numMeasurementsuint8_tWie viele Messwerte gemittelt werden. Standard ist 5.
_secondsDelayuint8_tSekunden Wartezeit nach jedem Messwert. Standard ist 2.

Zusammenfassung​

Verwenden Sie die gemittelten Funktionen, wenn ein stabiler Wert wichtiger ist als ein schneller. Da sie blockieren, läuft in loop() währenddessen nichts anderes, halten Sie daher NUM_READINGS × SECS_BETWEEN_READINGS kurz, wenn Ihr Sketch weitere Aufgaben hat.