mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
e920a2e645
Signed-off-by: Jean Pierre Dudey <me@jeandudey.tech>
129 lines
3.3 KiB
C
129 lines
3.3 KiB
C
/*
|
|
* Copyright (C) 2020 Locha Inc
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU Lesser
|
|
* General Public License v2.1. See the file LICENSE in the top level
|
|
* directory for more details.
|
|
*/
|
|
|
|
/**
|
|
* @defgroup drivers_gp2y10xx GP2Y10xx Optical Dust Sensor device driver
|
|
* @ingroup drivers_sensors
|
|
* @ingroup drivers_saul
|
|
* @brief GP2Y10xx Optical Dust Sensor Converter device driver
|
|
*
|
|
* This driver works with GP2Y1010AU0F and GP2Y1014AU0F versions.
|
|
*
|
|
* This driver provides @ref drivers_saul capabilities.
|
|
*
|
|
* # Usage
|
|
*
|
|
* ```make
|
|
* USEMODULE += gp2y10xx
|
|
* ```
|
|
*
|
|
* The device can be initialized with @ref gp2y10xx_init and
|
|
* @ref gp2y10xx_read_density is used to read the current dust density that
|
|
* the sensor can detect.
|
|
*
|
|
* @{
|
|
*
|
|
* @file
|
|
* @brief GP2Y10xx device driver
|
|
*
|
|
* @author Jean Pierre Dudey <jeandudey@hotmail.com>
|
|
*/
|
|
|
|
#ifndef GP2Y10XX_H
|
|
#define GP2Y10XX_H
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
#include "periph/adc.h"
|
|
#include "periph/gpio.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* @brief This configures the maximum number of ADC readings stored to
|
|
* calculate the average ADC value.
|
|
*
|
|
* The bigger the number of readings the bigger each device descriptor will be.
|
|
*/
|
|
#ifndef CONFIG_GP2Y10XX_MAX_READINGS
|
|
#define CONFIG_GP2Y10XX_MAX_READINGS (10)
|
|
#endif
|
|
|
|
/**
|
|
* @brief Driver error values
|
|
*/
|
|
enum {
|
|
GP2Y10XX_OK = 0, /**< Everything is ok */
|
|
GP2Y10XX_ERR_ADC = -1, /**< ADC error */
|
|
GP2Y10XX_ERR_ILED = -2, /**< ILED pin error */
|
|
};
|
|
|
|
/**
|
|
* @brief ILED pin level.
|
|
*
|
|
* This specifies how the ILED pin behaves, if it's on when it's
|
|
* active-low/high. Waveshare breakout board is active-high, that is, that the
|
|
* voltage is 3.3v to turn ILED on (logic 1) and 0v to turn it off (logic 0).
|
|
*/
|
|
typedef enum {
|
|
GP2Y10XX_ILED_LEVEL_HIGH, /**< Active high */
|
|
GP2Y10XX_ILED_LEVEL_LOW, /**< Active low */
|
|
} gp2y10xx_level_t;
|
|
|
|
/**
|
|
* @brief GP2Y10xx device parameters
|
|
*/
|
|
typedef struct {
|
|
adc_t aout; /**< ADC line connected to device AOUT pin. */
|
|
adc_res_t adc_res; /**< ADC line resolution. */
|
|
uint16_t vref; /**< Reference voltage used for the VCC supply of the
|
|
sensor, in mV. */
|
|
gpio_t iled_pin; /**< ILED pin */
|
|
gp2y10xx_level_t iled_level; /**< ILED pin level */
|
|
} gp2y10xx_params_t;
|
|
|
|
/**
|
|
* @brief GP2Y10xx device descriptor
|
|
*/
|
|
typedef struct {
|
|
gp2y10xx_params_t params; /**< device driver configuration */
|
|
} gp2y10xx_t;
|
|
|
|
/**
|
|
* @brief Initialize an GP2Y10xx device.
|
|
*
|
|
* @param[in,out] dev Device descriptor.
|
|
* @param[in] params Device configuration.
|
|
*
|
|
* @return GP2Y10XX_OK on successful initialization.
|
|
* @return GP2Y10XX_ERR_ADC if ADC line initialization failed.
|
|
* @return GP2Y10XX_ERR_ILED if the ILED pin initialization failed.
|
|
*/
|
|
int gp2y10xx_init(gp2y10xx_t *dev, const gp2y10xx_params_t *params);
|
|
|
|
/**
|
|
* @brief Read a raw ADC value
|
|
*
|
|
* @param[in] dev Device descriptor.
|
|
* @param[out] density Dust density value in ug/m3.
|
|
*
|
|
* @return GP2Y10XX_OK on successful read.
|
|
* @return Any other value on error.
|
|
*/
|
|
int gp2y10xx_read_density(const gp2y10xx_t *dev, uint16_t *density);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* GP2Y10XX_H */
|
|
/** @} */
|