Benutzerdefinierte Front-End-Konfiguration
Was dieses Beispiel zeigt
Das Beispiel customConfig der Bibliothek baut einen eigenen sensorType, anstatt ein Preset zu verwenden, und sendet diese Einstellungen an das analoge Front-End LMP91000 und an den ADC. Verwenden Sie es, wenn Sie die Verstärkung, die interne Nullstellung oder den Nullpunkt-Offset selbst abstimmen möchten.
Das Beispiel erstellt den Sensor mit dem eigenen SENSOR_CUSTOM und ohne Adresse, sodass die Standardadresse der Bibliothek verwendet wird. Für die Zelle dieses Boards sind die Werte des Presets SENSOR_NH3 ein Ausgangspunkt:
| Feld | Wert für SENSOR_NH3 |
|---|---|
nanoAmperesPerPPM | 40.0F |
internalZeroCalibration | 0 |
adsGain | ADS_GAIN_4_096V |
TIA_GAIN_IN_KOHMS | TIA_GAIN_35_KOHM |
RLOAD | RLOAD_10_OHM |
REF_SOURCE | REF_EXTERNAL |
INTERNAL_ZERO | INTERNAL_ZERO_20_PERCENT |
BIAS_SIGN | BIAS_SIGN_POSITIVE |
BIAS | BIAS_0_PERCENT |
FET_SHORT | FET_SHORT_DISABLED |
OP_MODE | OP_MODE_3LEAD_AMP_CELL |
Die eigenen Werte des Beispiels (100 nA pro ppm, eine Verstärkung von 120 kΩ, negatives Vorzeichen der Vorspannung) sind ein Muster und gehören nicht zu dieser Zelle.
Die Bibliothek kommuniziert mit der ATtiny404-Bridge des Boards nur, wenn die Adresse im Bereich von 0x30 bis 0x37 liegt. Jede andere Adresse, etwa die Standardadresse 0x49, die dieses Beispiel verwendet, wird als I2C-Adresse eines ADS1115 aufgefasst, mit dem die Bibliothek direkt kommuniziert. 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 dass die Adresse geändert werden muss.
Die Kommentare des Beispiels verbinden LMPEN mit einem GPIO-Pin. Lassen Sie LMPEN auf diesem Board unverbunden: Ein 10-kΩ-Widerstand zieht ihn bereits auf GND, und auch der ATtiny404 ist damit verbunden.
Der Beispielcode
/**
**************************************************
*
* @file customConfig.ino
* @brief Create a custom config for the LMP91000 and upload it to the device.
* This enables you to use this breakout with any electrochemical sensor.
*
* To successfully run the sketch:
* - Edit the custom configuration
* - Connect LMPEN to any GPIO pin
* - Run the sketch and open serial monitor at 115200 baud!
*
* @authors Robert @ soldered.com
***************************************************/
// Include the required library
#include "Electrochemical-Gas-Sensor-SOLDERED.h"
/**
* Here are parameters to configure for the custom sensor:
*
* nanoAmperesPerPPM: From the datasheet of the particular electrochemical
* sensor, used in the calculation of PPM/PPB
*
* internalZeroCalibration: A fixed value which is summed to the voltage
* measured by the ADS. The value here should make the reading be
* just barely 0 PPM when the sensor is in a place with none of the target gas
*
* adsGain: The gain of the ADS
* The voltage here represents the max range which it can measure
* ADS_GAIN_6_144V 6.144 V
* ADS_GAIN_4_096V 4.096 V
* ADS_GAIN_2_048V 2.048 V
* ADS_GAIN_1_024V 1.024 V
* ADS_GAIN_0_512V 0.512 V
* ADS_GAIN_0_256V 0.256 V
*
* TIA_GAIN_IN_KOHMS: The gain of the amplifier
* This increases the sensitivity of the measurement
* TIA_GAIN_EXTERNAL External resistance
* TIA_GAIN_2_75_KOHM 2.75 kOhm
* TIA_GAIN_3_5_KOHM 3.5 kOhm
* TIA_GAIN_7_KOHM 7 kOhm
* TIA_GAIN_14_KOHM 14 kOhm
* TIA_GAIN_35_KOHM 35 kOhm
* TIA_GAIN_120_KOHM 120 kOhm
* TIA_GAIN_350_KOHM 350 kOhm
*
* RLOAD: The load resistor in the LMP91000
* Specified in the electrochemical sensor's datasheet
* RLOAD_10_OHM 10 Ohm
* RLOAD_33_OHM 33 Ohm
* RLOAD_50_OHM 50 Ohm
* RLOAD_100_OHM 100 Ohm
*
* REF_SOURCE: Source of the control voltage reference
* For our breakout, use external, there's a 2.5V external
* reference voltage
* REF_INTERNAL Internal
* REF_EXTERNAL External
*
* INTERNAL_ZERO: Internal zero selection
* If the electrochemical sensor has a positive polarity, you
* would usually want to use 20% for the most headroom in the signal
* INTERNAL_ZERO_20_PERCENT 20%
* INTERNAL_ZERO_50_PERCENT 50%
* INTERNAL_ZERO_67_PERCENT 67%
* INTERNAL_ZERO_BYPASSED Internal zero bypassed
*
* BIAS_SIGN: The polarity of the bias voltage
* BIAS_SIGN_NEGATIVE Negative
* BIAS_SIGN_POSITIVE Positive
*
* BIAS: Added bias, percentage of the reference voltage
* Most sensors don't require this, check each sensor's datasheet
* BIAS_0_PERCENT 0%
* BIAS_1_PERCENT 1%
* BIAS_2_PERCENT 2%
* BIAS_4_PERCENT 4%
* BIAS_6_PERCENT 6%
* ...
* BIAS_22_PERCENT 22%
* BIAS_24_PERCENT 24%
*
* FET_SHORT: Short the FET
* Used to perserve the electrochemical sensor
* Has to be disabled for the sensor to be operable
* FET_SHORT_DISABLED Disabled
* FET_SHORT_ENABLED Enabled
*
* OP_MODE: Mode of operation
* OP_MODE_DEEP_SLEEP Deep Sleep (default)
* OP_MODE_2LEAD_GROUND_CELL 2-lead ground referred galvanic cell
* OP_MODE_STANDBY Standby
* OP_MODE_3LEAD_AMP_CELL 3-lead amperometric cell
* OP_MODE_TEMPERATURE_TIA_OFF Temperature measurement (TIA Off)
* OP_MODE_TEMPERATURE_TIA_ON Temperature measurement (TIA On)
*
* For more details, check thge LMP91000 datasheet, chapter 7.6
*/
// Here is an example of a custom configuration:
const sensorType SENSOR_CUSTOM = {
100.0F, // nanoAmperesPerPPM
0, // internalZeroCalibration
ADS_GAIN_4_096V, // adsGain
TIA_GAIN_120_KOHM, // TIA_GAIN_IN_KOHMS
RLOAD_10_OHM, // RLOAD
REF_EXTERNAL, // REF_SOURCE
INTERNAL_ZERO_20_PERCENT, // INTERNAL_ZERO
BIAS_SIGN_NEGATIVE, // BIAS_SIGN
BIAS_0_PERCENT, // BIAS
FET_SHORT_DISABLED, // FET_SHORT
OP_MODE_3LEAD_AMP_CELL, // OP_MODE
};
// Create the sensor object with the custom type
ElectrochemicalGasSensor sensor(SENSOR_CUSTOM);
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 reading
double reading = sensor.getPPM();
// Print the reading with 5 digits of precision
Serial.println("Sensor reading: ");
Serial.print(reading, 5);
Serial.println(" PPM");
// Wait a bit before reading again
delay(2500);
}
Der Serial Monitor zeigt:
Sensor initialized successfully!
Danach gibt das Beispiel alle 2,5 Sekunden Sensor reading: in einer eigenen Zeile aus, gefolgt vom Wert und PPM in der nächsten Zeile.
Wenn begin() false zurückgibt, 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 noneErstellt das Sensorobjekt mit einem beliebigen sensorType, einem Preset oder Ihrem eigenen. 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
| Parameter | Typ | Beschreibung |
|---|---|---|
_t | sensorType | Ihre Konfiguration, hier SENSOR_CUSTOM. |
_adcAddr | uint8_t | Die Adresse. Standard ist DEFAULT_ADC_ADDR (0x49). Auf diesem Board stellt der ADDRESS-Schalter die Adresse der Bridge von 0x30 bis 0x37 ein. |
_configPin | int | Ein GPIO, den die Bibliothek auf LOW setzt, während sie den LMP91000 konfiguriert, 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 boolStartet I2C, richtet den ADC mit der Verstärkung aus Ihrem sensorType ein (über die Bridge bei einer Adresse von 0x30 bis 0x37 oder direkt über den ADS1115 bei jeder anderen Adresse) und schreibt die drei LMP91000-Registerwerte, die aus Ihrem sensorType gebildet werden.
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 Front-Ends fehlgeschlagen ist.
double getPPM()returns doubleNimmt eine Messung vor und rechnet sie mit der Verstärkung, der internen Nullstellung, dem Offset und der Empfindlichkeit Ihrer Konfiguration in ppm um. Ein Ergebnis unter null wird als 0 zurückgegeben.
ReturnsDie Gaskonzentration in ppm.
Zusammenfassung
begin() packt Ihren sensorType in die drei Einstellungsregister des LMP91000 und schreibt sie, und getPPM() verwendet dieselben Felder für die Umrechnung. Ändern Sie jeweils nur ein Feld und vergleichen Sie mit dem Preset SENSOR_NH3, um zu sehen, was jedes Feld bewirkt.