250 lines
8.0 KiB
C++
250 lines
8.0 KiB
C++
|
||
/*
|
||
* I2C-Generator: 0.3.0
|
||
* Yaml Version: 2.1.3
|
||
* Template Version: 0.7.0-112-g190ecaa
|
||
*/
|
||
/*
|
||
* Copyright (c) 2021, Sensirion AG
|
||
* All rights reserved.
|
||
*
|
||
* Redistribution and use in source and binary forms, with or without
|
||
* modification, are permitted provided that the following conditions are met:
|
||
*
|
||
* * Redistributions of source code must retain the above copyright notice, this
|
||
* list of conditions and the following disclaimer.
|
||
*
|
||
* * Redistributions in binary form must reproduce the above copyright notice,
|
||
* this list of conditions and the following disclaimer in the documentation
|
||
* and/or other materials provided with the distribution.
|
||
*
|
||
* * Neither the name of Sensirion AG nor the names of its
|
||
* contributors may be used to endorse or promote products derived from
|
||
* this software without specific prior written permission.
|
||
*
|
||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
* POSSIBILITY OF SUCH DAMAGE.
|
||
*/
|
||
|
||
#include <Arduino.h>
|
||
#include <SensirionI2CSen5x.h>
|
||
#include <Wire.h>
|
||
|
||
// The used commands use up to 48 bytes. On some Arduino's the default buffer
|
||
// space is not large enough
|
||
#define MAXBUF_REQUIREMENT 48
|
||
|
||
#if (defined(I2C_BUFFER_LENGTH) && \
|
||
(I2C_BUFFER_LENGTH >= MAXBUF_REQUIREMENT)) || \
|
||
(defined(BUFFER_LENGTH) && BUFFER_LENGTH >= MAXBUF_REQUIREMENT)
|
||
#define USE_PRODUCT_INFO
|
||
#endif
|
||
|
||
SensirionI2CSen5x sen5x;
|
||
|
||
void printModuleVersions() {
|
||
uint16_t error;
|
||
char errorMessage[256];
|
||
|
||
unsigned char productName[32];
|
||
uint8_t productNameSize = 32;
|
||
|
||
error = sen5x.getProductName(productName, productNameSize);
|
||
|
||
if (error) {
|
||
Serial.print("Error trying to execute getProductName(): ");
|
||
errorToString(error, errorMessage, 256);
|
||
Serial.println(errorMessage);
|
||
} else {
|
||
Serial.print("ProductName:");
|
||
Serial.println((char*)productName);
|
||
}
|
||
|
||
uint8_t firmwareMajor;
|
||
uint8_t firmwareMinor;
|
||
bool firmwareDebug;
|
||
uint8_t hardwareMajor;
|
||
uint8_t hardwareMinor;
|
||
uint8_t protocolMajor;
|
||
uint8_t protocolMinor;
|
||
|
||
error = sen5x.getVersion(firmwareMajor, firmwareMinor, firmwareDebug,
|
||
hardwareMajor, hardwareMinor, protocolMajor,
|
||
protocolMinor);
|
||
if (error) {
|
||
Serial.print("Error trying to execute getVersion(): ");
|
||
errorToString(error, errorMessage, 256);
|
||
Serial.println(errorMessage);
|
||
} else {
|
||
Serial.print("Firmware: ");
|
||
Serial.print(firmwareMajor);
|
||
Serial.print(".");
|
||
Serial.print(firmwareMinor);
|
||
Serial.print(", ");
|
||
|
||
Serial.print("Hardware: ");
|
||
Serial.print(hardwareMajor);
|
||
Serial.print(".");
|
||
Serial.println(hardwareMinor);
|
||
}
|
||
}
|
||
|
||
void printSerialNumber() {
|
||
uint16_t error;
|
||
char errorMessage[256];
|
||
unsigned char serialNumber[32];
|
||
uint8_t serialNumberSize = 32;
|
||
|
||
error = sen5x.getSerialNumber(serialNumber, serialNumberSize);
|
||
if (error) {
|
||
Serial.print("Error trying to execute getSerialNumber(): ");
|
||
errorToString(error, errorMessage, 256);
|
||
Serial.println(errorMessage);
|
||
} else {
|
||
Serial.print("SerialNumber:");
|
||
Serial.println((char*)serialNumber);
|
||
}
|
||
}
|
||
|
||
void setup() {
|
||
|
||
Serial.begin(115200);
|
||
while (!Serial) {
|
||
delay(100);
|
||
}
|
||
|
||
Wire.begin();
|
||
|
||
sen5x.begin(Wire);
|
||
|
||
uint16_t error;
|
||
char errorMessage[256];
|
||
error = sen5x.deviceReset();
|
||
if (error) {
|
||
Serial.print("Error trying to execute deviceReset(): ");
|
||
errorToString(error, errorMessage, 256);
|
||
Serial.println(errorMessage);
|
||
}
|
||
|
||
// Print SEN55 module information if i2c buffers are large enough
|
||
#ifdef USE_PRODUCT_INFO
|
||
printSerialNumber();
|
||
printModuleVersions();
|
||
#endif
|
||
|
||
// set a temperature offset in degrees celsius
|
||
// Note: supported by SEN54 and SEN55 sensors
|
||
// By default, the temperature and humidity outputs from the sensor
|
||
// are compensated for the modules self-heating. If the module is
|
||
// designed into a device, the temperature compensation might need
|
||
// to be adapted to incorporate the change in thermal coupling and
|
||
// self-heating of other device components.
|
||
//
|
||
// A guide to achieve optimal performance, including references
|
||
// to mechanical design-in examples can be found in the app note
|
||
// “SEN5x – Temperature Compensation Instruction” at www.sensirion.com.
|
||
// Please refer to those application notes for further information
|
||
// on the advanced compensation settings used
|
||
// in `setTemperatureOffsetParameters`, `setWarmStartParameter` and
|
||
// `setRhtAccelerationMode`.
|
||
//
|
||
// Adjust tempOffset to account for additional temperature offsets
|
||
// exceeding the SEN module's self heating.
|
||
float tempOffset = 0.0;
|
||
error = sen5x.setTemperatureOffsetSimple(tempOffset);
|
||
if (error) {
|
||
Serial.print("Error trying to execute setTemperatureOffsetSimple(): ");
|
||
errorToString(error, errorMessage, 256);
|
||
Serial.println(errorMessage);
|
||
} else {
|
||
Serial.print("Temperature Offset set to ");
|
||
Serial.print(tempOffset);
|
||
Serial.println(" deg. Celsius (SEN54/SEN55 only");
|
||
}
|
||
|
||
// Start Measurement
|
||
error = sen5x.startMeasurement();
|
||
if (error) {
|
||
Serial.print("Error trying to execute startMeasurement(): ");
|
||
errorToString(error, errorMessage, 256);
|
||
Serial.println(errorMessage);
|
||
}
|
||
}
|
||
|
||
void loop() {
|
||
uint16_t error;
|
||
char errorMessage[256];
|
||
|
||
delay(1000);
|
||
|
||
// Read Measurement
|
||
float massConcentrationPm1p0;
|
||
float massConcentrationPm2p5;
|
||
float massConcentrationPm4p0;
|
||
float massConcentrationPm10p0;
|
||
float ambientHumidity;
|
||
float ambientTemperature;
|
||
float vocIndex;
|
||
float noxIndex;
|
||
|
||
error = sen5x.readMeasuredValues(
|
||
massConcentrationPm1p0, massConcentrationPm2p5, massConcentrationPm4p0,
|
||
massConcentrationPm10p0, ambientHumidity, ambientTemperature, vocIndex,
|
||
noxIndex);
|
||
|
||
if (error) {
|
||
Serial.print("Error trying to execute readMeasuredValues(): ");
|
||
errorToString(error, errorMessage, 256);
|
||
Serial.println(errorMessage);
|
||
} else {
|
||
Serial.print("MassConcentrationPm1p0:");
|
||
Serial.print(massConcentrationPm1p0);
|
||
Serial.print("\t");
|
||
Serial.print("MassConcentrationPm2p5:");
|
||
Serial.print(massConcentrationPm2p5);
|
||
Serial.print("\t");
|
||
Serial.print("MassConcentrationPm4p0:");
|
||
Serial.print(massConcentrationPm4p0);
|
||
Serial.print("\t");
|
||
Serial.print("MassConcentrationPm10p0:");
|
||
Serial.print(massConcentrationPm10p0);
|
||
Serial.print("\t");
|
||
Serial.print("AmbientHumidity:");
|
||
if (isnan(ambientHumidity)) {
|
||
Serial.print("n/a");
|
||
} else {
|
||
Serial.print(ambientHumidity);
|
||
}
|
||
Serial.print("\t");
|
||
Serial.print("AmbientTemperature:");
|
||
if (isnan(ambientTemperature)) {
|
||
Serial.print("n/a");
|
||
} else {
|
||
Serial.print(ambientTemperature);
|
||
}
|
||
Serial.print("\t");
|
||
Serial.print("VocIndex:");
|
||
if (isnan(vocIndex)) {
|
||
Serial.print("n/a");
|
||
} else {
|
||
Serial.print(vocIndex);
|
||
}
|
||
Serial.print("\t");
|
||
Serial.print("NoxIndex:");
|
||
if (isnan(noxIndex)) {
|
||
Serial.println("n/a");
|
||
} else {
|
||
Serial.println(noxIndex);
|
||
}
|
||
}
|
||
}
|