Zwei Sensoren
Was dieses Beispiel zeigt
Das Beispiel twoSensors der Bibliothek erstellt zwei Sensorobjekte mit jeweils eigener Voreinstellung, Adresse und eigenem Pin, startet beide und gibt alle 2,5 s den Messwert des ersten in ppm und den des zweiten in ppb aus.
Die Sensoren des Beispiels verwenden SENSOR_CO (bei 0x4A, Pin 25) und SENSOR_NO2
(bei 0x49, Pin 32). Die Bibliothek berechnet jeden Messwert aus der Empfindlichkeit
und den Verstärkungseinstellungen der jeweiligen Voreinstellung; die Voreinstellung für die Chlorzelle dieses Boards ist
SENSOR_CL2.
Der Beispielcode
/**
**************************************************
*
* @file twoSensors.ino
* @brief See how to init two sensors and make two readings of PPM of gas.
*
* To successfully run the sketch:
* - Set different addresses using the jumpers on the back of the breakout
* - Connect LMPEN pins to a GPIO pin so the breakouts 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"
// 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);
}
Der Kommentar im Kopf verlangt unterschiedliche Adressen, die mit Jumpern auf der Rückseite eingestellt werden,
und dass die LMPEN-Pins mit GPIOs verbunden werden. Bei diesem Board befinden sich alle Jumper auf der Oberseite, und keiner von ihnen legt die Adresse des Boards fest. Ein 10-kΩ-Widerstand
hält LMPEN auf Low, während es mit dem ATtiny404 verbunden ist, daher lassen Sie es
unverbunden (siehe
Hardware-Details).
Erwartetes Ergebnis:
CO sensor initialized successfully!
NO2 sensor initialized successfully!
Danach folgen alle 2,5 s zwei Zeilen: CO sensor reading: mit dem Wert des ersten Sensors
in ppm mit fünf Nachkommastellen und PPM, sowie NO2 sensor reading: mit dem Wert des zweiten
Sensors in ppb mit fünf Nachkommastellen und PPB. Schlägt eines der beiden begin() fehl,
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 ElectrochemicalGasSensorErstellt ein Sensorobjekt. Es speichert nur die Einstellungen; bis zum Aufruf von begin() wird nichts an das Board gesendet. Das Beispiel erstellt zwei davon.
ReturnsDas Sensorobjekt.
Parameter
| Typ | Name | Beschreibung |
|---|---|---|
sensorType | _t | Die Zellen-Voreinstellung. Das Beispiel übergibt SENSOR_CO und SENSOR_NO2; die SGX-4CL2-Zelle dieses Boards hat die Voreinstellung SENSOR_CL2. |
uint8_t | _adcAddr | Die I2C-Adresse, DEFAULT_ADC_ADDR (0x49), wenn sie weggelassen wird; das Beispiel übergibt 0x4A und 0x49. Bei einer Adresse von 0x30 bis 0x37, dem Bereich des ADDRESS-Schalters dieses Boards, kommuniziert begin() mit dem ATtiny404 des Boards; bei jeder anderen Adresse sucht es an dieser Adresse nach einem ADS1115 und direkt am Bus nach dem LMP91000. |
int | _configPin | Ein GPIO, den begin() auf Low setzt, während es den LMP91000 direkt konfiguriert; das Beispiel übergibt 25 und 32. -1 (keiner), wenn er weggelassen wird. Bei den Adressen 0x30 bis 0x37 ohne Wirkung. |
bool begin()returns boolStartet Wire, prüft, ob das Board antwortet, stellt die ADC-Verstärkung und die Datenrate der Voreinstellung ein und konfiguriert den LMP91000 mit den Einstellungen der Voreinstellung. Das Beispiel ruft es in setup() einmal für jedes Sensorobjekt auf.
Returnstrue, wenn das Board geantwortet hat und beide Konfigurationsschritte erfolgreich waren, andernfalls false.
double getPPM()returns doubleFührt eine Messung durch und rechnet sie in ppm um: Sie zieht die interne Nullspannung ab (die 2,5-V-Referenz mal den internen Nullprozentwert der Voreinstellung), addiert die Nullpunktkalibrierung, teilt durch die Verstärkung des Verstärkers und durch die Empfindlichkeit der Voreinstellung in nA pro ppm. Ein Ergebnis unter null wird als 0 zurückgegeben.
ReturnsDie Gaskonzentration in ppm.
double getPPB()returns doubleGleiche Messung wie getPPM(), mal 1000. Das Beispiel liest damit den zweiten Sensor aus.
ReturnsDie Gaskonzentration in ppb.
Das Beispiel verwendet außerdem Serial und delay(), die zum Arduino-Core gehören,
nicht zu dieser Bibliothek.
Zusammenspiel
Jedes Sensorobjekt behält seine eigene Voreinstellung, Adresse und seinen eigenen Pin, daher liest die Schleife die Sensoren nacheinander mit denselben Funktionen aus. Jedes Objekt benötigt eine eigene Adresse.