Zum Hauptinhalt springen

Zwei Sensoren auslesen

Was dieses Beispiel zeigt​

Das Beispiel twoSensors erstellt zwei Sensorobjekte, jeweils mit eigener Adresse und eigenem Konfigurationspin, und gibt alle 2,5 Sekunden von jedem einen Messwert aus: den ersten in PPM, den zweiten in PPB. Es erstellt sensorCO mit SENSOR_CO unter 0x4A mit Pin 25 und sensorNO2 mit SENSOR_NO2 unter 0x49 mit Pin 32.

Die Voreinstellungen des Beispiels gelten für Kohlenmonoxid und Stickstoffdioxid, daher sind seine Werte keine H2S-Werte. Verwenden Sie die Voreinstellung SENSOR_H2S der Bibliothek nicht unverändert: Diese Voreinstellung 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 eigenen Sensortyp mit den Einstellungen von SENSOR_H2S und 460 nA pro ppm, wie in der Kurzanleitung gezeigt.

Der Beispielcode​

Select Board
twoSensors.ino
// Include the required library
#include "Electrochemical-Gas-Sensor-SOLDERED.h"

// Create two different sensor objects
ElectrochemicalGasSensor sensorCO(SENSOR_CO, 0x4A, 25);
ElectrochemicalGasSensor sensorNO2(SENSOR_NO2, 0x49, 32);
// To see how the custom addresses are determined, check customAddress.ino

void setup()
{
Serial.begin(115200); // For debugging

// Init breakout #1
if (!sensorCO.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("CO sensor initialized successfully!");

// Init breakout #2
if (!sensorNO2.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("NO2 sensor initialized successfully!");
}

void loop()
{
// Make the reading of CO and print it
double COreading = sensorCO.getPPM();

// Print the reading with 5 digits of precision
Serial.print("CO sensor reading: ");
Serial.print(COreading, 5);
Serial.println(" PPM");

// Make the reading of NO2 and print it
double NO2reading = sensorNO2.getPPB();

// Print the reading with 5 digits of precision
Serial.print("NO2 sensor reading: ");
Serial.print(NO2reading, 5);
Serial.println(" PPB");

// Wait a bit before reading again
delay(2500);
}

Erwartetes Ergebnis:

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

Danach folgen alle 2,5 Sekunden eine Zeile CO sensor reading: in PPM und eine Zeile NO2 sensor reading: in PPB, jeweils mit fünf Nachkommastellen. Antwortet ein 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 pro Gaszelle ein Sensorobjekt, jeweils mit eigener Adresse und eigenem Konfigurationspin. 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
_tsensorTypeVoreinstellung aus der Bibliothek (SENSOR_CO, SENSOR_NO2, SENSOR_SO2, SENSOR_O3, SENSOR_NO, SENSOR_H2S, SENSOR_NH3, SENSOR_CL2) oder ein eigener sensorType. Für die Zelle dieses Boards übergeben Sie einen eigenen mit 460 nA pro ppm.
_adcAddruint8_tDie Adresse, mit der begin() kommuniziert. Dieses Beispiel übergibt 0x4A für sensorCO und 0x49 für sensorNO2.
_configPinintEin GPIO, den die Bibliothek auf High hält und auf Low zieht, während sie den LMP91000 dieses Sensors direkt konfiguriert. Wird bei Adressen von 0x30 bis 0x37 ignoriert. Dieses Beispiel übergibt 25 und 32.
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 sie, 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 sie einen ADS1115 unter dieser Adresse mit derselben Verstärkung und Datenrate, setzt den Konfigurationspin als Ausgang auf High und zieht ihn auf Low, während sie den LMP91000 konfiguriert. Rufen Sie sie einmal für jedes Sensorobjekt auf.

Returnstrue, wenn jeder Schritt erfolgreich war, andernfalls false.

double getPPM()returns double

Liest den ADC aus, subtrahiert den internen Nullpunkt des Front-Ends (2,5 V mal dessen Prozentwert), addiert die Nullpunktkalibrierung und teilt dann durch die Verstärkung des Verstärkers und durch die Empfindlichkeit der Zelle in nA pro ppm aus dem Sensortyp. Ein Ergebnis unter 0 wird als 0 zurückgegeben.

ReturnsGaskonzentration in PPM.

double getPPB()returns double

Nimmt mit getPPM() einen Messwert auf und multipliziert ihn mit 1000.

ReturnsGaskonzentration in PPB.

Zusammenfassung​

Erstellen Sie pro Gaszelle ein ElectrochemicalGasSensor-Objekt, jeweils mit eigener Adresse und eigenem Konfigurationspin, rufen Sie für jedes begin() auf und lesen Sie dann jedes mit getPPM() oder getPPB() aus.