/* * Author: Jon Trulson <jtrulson@ics.com> * Copyright (c) 2015 Intel Corporation. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once #include <string> #include <mraa/common.hpp> #include <mraa/i2c.hpp> #define HP20X_I2C_BUS 0 #define HP20X_DEFAULT_I2C_ADDR 0x76 namespace upm { /** * @brief HP20X I2C Barometer (High-Accuracy) library * @defgroup hp20x libupm-hp20x * @ingroup seeed i2c pressure */ /** * @library hp20x * @sensor hp20x * @comname Grove Barometer (High-Accuracy) * @altname HP20X Barometer (High-Accuracy) * @type pressure * @man seeed * @web http://www.seeedstudio.com/depot/Grove-Barometer-HighAccuracy-p-1865.html * @con i2c * * @brief API for the HP20X-based Grove Barometer (High-Accuracy) * * This is a high-accuracy barometer providing pressure, altitude, * and temperature data. It can be calibrated for a given altitude * offset, and a wide range of interrupt generating capabilities are * supported. As usual, see the HP20X datasheet for more details. * * This module was developed using a Grove Barometer (High-Accuracy) * based on an HP206C chip. * * @image html hp20x.jpg * @snippet hp20x.cxx Interesting */ class HP20X { public: /** * HP20X commands */ typedef enum { CMD_SOFT_RST = 0x06, CMD_ADC_CVT = 0x40, // mask - ANDed with DSR and CHNL bits CMD_READ_PT = 0x10, // read pressure/temp CMD_READ_AT = 0x11, // read alt/temp CMD_READ_P = 0x30, // read pressure only CMD_READ_A = 0x31, // read alt only CMD_READ_T = 0x32, // read temp only CMD_ANA_CAL = 0x28, // recalibrate internal analog blocks CMD_READ_REG = 0x80, // mask - ANDed with reg addr CMD_WRITE_REG = 0xc0 // mask - ANDed with reg addr } HP20X_CMD_T; /** * CHNL bits */ typedef enum { CHNL_PT = 0x00, // pressure and temperature CHNL_T = 0x02, // temperature CHNL_SHIFT = 0 // don't use, indicates position in REG } CHNL_BITS_T; /** * DSR bits */ typedef enum { DSR_4096 = 0x00, // decimation rate of digital filter DSR_2048 = 0x01, DSR_1024 = 0x02, DSR_512 = 0x03, DSR_256 = 0x04, DSR_128 = 0x05, DSR_SHIFT = 2 // don't use, indicates position in REG } DSR_BITS_T; /** * HP20X registers */ typedef enum { REG_ALT_OFF_LSB = 0x00, REG_ALT_OFF_MSB = 0x01, REG_PA_H_TH_LSB = 0x02, // Pres/Alt high threshold REG_PA_H_TH_MSB = 0x03, REG_PA_M_TH_LSB = 0x04, // Pres/Alt medium threshold REG_PA_M_TH_MSB = 0x05, REG_PA_L_TH_LSB = 0x06, // Pres/Alt low threshold REG_PA_L_TH_MSB = 0x07, REG_T_H_TH = 0x08, // temperature high threshold REG_T_M_TH = 0x09, REG_T_L_TH = 0x0a, REG_INT_EN = 0x0b, // interrupt enables REG_INT_CFG = 0x0c, // interrupt configuration REG_INT_SRC = 0x0d, // interrupt sources REG_PARA = 0x0e // parameters config } HP20X_REG_T; /** * INT_EN bits */ typedef enum { INT_EN_T_WIN_EN = 0x01, INT_EN_PA_WIN_EN = 0x02, INT_EN_T_TRAV_EN = 0x04, INT_EN_PA_TRAV_EN = 0x08, INT_EN_T_RDY_EN = 0x10, INT_EN_PA_RDY_EN = 0x20 // 0x40, 0x80 reserved } INT_EN_BITS_T; /** * INT_CFG bits */ typedef enum { INT_CFG_T_WIN_CFG = 0x01, INT_CFG_PA_WIN_CFG = 0x02, INT_CFG_T_TRAV_CFG = 0x04, INT_CFG_PA_TRAV_CFG = 0x08, INT_CFG_T_RDY_CFG = 0x10, INT_CFG_PA_RDY_CFG = 0x20, INT_CFG_PA_MODE = 0x40 // 0x80 reserved } INT_CFG_BITS_T; /** * INT_SRC bits */ typedef enum { INT_SRC_T_WIN = 0x01, INT_SRC_PA_WIN = 0x02, INT_SRC_T_TRAV = 0x04, INT_SRC_PA_TRAV = 0x08, INT_SRC_T_RDY = 0x10, INT_SRC_PA_RDY = 0x20, INT_SRC_DEV_RDY = 0x40, // device is ready INT_SRC_TH_ERR = 0x80 // threshold error } INT_SRC_BITS_T; /** * PARA bits */ typedef enum { // 0x01-0x40 reserved PARA_CMPS_EN = 0x80 // compensation enable } PARA_BITS_T; /** * HP20X constructor * * @param bus I2C bus to use * @param address Address for this device */ HP20X(int bus=HP20X_I2C_BUS, uint8_t address=HP20X_DEFAULT_I2C_ADDR); /** * HP20X destructor */ ~HP20X(); /** * Sets up initial values and starts operation * * @param dsr Data sampling rate; one of the DSR_BITS_T values * @return True if successful */ bool init(DSR_BITS_T dsr=DSR_4096); /** * Sends a command to the device * * @param cmd Command to send; usually, one of the HP20X_CMD_T values * @return True if successful */ bool writeCmd(uint8_t cmd); /** * Writes a value to a register * * @param reg Register to write to; one of the HP20X_REG_T values * @param data Value to write * @return True if successful */ bool writeReg(HP20X_REG_T reg, uint8_t data); /** * Reads a register and returns its value * * @param reg Register to read; one of the HP20X_REG_T values * @return Value of a specified register */ uint8_t readReg(HP20X_REG_T reg); /** * Reads 3 bytes of data in response to a conversion request, and * converts it to an integer * * @return Value read back (temperature, pressure, etc.) */ int readData(); /** * Checks to see if the DR_RDY bit is set, indicating the device * can accept commands * * @return True if the device is ready, false otherwise */ bool isReady(); /** * Checks to see if the device is ready, and sleeps/retries if not. * Returns once the device indicates it's ready. * * @return True if the device is ready; false if retries are exhausted */ bool waitforDeviceReady(); /** * Returns the temperature in Celsius * * @return Temperature */ float getTemperature(); /** * Returns the pressure in millibars * * @return Pressure */ float getPressure(); /** * Returns the computed altitude in meters * * @return Altitude */ float getAltitude(); /** * Enables or disables the on-chip compensator. This allows the * chip to filter and clean up the output data. * * @param enable True to enable, false otherwise */ void compensationEnable(bool enable); /** * Sets up the interrupt enable register. This register defines * which events can cause a hardware interrupt pin to be pulled high * (active). * * @param bits One or more of the INT_EN_BITS_T bits * @return True if successful, false otherwise */ bool setInterruptEnable(uint8_t bits); /** * Sets up the interrupt configuration register. This register * defines which events can cause an interrupt to be indicated. * * @param bits One or more of the INT_EN_BITS_T bits * @return True if successful, false otherwise */ bool setInterruptConfig(uint8_t bits); /** * Gets the interrupt source register. This register indicates * which interrupts have been triggered. In addition, it * indicates when certain operations have been completed. * * @return One of more of the INT_SRC_BITS_T values */ uint8_t getInterruptSource(); /** * Sets the data sampling rate. Higher rates are more precise, but * take more time per measurement. * * @param dsr One of the DSR_BITS_T values */ void setDSR(DSR_BITS_T dsr); /** * Starts an internal recalibration of analog blocks. This is * faster than a soft reset. */ void recalibrateInternal(); /** * Executes a soft reset. All register values are reset to power-on * defaults. This function returns when the reset is * complete and the device reports it is ready. */ void softReset(); /** * Sets the altitude offset for your region. See the datasheet for * more details. Setting this correctly for your region is * required for accurate altitude data. * * @param off Offset */ void setAltitudeOffset(int16_t off); /** * Sets pressure/altitude thresholds for interrupt generation * * @param low Low threshold to generate an interrupt * @param med Medium threshold to generate an interrupt * @param high High threshold to generate an interrupt */ void setPAThreshholds(int16_t low, int16_t med, int16_t high); /** * Sets temperature thresholds for interrupt generation * * @param low Low threshold to generate an interrupt * @param med Medium threshold to generate an interrupt * @param high High threshold to generate an interrupt */ void setTemperatureThreshholds(int8_t low, int8_t med, int8_t high); protected: mraa::I2c m_i2c; private: uint8_t m_addr; uint8_t m_dsr; }; }