Zum Hauptinhalt springen

Zwei Sensoren an einem Bus

Was dieses Beispiel zeigt​

Das Beispiel twoSensors der Bibliothek liest zwei Boards am selben I2C-Bus aus. Es erstellt pro Board ein Sensorobjekt, startet beide und gibt alle 2,5 Sekunden einen Messwert in ppm und einen in ppb aus.

Das Beispiel erstellt sensorCO mit SENSOR_CO auf Adresse 0x4A mit GPIO 25 als Konfigurationspin und sensorNO2 mit SENSOR_NO2 auf Adresse 0x49 mit GPIO 32. SENSOR_NH3 ist die Voreinstellung der Bibliothek für die Ammoniakzelle dieses Boards, und die Umrechnung in ppm verwendet die Empfindlichkeit der Voreinstellung. In der ausgelieferten Fassung sind die Messwerte des Beispiels daher keine Ammoniakwerte. Um Ammoniak zu messen, ändern Sie in den beiden Zeilen, die die Sensoren erstellen, SENSOR_CO und SENSOR_NO2 in SENSOR_NH3.

Die Bibliothek spricht mit der ATtiny404-Bridge des Boards, wenn die Adresse zwischen 0x30 und 0x37 liegt; bei jeder anderen Adresse, etwa 0x4A und 0x49 im Beispiel, spricht sie direkt mit einem ADS1115 unter dieser Adresse. Auf diesem Board liegt der ADS1115 an den Pins SDA2/SCL2 der Stiftleiste, die von den Qwiic-Connectors nicht erreicht werden, daher läuft dieses Beispiel nicht über Qwiic-Kabel. Verbinden Sie stattdessen den Controller mit der Stiftleiste jedes Boards: 3,3 V mit 3V3, GND mit GND, SDA mit SDA2 und SCL mit SCL2. JP2 bis JP4 legen die ADS1115-Adresse jedes Boards fest, wie in Hardware-Details beschrieben. Das Beispiel läuft dann wie geschrieben, ohne dass die Adressen geändert werden müssen.

Die Kommentare im Beispiel sagen, dass die Adressen mit Jumpern auf der Rückseite des Breakouts eingestellt und LMPEN jedes Boards mit einem GPIO-Pin verbunden werden soll. Auf diesem Board wird die Adresse mit dem ADDRESS-Schalter eingestellt, und LMPEN bleibt unverbunden: Ein 10-kΩ-Widerstand zieht LMPEN bereits auf GND, und auch der ATtiny404 ist damit verbunden.

Der Beispielcode​

Select Board
twoSensors.ino
/**
**************************************************
*
* @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 Serial Monitor zeigt:

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 zwei Zeilen: CO sensor reading: in ppm und NO2 sensor reading: in ppb, jeweils mit fünf Nachkommastellen.

Gibt ein Aufruf von begin() 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

Erstellt ein Sensorobjekt. Erstellen Sie eines pro Board, jeweils mit eigener Adresse. begin() wählt 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.

ReturnsKonstruktor.

Parameter

ParameterTypBeschreibung
_tsensorTypeDie Voreinstellung der Zelle, hier SENSOR_CO und SENSOR_NO2. SENSOR_NH3 ist die Voreinstellung für die Zelle dieses Boards.
_adcAddruint8_tEine Bridge-Adresse von 0x30 bis 0x37 oder andernfalls eine ADS1115-Adresse; hier die ADS1115-Adressen 0x4A und 0x49. Die eigene Adresse dieses Boards ist seine Bridge-Adresse, die mit dem ADDRESS-Schalter von 0x30 bis 0x37 eingestellt wird.
_configPinintEin GPIO, den die Bibliothek auf Low setzt, während sie den LMP91000 dieses Boards konfiguriert, wenn die Adresse außerhalb von 0x30 bis 0x37 liegt, hier 25 und 32. Wird von 0x30 bis 0x37 nicht verwendet.
bool begin()returns bool

Startet I2C. Bei einer Adresse von 0x30 bis 0x37 prüft es, ob die Bridge antwortet, und sendet ihr die ADC-Einstellungen aus der Voreinstellung; bei jeder anderen Adresse startet es den ADS1115 direkt unter dieser Adresse. Anschließend konfiguriert es das analoge Frontend LMP91000. Rufen Sie es für jeden Sensor einmal auf, bevor Sie Messwerte lesen.

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 getPPM()returns double

Nimmt einen Messwert von diesem Sensor auf und rechnet ihn mit der Voreinstellung des Sensors in ppm um. Ein Ergebnis unter null wird als 0 zurückgegeben.

ReturnsDie Gaskonzentration in ppm.

double getPPB()returns double

Derselbe Messwert wie bei getPPM(), in Parts per Billion.

ReturnsgetPPM() multipliziert mit 1000.

Alles zusammenfügen​

Geben Sie jedem Board eine eigene Adresse, erstellen Sie pro Board ein Sensorobjekt und rufen Sie für jedes begin() auf. Gibt eines der begin() false zurück, gibt das Beispiel einen Fehler aus und hält an.