SPS30 library

Dependents:   IZU2021_SPS30 Hybrid_IZU2021_MISSION_v2 Hybrid_IZU2021_MISSION

Revision:
2:549bee9a4cd0
Parent:
0:9221dac25d3b
Child:
4:7558ddc3c7d6
--- a/sps30.cpp	Tue Mar 05 03:05:33 2019 +0000
+++ b/sps30.cpp	Tue Mar 05 07:01:55 2019 +0000
@@ -15,10 +15,10 @@
 }
 
 //-----------------------------------------------------------------------------
-// start auto-measurement with barometer reading (in mB)
+// start auto-measurement 
 //
 
-uint8_t sps30::startMeasurement()   // done
+uint8_t sps30::startMeasurement() 
 {
     i2cBuff[0] = SPS30_CMMD_STRT_MEAS >> 8;
     i2cBuff[1] = SPS30_CMMD_STRT_MEAS & 255;
@@ -33,7 +33,7 @@
 //-----------------------------------------------------------------------------
 // Stop auto-measurement
 
-uint8_t sps30::stopMeasurement()    // done
+uint8_t sps30::stopMeasurement()
 {
     i2cBuff[0] = SPS30_CMMD_STOP_MEAS >> 8;
     i2cBuff[1] = SPS30_CMMD_STOP_MEAS & 255;
@@ -45,7 +45,7 @@
 //-----------------------------------------------------------------------------
 // Get ready status value
 
-uint8_t sps30::getReadyStatus() // done
+uint8_t sps30::getReadyStatus()
 {
     i2cBuff[0] = SPS30_CMMD_GET_READY_STAT >> 8;
     i2cBuff[1] = SPS30_CMMD_GET_READY_STAT & 255;
@@ -65,7 +65,7 @@
 //-----------------------------------------------------------------------------
 // Get all the measurement values, stick them into the array
 
-uint8_t sps30::readMeasurement()    // editing
+uint8_t sps30::readMeasurement()   
 {
     i2cBuff[0] = SPS30_CMMD_READ_MEAS >> 8;
     i2cBuff[1] = SPS30_CMMD_READ_MEAS & 255;
@@ -74,7 +74,6 @@
     
     _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, 60, false);
     
-    /* TO DO: update the members used in the class */
     uint16_t stat = (i2cBuff[0] << 8) | i2cBuff[1];
     mass_1p0_m = stat;
     uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[2]);
@@ -315,6 +314,85 @@
 }
 
 //-----------------------------------------------------------------------------
+// Read Auto Cleaning Interval on the SPS30
+
+uint8_t sps30::readAutoCleanInterval()
+{   
+    i2cBuff[0] = SPS30_CMMD_AUTO_CLEAN_INTV >> 8;
+    i2cBuff[1] = SPS30_CMMD_AUTO_CLEAN_INTV & 255;
+    
+    int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
+    if(res) return SPSnoAckERROR;
+    
+    _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, 6, false);
+    
+    uint16_t stat = (i2cBuff[0] << 8) | i2cBuff[1];
+    clean_interval_m = stat;
+    uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[2]);
+    if(dat == SPScrcERROR) return SPScrcERROR;
+    
+    stat = (i2cBuff[3] << 8) | i2cBuff[4];
+    clean_interval_l = stat;
+    dat = sps30::checkCrc2b(stat, i2cBuff[5]);
+    if(dat == SPScrcERROR) return SPScrcERROR;
+    
+    clean_interval_i = (clean_interval_m << 16) | clean_interval_l;
+    
+    return SPSnoERROR;
+}
+
+//-----------------------------------------------------------------------------
+// Set Auto Cleaning Interval on the SPS30
+
+uint8_t sps30::setAutoCleanInterval(uint32_t set_interval)
+{
+    uint16_t set_interval_m = set_interval >> 16;
+    uint16_t set_interval_l = set_interval & 65535;
+    
+    i2cBuff[0] = SPS30_CMMD_AUTO_CLEAN_INTV >> 8;
+    i2cBuff[1] = SPS30_CMMD_AUTO_CLEAN_INTV & 255;
+    
+    i2cBuff[2] = set_interval_m >> 8;
+    i2cBuff[3] = set_interval_m & 255;
+    i2cBuff[4] = sps30::calcCrc2b(set_interval_m);
+    
+    i2cBuff[5] = set_interval_l >> 8;
+    i2cBuff[6] = set_interval_l & 255;
+    i2cBuff[7] = sps30::calcCrc2b(set_interval_l);
+    
+    int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 8, false);
+    if(res) return SPSnoAckERROR;
+    
+    _i2c.read(SPS30_I2C_ADDR | 1, i2cBuff, 6, false);
+    
+    uint16_t stat = (i2cBuff[0] << 8) | i2cBuff[1];
+    clean_interval_m = stat;
+    uint8_t dat = sps30::checkCrc2b(stat, i2cBuff[2]);
+    if(dat == SPScrcERROR) return SPScrcERROR;
+    
+    stat = (i2cBuff[3] << 8) | i2cBuff[4];
+    clean_interval_l = stat;
+    dat = sps30::checkCrc2b(stat, i2cBuff[5]);
+    if(dat == SPScrcERROR) return SPScrcERROR;
+    
+    clean_interval_i = (clean_interval_m << 16) | clean_interval_l;
+    
+    return SPSnoERROR;
+}
+
+//-----------------------------------------------------------------------------
+// Perform manual fan cleaning
+
+uint8_t sps30::startFanClean()
+{
+    i2cBuff[0] = SPS30_CMMD_START_FAN_CLEAN >> 8;
+    i2cBuff[1] = SPS30_CMMD_START_FAN_CLEAN & 255;
+    int res = _i2c.write(SPS30_I2C_ADDR, i2cBuff, 2, false);
+    if(res) return SPSnoAckERROR;
+    return SPSnoERROR;
+}
+
+//-----------------------------------------------------------------------------
 // Perform a soft reset on the SPS30
 
 uint8_t sps30::softReset()