Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add sensor types for gas resistance and unitless percentage #50

Merged
merged 3 commits into from
Mar 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Adafruit_Sensor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,12 @@ void Adafruit_Sensor::printSensorDetails(void) {
case SENSOR_TYPE_PM100_ENV:
Serial.print(F("Environmental Particulate Matter 100 (ppm)"));
break;
case SENSOR_TYPE_GAS_RESISTANCE:
Serial.print(F("Gas Resistance (ohms)"));
break;
case SENSOR_TYPE_UNITLESS_PERCENT:
Serial.print(F("Unitless Percent (%)"));
break;
}

Serial.println();
Expand Down
15 changes: 10 additions & 5 deletions Adafruit_Sensor.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,9 @@ typedef enum {
SENSOR_TYPE_PM100_STD = (25),
SENSOR_TYPE_PM10_ENV = (26),
SENSOR_TYPE_PM25_ENV = (27),
SENSOR_TYPE_PM100_ENV = (28)
SENSOR_TYPE_PM100_ENV = (28),
SENSOR_TYPE_GAS_RESISTANCE = (29),
SENSOR_TYPE_UNITLESS_PERCENT = (30)
} sensors_type_t;

/** struct sensors_vec_s is used to return a vector in a common format. */
Expand Down Expand Up @@ -131,7 +133,7 @@ typedef struct {
int32_t reserved0; /**< reserved */
int32_t timestamp; /**< time is in milliseconds */
union {
float data[4]; ///< Raw data
float data[4]; ///< Raw data */
sensors_vec_t acceleration; /**< acceleration values are in meter per second
per second (m/s^2) */
sensors_vec_t
Expand Down Expand Up @@ -163,10 +165,13 @@ typedef struct {
million (ppm) */
float pm25_env; /**< Environmental Particulate Matter 2.5 in parts per
million (ppm) */
float pm100_env; /**< EnvironmentalParticulate Matter 100 in parts per
float pm100_env; /**< Environmental Particulate Matter 100 in parts per
million (ppm) */
sensors_color_t color; /**< color in RGB component values */
}; ///< Union for the wide ranges of data we can carry
float gas_resistance; /**< Proportional to the amount of VOC particles in
the air (Ohms) */
float unitless_percent; /**<Percentage, unit-less (%) */
sensors_color_t color; /**< color in RGB component values */
}; ///< Union for the wide ranges of data we can carry
} sensors_event_t;

/* Sensor details (40 bytes) */
Expand Down
28 changes: 17 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,9 @@ typedef enum
SENSOR_TYPE_PM100_STD = (25),
SENSOR_TYPE_PM10_ENV = (26),
SENSOR_TYPE_PM25_ENV = (27),
SENSOR_TYPE_PM100_ENV = (28)
SENSOR_TYPE_PM100_ENV = (28),
SENSOR_TYPE_GAS_RESISTANCE = (29),
SENSOR_TYPE_UNITLESS_PERCENT = (30)
} sensors_type_t;
```

Expand Down Expand Up @@ -159,6 +161,8 @@ typedef struct
float pm10_env,
float pm25_env,
float pm100_env,
float gas_resistance,
float unitless_percent,
sensors_color_t color;
};
} sensors_event_t;
Expand Down Expand Up @@ -187,7 +191,7 @@ Calling this function will provide some basic information about the sensor (the

## Standardised SI values for `sensors_event_t`

A key part of the abstraction layer is the standardisation of values on SI units of a particular scale, which is accomplished via the data[4] union in sensors\_event\_t above. This 16 byte union includes fields for each main sensor type, and uses the following SI units and scales:
A key part of the abstraction layer is the standardization of values on SI units of a particular scale, which is accomplished via the data[4] union in sensors\_event\_t above. This 16 byte union includes fields for each main sensor type, and uses the following SI units and scales:

- **acceleration**: values are in **meter per second per second** (m/s^2)
- **magnetic**: values are in **micro-Tesla** (uT)
Expand All @@ -204,20 +208,22 @@ A key part of the abstraction layer is the standardisation of values on SI units
- **tvoc**: values are in **parts per billion** (ppb)
- **voc_index**: values are an **index** from 1-500 with 100 being normal
- **nox_index**: values are an **index** from 1-500 with 100 being normal
- **CO2**: values are in **parts per million*** (ppm)
- **eCO2**: values are in **parts per million*** (ppm)
- **pm10_std**: values are in **parts per million*** (ppm)
- **pm25_std**: values are in **parts per million*** (ppm)
- **pm100_std**: values are in **parts per million*** (ppm)
- **pm10_env**: values are in **parts per million*** (ppm)
- **pm25_env**: values are in **parts per million*** (ppm)
- **pm100_env**: values are in **parts per million*** (ppm)
- **CO2**: values are in **parts per million** (ppm)
- **eCO2**: values are in **parts per million** (ppm)
- **pm10_std**: values are in **parts per million** (ppm)
- **pm25_std**: values are in **parts per million** (ppm)
- **pm100_std**: values are in **parts per million** (ppm)
- **pm10_env**: values are in **parts per million** (ppm)
- **pm25_env**: values are in **parts per million** (ppm)
- **pm100_env**: values are in **parts per million** (ppm)
- **gas_resistance**: values are in **ohms**
- **unitless_percent**: values are in **%**

## The Unified Driver Abstraction Layer in Practice ##

Using the unified sensor abstraction layer is relatively easy once a compliant driver has been created.

Every compliant sensor can now be read using a single, well-known 'type' (sensors\_event\_t), and there is a standardised way of interrogating a sensor about its specific capabilities (via sensor\_t).
Every compliant sensor can now be read using a single, well-known 'type' (sensors\_event\_t), and there is a standardized way of interrogating a sensor about its specific capabilities (via sensor\_t).

An example of reading the [TSL2561](https://github.com/adafruit/Adafruit_TSL2561) light sensor can be seen below:

Expand Down