Skip to content

Commit 678c85f

Browse files
authored
Merge pull request #297 from brentru/add-pm25aqi
Add support for Adafruit PMSA003I Air Quality Breakout
2 parents a54f61f + 9af30a6 commit 678c85f

File tree

6 files changed

+509
-3
lines changed

6 files changed

+509
-3
lines changed

library.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
name=Adafruit WipperSnapper
2-
version=1.0.0-beta.43
2+
version=1.0.0-beta.44
33
author=Adafruit
44
maintainer=Adafruit <adafruitio@adafruit.com>
55
sentence=Arduino client for Adafruit.io WipperSnapper
66
paragraph=Arduino client for Adafruit.io WipperSnapper
77
category=Communication
88
url=https://github.com/adafruit/Adafruit_IO_Arduino
99
architectures=*
10-
depends=Adafruit NeoPixel, Adafruit SPIFlash, ArduinoJson, Adafruit DotStar, Adafruit SleepyDog Library, Adafruit TinyUSB Library, Adafruit AHTX0, Adafruit BME280 Library, Adafruit DPS310, Adafruit SCD30, Sensirion I2C SCD4x, Adafruit MCP9808 Library, Adafruit MCP9600 Library, Adafruit TSL2591 Library, Adafruit SHT4x Library
10+
depends=Adafruit NeoPixel, Adafruit SPIFlash, ArduinoJson, Adafruit DotStar, Adafruit SleepyDog Library, Adafruit TinyUSB Library, Adafruit AHTX0, Adafruit BME280 Library, Adafruit DPS310, Adafruit SCD30, Sensirion I2C SCD4x, Adafruit MCP9808 Library, Adafruit MCP9600 Library, Adafruit TSL2591 Library, Adafruit SHT4x Library, Adafruit PM25 AQI Sensor

src/Wippersnapper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
#endif
6161

6262
#define WS_VERSION \
63-
"1.0.0-beta.43" ///< WipperSnapper app. version (semver-formatted)
63+
"1.0.0-beta.44" ///< WipperSnapper app. version (semver-formatted)
6464

6565
// Reserved Adafruit IO MQTT topics
6666
#define TOPIC_IO_THROTTLE "/throttle" ///< Adafruit IO Throttle MQTT Topic

src/components/i2c/WipperSnapper_I2C.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,17 @@ bool WipperSnapper_Component_I2C::initI2CDevice(
304304
_sht4x->configureDriver(msgDeviceInitReq);
305305
drivers.push_back(_sht4x);
306306
WS_DEBUG_PRINTLN("SHT4X Initialized Successfully!");
307+
} else if (strcmp("pmsa003i", msgDeviceInitReq->i2c_device_name) == 0) {
308+
_pm25 = new WipperSnapper_I2C_Driver_PM25(this->_i2c, i2cAddress);
309+
if (!_pm25->begin()) {
310+
WS_DEBUG_PRINTLN("ERROR: Failed to initialize PM2.5 AQI Sensor!");
311+
_busStatusResponse =
312+
wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_DEVICE_INIT_FAIL;
313+
return false;
314+
}
315+
_pm25->configureDriver(msgDeviceInitReq);
316+
drivers.push_back(_pm25);
317+
WS_DEBUG_PRINTLN("PM2.5 AQI Sensor Initialized Successfully!");
307318
} else {
308319
WS_DEBUG_PRINTLN("ERROR: I2C device type not found!")
309320
_busStatusResponse =
@@ -360,6 +371,18 @@ void WipperSnapper_Component_I2C::updateI2CDeviceProperties(
360371
drivers[i]->updateSensorLight(
361372
msgDeviceUpdateReq->i2c_device_properties[j].sensor_period);
362373
break;
374+
case wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM10_STD:
375+
drivers[i]->updateSensorPM10_STD(
376+
msgDeviceUpdateReq->i2c_device_properties[j].sensor_period);
377+
break;
378+
case wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM25_STD:
379+
drivers[i]->updateSensorPM25_STD(
380+
msgDeviceUpdateReq->i2c_device_properties[j].sensor_period);
381+
break;
382+
case wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM100_STD:
383+
drivers[i]->updateSensorPM100_STD(
384+
msgDeviceUpdateReq->i2c_device_properties[j].sensor_period);
385+
break;
363386
default:
364387
_busStatusResponse =
365388
wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_UNSUPPORTED_SENSOR;
@@ -655,6 +678,75 @@ void WipperSnapper_Component_I2C::update() {
655678
}
656679
}
657680

681+
// PM10_STD sensor
682+
curTime = millis();
683+
if ((*iter)->sensorPM10_STDPeriod() != 0L &&
684+
curTime - (*iter)->SensorPM10_STDPeriodPrv() >
685+
(*iter)->sensorPM10_STDPeriod()) {
686+
if ((*iter)->getEventPM10_STD(&event)) {
687+
WS_DEBUG_PRINT("Sensor 0x");
688+
WS_DEBUG_PRINTHEX((*iter)->getI2CAddress());
689+
WS_DEBUG_PRINTLN("");
690+
WS_DEBUG_PRINT("\tPM1.0: ");
691+
WS_DEBUG_PRINT(event.data[0]);
692+
WS_DEBUG_PRINTLN(" ppm");
693+
694+
// pack event data into msg
695+
fillEventMessage(&msgi2cResponse, event.data[0],
696+
wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM10_STD);
697+
698+
(*iter)->setSensorPM10_STDPeriodPrv(curTime);
699+
} else {
700+
WS_DEBUG_PRINTLN("ERROR: Failed to get PM1.0 sensor reading!");
701+
}
702+
}
703+
704+
// PM25_STD sensor
705+
curTime = millis();
706+
if ((*iter)->sensorPM25_STDPeriod() != 0L &&
707+
curTime - (*iter)->SensorPM25_STDPeriodPrv() >
708+
(*iter)->sensorPM25_STDPeriod()) {
709+
if ((*iter)->getEventPM25_STD(&event)) {
710+
WS_DEBUG_PRINT("Sensor 0x");
711+
WS_DEBUG_PRINTHEX((*iter)->getI2CAddress());
712+
WS_DEBUG_PRINTLN("");
713+
WS_DEBUG_PRINT("\tPM2.5: ");
714+
WS_DEBUG_PRINT(event.data[0]);
715+
WS_DEBUG_PRINTLN(" ppm");
716+
717+
// pack event data into msg
718+
fillEventMessage(&msgi2cResponse, event.data[0],
719+
wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM25_STD);
720+
721+
(*iter)->setSensorPM25_STDPeriodPrv(curTime);
722+
} else {
723+
WS_DEBUG_PRINTLN("ERROR: Failed to get PM2.5 sensor reading!");
724+
}
725+
}
726+
727+
// PM100_STD sensor
728+
curTime = millis();
729+
if ((*iter)->sensorPM100_STDPeriod() != 0L &&
730+
curTime - (*iter)->SensorPM100_STDPeriodPrv() >
731+
(*iter)->sensorPM100_STDPeriod()) {
732+
if ((*iter)->getEventPM100_STD(&event)) {
733+
WS_DEBUG_PRINT("Sensor 0x");
734+
WS_DEBUG_PRINTHEX((*iter)->getI2CAddress());
735+
WS_DEBUG_PRINTLN("");
736+
WS_DEBUG_PRINT("\tPM100: ");
737+
WS_DEBUG_PRINT(event.data[0]);
738+
WS_DEBUG_PRINTLN(" ppm");
739+
740+
// pack event data into msg
741+
fillEventMessage(&msgi2cResponse, event.data[0],
742+
wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_PM100_STD);
743+
744+
(*iter)->setSensorPM100_STDPeriodPrv(curTime);
745+
} else {
746+
WS_DEBUG_PRINTLN("ERROR: Failed to get PM10.0 sensor reading!");
747+
}
748+
}
749+
658750
// Did this driver obtain data from sensors?
659751
if (msgi2cResponse.payload.resp_i2c_device_event.sensor_event_count == 0)
660752
continue;

src/components/i2c/WipperSnapper_I2C.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "drivers/WipperSnapper_I2C_Driver_DPS310.h"
2626
#include "drivers/WipperSnapper_I2C_Driver_MCP9601.h"
2727
#include "drivers/WipperSnapper_I2C_Driver_MCP9808.h"
28+
#include "drivers/WipperSnapper_I2C_Driver_PM25.h"
2829
#include "drivers/WipperSnapper_I2C_Driver_SCD30.h"
2930
#include "drivers/WipperSnapper_I2C_Driver_SCD40.h"
3031
#include "drivers/WipperSnapper_I2C_Driver_SHT4X.h"
@@ -81,6 +82,7 @@ class WipperSnapper_Component_I2C {
8182
WipperSnapper_I2C_Driver_MCP9601 *_mcp9601 = nullptr;
8283
WipperSnapper_I2C_Driver_TSL2591 *_tsl2591 = nullptr;
8384
WipperSnapper_I2C_Driver_SCD40 *_scd40 = nullptr;
85+
WipperSnapper_I2C_Driver_PM25 *_pm25 = nullptr;
8486
WipperSnapper_I2C_Driver_SHT4X *_sht4x = nullptr;
8587
};
8688
extern Wippersnapper WS;

0 commit comments

Comments
 (0)