Forum >SEN0460 all received data is zeros
TroubleshootingGravity

SEN0460 all received data is zeros

userHead kany.hsu 2024-12-27 09:17:44 285 Views2 Replies

I use Arduino Uno and the code provided by the tutorial. (https://wiki.dfrobot.com/Gravity_PM2.5_Air_Quality_Sensor_SKU_SEN0460)


But all the received data are zeros like below.

image.png

Could you help me figuring out how to handle this scene?
 

#############################################################

main code

#############################################################

 

#include "DFRobot_AirQualitySensor.h"


 

#define I2C_ADDRESS    0x19

  DFRobot_AirQualitySensor particle(&Wire ,I2C_ADDRESS);


 

void setup() {

  Serial.begin(115200);

/**

  Sensor initialization is used to initialize IIC, which is determined by the communication mode used at this time.

*/

  while(!particle.begin())

  {

    Serial.println("NO Deivces !");

    delay(1000);

  }

  Serial.println("sensor begin success!");

  delay(1000);

/**

  Get sensor version number

*/

  uint8_t version = particle.gainVersion();

  Serial.print("version is : ");

  Serial.println(version);

  delay(1000);

}


 

void loop() {

/**

 *@brief : Get concentration of PM1.0

 *@param :PARTICLE_PM1_0_STANDARD  Standard particle

          PARTICLE_PM2_5_STANDARD  Standard particle

          PARTICLE_PM10_STANDARD   Standard particle  

          PARTICLE_PM1_0_ATMOSPHERE  In atmospheric environment

          PARTICLE_PM2_5_ATMOSPHERE  In atmospheric environment

          PARTICLE_PM10_ATMOSPHERE   In atmospheric environment

*/  

  uint16_t PM2_5 = particle.gainParticleConcentration_ugm3(PARTICLE_PM2_5_ATMOSPHERE );

  uint16_t PM1_0 = particle.gainParticleConcentration_ugm3(PARTICLE_PM1_0_ATMOSPHERE );

  uint16_t PM10 = particle.gainParticleConcentration_ugm3(PARTICLE_PM10_ATMOSPHERE);

  Serial.print("PM2.5 concentration:");

  Serial.print(PM2_5);

  Serial.println(" ug/m3");

  Serial.print("PM1.0 concentration:");

  Serial.print(PM1_0);

  Serial.println(" ug/m3");

  Serial.print("PM10 concentration:");

  Serial.print(PM10);

  Serial.println(" ug/m3");

  Serial.println();

  delay(1000);

}


##############################################################

/*!

 * @file DFRobot_AirQualitySensor.cpp

 * @brief The sensor can obtain concentration of some PM in the air.

 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)

 * @license     The MIT License (MIT)

 * @author      PengKaixing(kaixing.peng@dfrobot.com)

 * @version  V1.0.0

 * @date  2020-11-23

 * @url https://github.com/dfrobot/DFRobot_AirQualitySensor

 */

#include "DFRobot_AirQualitySensor.h"


 

DFRobot_AirQualitySensor::DFRobot_AirQualitySensor(TwoWire *pWire, uint8_t addr)

{

  _pWire = pWire;

  this->_I2C_addr = addr;

}


 

bool DFRobot_AirQualitySensor::begin(void)

{

  _pWire->begin();

  _pWire->beginTransmission(_I2C_addr);

  if (_pWire->endTransmission() == 0)

    return true;

  else

    return false;

}


 

uint16_t DFRobot_AirQualitySensor::gainParticleConcentration_ugm3(uint8_t type)

{

  uint8_t buf[2];

  readReg(type, buf, 2);

  uint16_t concentration = ((uint16_t)buf[0] << 8) + (uint16_t)buf[1];

  return concentration;

}


 

uint16_t DFRobot_AirQualitySensor::gainParticleNum_Every0_1L(uint8_t type)

{

  uint8_t buf[2];

  readReg(type, buf, 2);

  uint16_t particlenum = ((uint16_t)buf[0] << 8) + (uint16_t)buf[1];

  return particlenum;

}


 

uint8_t DFRobot_AirQualitySensor::gainVersion(void)

{

  uint8_t version = 0 ;

  readReg(PARTICLENUM_GAIN_VERSION, &version, 1);

  return version;

}


 

void DFRobot_AirQualitySensor::setLowpower(void)

{

  uint8_t mode = 1;

  writeReg(0x01, &mode, 1);

}


 

void DFRobot_AirQualitySensor::awake(void)

{

  uint8_t mode = 2;

  writeReg(0x01, &mode, 1);

}


 

void DFRobot_AirQualitySensor::writeReg(uint8_t Reg, void *pData, uint8_t len)

{

  uint8_t *Data = (uint8_t *)pData;

  _pWire->beginTransmission(this->_I2C_addr);

  _pWire->write(Reg);

  for (uint8_t i = 0; i < len; i++)

  {

    _pWire->write(Data[i]);

  }

  _pWire->endTransmission();

}


 

int16_t DFRobot_AirQualitySensor::readReg(uint8_t Reg, uint8_t *Data, uint8_t len)

{

  int i = 0;

  _pWire->beginTransmission(this->_I2C_addr);

  _pWire->write(Reg);

  if (_pWire->endTransmission() != 0)

  {

    return -1;

  }

  _pWire->requestFrom((uint8_t)this->_I2C_addr, (uint8_t)len);

  while (_pWire->available())

  {

    Data[i++] = _pWire->read();

  }

  return len;

}

 

#############################################################

DFRobot_AirQualitySensor.cpp

#############################################################
/*!

 * @file DFRobot_AirQualitySensor.cpp

 * @brief The sensor can obtain concentration of some PM in the air.

 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)

 * @license     The MIT License (MIT)

 * @author      PengKaixing(kaixing.peng@dfrobot.com)

 * @version  V1.0.0

 * @date  2020-11-23

 * @url https://github.com/dfrobot/DFRobot_AirQualitySensor

 */

#include "DFRobot_AirQualitySensor.h"


 

DFRobot_AirQualitySensor::DFRobot_AirQualitySensor(TwoWire *pWire, uint8_t addr)

{

  _pWire = pWire;

  this->_I2C_addr = addr;

}


 

bool DFRobot_AirQualitySensor::begin(void)

{

  _pWire->begin();

  _pWire->beginTransmission(_I2C_addr);

  if (_pWire->endTransmission() == 0)

    return true;

  else

    return false;

}


 

uint16_t DFRobot_AirQualitySensor::gainParticleConcentration_ugm3(uint8_t type)

{

  uint8_t buf[2];

  readReg(type, buf, 2);

  uint16_t concentration = ((uint16_t)buf[0] << 8) + (uint16_t)buf[1];

  return concentration;

}


 

uint16_t DFRobot_AirQualitySensor::gainParticleNum_Every0_1L(uint8_t type)

{

  uint8_t buf[2];

  readReg(type, buf, 2);

  uint16_t particlenum = ((uint16_t)buf[0] << 8) + (uint16_t)buf[1];

  return particlenum;

}


 

uint8_t DFRobot_AirQualitySensor::gainVersion(void)

{

  uint8_t version = 0 ;

  readReg(PARTICLENUM_GAIN_VERSION, &version, 1);

  return version;

}


 

void DFRobot_AirQualitySensor::setLowpower(void)

{

  uint8_t mode = 1;

  writeReg(0x01, &mode, 1);

}


 

void DFRobot_AirQualitySensor::awake(void)

{

  uint8_t mode = 2;

  writeReg(0x01, &mode, 1);

}


 

void DFRobot_AirQualitySensor::writeReg(uint8_t Reg, void *pData, uint8_t len)

{

  uint8_t *Data = (uint8_t *)pData;

  _pWire->beginTransmission(this->_I2C_addr);

  _pWire->write(Reg);

  for (uint8_t i = 0; i < len; i++)

  {

    _pWire->write(Data[i]);

  }

  _pWire->endTransmission();

}


 

int16_t DFRobot_AirQualitySensor::readReg(uint8_t Reg, uint8_t *Data, uint8_t len)

{

  int i = 0;

  _pWire->beginTransmission(this->_I2C_addr);

  _pWire->write(Reg);

  if (_pWire->endTransmission() != 0)

  {

    return -1;

  }

  _pWire->requestFrom((uint8_t)this->_I2C_addr, (uint8_t)len);

  while (_pWire->available())

  {

    Data[i++] = _pWire->read();

  }

  return len;

}

 

#############################################################

DFRobot_AirQualitySensor.h

#############################################################

 

/*!

 * @file DFRobot_AirQualitySensor.h

 * @brief The sensor can obtain PM concentration in the air.

 * @copyright   Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)

 * @license     The MIT License (MIT)

 * @author      PengKaixing(kaixing.peng@dfrobot.com)

 * @version  V1.0.0

 * @date  2020-11-23

 * @url https://github.com/dfrobot/DFRobot_AirQualitySensor

 */


 

#ifndef __DFR0bot_AIR_H__

#define __DFR0bot_AIR_H__


 

#include "Arduino.h"

#include <Wire.h>


 

// Open this macro to see the program running in detail

//#define ENABLE_DBG


 

#ifdef ENABLE_DBG

#define DBG(...)                     \

    {                                \

        Serial.print("[");           \

        Serial.print(__FUNCTION__);  \

        Serial.print("(): ");        \

        Serial.print(__LINE__);      \

        Serial.print(" ] 0x");         \

        Serial.println(__VA_ARGS__,HEX); \

    }

#else

#define DBG(...)

#endif


 

#define PARTICLE_PM1_0_STANDARD   0X05

#define PARTICLE_PM2_5_STANDARD   0X07

#define PARTICLE_PM10_STANDARD    0X09

#define PARTICLE_PM1_0_ATMOSPHERE 0X0B

#define PARTICLE_PM2_5_ATMOSPHERE 0X0D

#define PARTICLE_PM10_ATMOSPHERE  0X0F


 

#define PARTICLENUM_0_3_UM_EVERY0_1L_AIR 0X11

#define PARTICLENUM_0_5_UM_EVERY0_1L_AIR 0X13

#define PARTICLENUM_1_0_UM_EVERY0_1L_AIR 0X15

#define PARTICLENUM_2_5_UM_EVERY0_1L_AIR 0X17

#define PARTICLENUM_5_0_UM_EVERY0_1L_AIR 0X19

#define PARTICLENUM_10_UM_EVERY0_1L_AIR  0X1B


 

#define PARTICLENUM_GAIN_VERSION 0X1D


 

class DFRobot_AirQualitySensor

{

  public:

    DFRobot_AirQualitySensor(TwoWire *pWire = &Wire, uint8_t addr = 0x19);

    ~DFRobot_AirQualitySensor(void){};

    /**

     * @fn begin

     * @brief Init

     * @return Bool type, indicate whether init succeeded

     * @retval True Succeed

     * @retval False Failed

     */

    bool begin(void);


 

    /**

     * @fn gainParticleConcentration_ugm3

     * @brief Get PM concentration of a specified type

     * @param type: Set PM types to be output

     * @n          PARTICLE_PM1_0_STANDARD

     * @n          PARTICLE_PM2_5_STANDARD

     * @n          PARTICLE_PM10_STANDARD

     * @n          PARTICLE_PM1_0_ATMOSPHERE

     * @n          PARTICLE_PM2_5_ATMOSPHERE

     * @n          PARTICLE_PM10_ATMOSPHERE

     * @return uint16_t type, indicate returning the PM concentration of the specified type

     */

    uint16_t gainParticleConcentration_ugm3(uint8_t type);


 

    /**

     * @fn gainParticleNum_Every0_1L

     * @brief Get the number of PM in 0.1L of air

     * @param type: Set PM types to be output

     * @n          PARTICLENUM_0_3_UM_EVERY0_1L_AIR

     * @n          PARTICLENUM_0_5_UM_EVERY0_1L_AIR

     * @n          PARTICLENUM_1_0_UM_EVERY0_1L_AIR

     * @n          PARTICLENUM_2_5_UM_EVERY0_1L_AIR

     * @n          PARTICLENUM_5_0_UM_EVERY0_1L_AIR

     * @n          PARTICLENUM_10_UM_EVERY0_1L_AIR

     * @return uint16_t type, indicate the particle numbers in every 0.1L of air

     */

    uint16_t gainParticleNum_Every0_1L(uint8_t type);


 

    /**

     * @fn gainVersion

     * @brief Get firmware version

     * @return uint8_t type, firmware version

     */

    uint8_t gainVersion(void);


 

    /**

     * @fn setLowpower

     * @brief Control the sensor to enter low-power mode

     */

    void setLowpower(void);


 

    /**

     * @fn awake

     * @brief Wake up sensor

     */

    void awake(void);


 

  protected:

    /**

     * @fn writeReg

     * @brief Write data to the specified register of the sensor

     * @param Register address to be written

     * @n     Reg :register address

     * @param Data to be written to register

     * @n     Data:data pointer to the register

     * @param Length of data to be written

     * @n     len :length of the data

     */

    void writeReg(uint8_t Reg, void *Data, uint8_t len);


 

    /**

     * @fn readReg

     * @brief Read data from the specified register of the sensor

     * @param Register address to be read

     * @n     Reg :register address

     * @param The register data to be read

     * @n     Data:data pointer to the register

     * @param Length of the data to be read

     * @n     len :length of the data

     */

    int16_t readReg(uint8_t Reg, uint8_t *Data, uint8_t len);


 

  private:

    TwoWire *_pWire;

    uint8_t _I2C_addr;

};

#endif



 

2025-01-13 10:19:07

Could you try striking a match near the sensor and see if the measurements change significantly. 

userHeadPic yiqing.guan
2024-12-27 10:19:48

[UPDATE]

 

I try to print all registers' value (0-29).

 

here is the output

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 16

 

 

userHeadPic kany.hsu