@@ -304,6 +304,17 @@ bool WipperSnapper_Component_I2C::initI2CDevice(
304
304
_sht4x->configureDriver (msgDeviceInitReq);
305
305
drivers.push_back (_sht4x);
306
306
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!" );
307
318
} else {
308
319
WS_DEBUG_PRINTLN (" ERROR: I2C device type not found!" )
309
320
_busStatusResponse =
@@ -360,6 +371,18 @@ void WipperSnapper_Component_I2C::updateI2CDeviceProperties(
360
371
drivers[i]->updateSensorLight (
361
372
msgDeviceUpdateReq->i2c_device_properties [j].sensor_period );
362
373
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 ;
363
386
default :
364
387
_busStatusResponse =
365
388
wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_UNSUPPORTED_SENSOR;
@@ -655,6 +678,75 @@ void WipperSnapper_Component_I2C::update() {
655
678
}
656
679
}
657
680
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 (" \t PM1.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 (" \t PM2.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 (" \t PM100: " );
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
+
658
750
// Did this driver obtain data from sensors?
659
751
if (msgi2cResponse.payload .resp_i2c_device_event .sensor_event_count == 0 )
660
752
continue ;
0 commit comments