| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649 |
- // I2Cdev library collection - ADS1115 I2C device class
- // Based on Texas Instruments ADS1113/4/5 datasheet, May 2009 (SBAS444B, revised October 2009)
- // Note that the ADS1115 uses 16-bit registers, not 8-bit registers.
- // 8/2/2011 by Jeff Rowberg <jeff@rowberg.net>
- // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
- //
- // Changelog:
- // 2013-05-05 - Add debug information. Rename methods to match datasheet.
- // 2011-11-06 - added getVoltage, F. Farzanegan
- // 2011-10-29 - added getDifferentialx() methods, F. Farzanegan
- // 2011-08-02 - initial release
- /* ============================================
- I2Cdev device library code is placed under the MIT license
- Copyright (c) 2011 Jeff Rowberg
- 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.
- ===============================================
- */
- #include "ADS1115.h"
- /** Default constructor, uses default I2C address.
- * @see ADS1115_DEFAULT_ADDRESS
- */
- ADS1115::ADS1115() {
- devAddr = ADS1115_DEFAULT_ADDRESS;
- }
- /** Specific address constructor.
- * @param address I2C address
- * @see ADS1115_DEFAULT_ADDRESS
- * @see ADS1115_ADDRESS_ADDR_GND
- * @see ADS1115_ADDRESS_ADDR_VDD
- * @see ADS1115_ADDRESS_ADDR_SDA
- * @see ADS1115_ADDRESS_ADDR_SDL
- */
- ADS1115::ADS1115(uint8_t address) {
- devAddr = address;
- }
- /** Power on and prepare for general usage.
- * This device is ready to use automatically upon power-up. It defaults to
- * single-shot read mode, P0/N1 mux, 2.048v gain, 128 samples/sec, default
- * comparator with hysterysis, active-low polarity, non-latching comparator,
- * and comparater-disabled operation.
- */
- void ADS1115::initialize() {
- setMultiplexer(ADS1115_MUX_P0_N1);
- setGain(ADS1115_PGA_2P048);
- setMode(ADS1115_MODE_SINGLESHOT);
- setRate(ADS1115_RATE_128);
- setComparatorMode(ADS1115_COMP_MODE_HYSTERESIS);
- setComparatorPolarity(ADS1115_COMP_POL_ACTIVE_LOW);
- setComparatorLatchEnabled(ADS1115_COMP_LAT_NON_LATCHING);
- setComparatorQueueMode(ADS1115_COMP_QUE_DISABLE);
- }
- /** Verify the I2C connection.
- * Make sure the device is connected and responds as expected.
- * @return True if connection is valid, false otherwise
- */
- bool ADS1115::testConnection() {
- return I2Cdev::readWord(devAddr, ADS1115_RA_CONVERSION, buffer) == 1;
- }
- /** Poll the operational status bit until the conversion is finished
- * Retry at most 'max_retries' times
- * conversion is finished, then return true;
- * @see ADS1115_CFG_OS_BIT
- * @return True if data is available, false otherwise
- */
- bool ADS1115::pollConversion(uint16_t max_retries) {
- for(uint16_t i = 0; i < max_retries; i++) {
- if (isConversionReady()) return true;
- }
- return false;
- }
- /** Read differential value based on current MUX configuration.
- * The default MUX setting sets the device to get the differential between the
- * AIN0 and AIN1 pins. There are 8 possible MUX settings, but if you are using
- * all four input pins as single-end voltage sensors, then the default option is
- * not what you want; instead you will need to set the MUX to compare the
- * desired AIN* pin with GND. There are shortcut methods (getConversion*) to do
- * this conveniently, but you can also do it manually with setMultiplexer()
- * followed by this method.
- *
- * In single-shot mode, this register may not have fresh data. You need to write
- * a 1 bit to the MSB of the CONFIG register to trigger a single read/conversion
- * before this will be populated with fresh data. This technique is not as
- * effortless, but it has enormous potential to save power by only running the
- * comparison circuitry when needed.
- *
- * @param triggerAndPoll If true (and only in singleshot mode) the conversion trigger
- * will be executed and the conversion results will be polled.
- * @return 16-bit signed differential value
- * @see getConversionP0N1();
- * @see getConversionPON3();
- * @see getConversionP1N3();
- * @see getConversionP2N3();
- * @see getConversionP0GND();
- * @see getConversionP1GND();
- * @see getConversionP2GND();
- * @see getConversionP3GND);
- * @see setMultiplexer();
- * @see ADS1115_RA_CONVERSION
- * @see ADS1115_MUX_P0_N1
- * @see ADS1115_MUX_P0_N3
- * @see ADS1115_MUX_P1_N3
- * @see ADS1115_MUX_P2_N3
- * @see ADS1115_MUX_P0_NG
- * @see ADS1115_MUX_P1_NG
- * @see ADS1115_MUX_P2_NG
- * @see ADS1115_MUX_P3_NG
- */
- int16_t ADS1115::getConversion(bool triggerAndPoll) {
- if (triggerAndPoll && devMode == ADS1115_MODE_SINGLESHOT) {
- triggerConversion();
- pollConversion(I2CDEV_DEFAULT_READ_TIMEOUT);
- }
- I2Cdev::readWord(devAddr, ADS1115_RA_CONVERSION, buffer);
- return buffer[0];
- }
- /** Get AIN0/N1 differential.
- * This changes the MUX setting to AIN0/N1 if necessary, triggers a new
- * measurement (also only if necessary), then gets the differential value
- * currently in the CONVERSION register.
- * @return 16-bit signed differential value
- * @see getConversion()
- */
- int16_t ADS1115::getConversionP0N1() {
- if (muxMode != ADS1115_MUX_P0_N1) setMultiplexer(ADS1115_MUX_P0_N1);
- return getConversion();
- }
- /** Get AIN0/N3 differential.
- * This changes the MUX setting to AIN0/N3 if necessary, triggers a new
- * measurement (also only if necessary), then gets the differential value
- * currently in the CONVERSION register.
- * @return 16-bit signed differential value
- * @see getConversion()
- */
- int16_t ADS1115::getConversionP0N3() {
- if (muxMode != ADS1115_MUX_P0_N3) setMultiplexer(ADS1115_MUX_P0_N3);
- return getConversion();
- }
- /** Get AIN1/N3 differential.
- * This changes the MUX setting to AIN1/N3 if necessary, triggers a new
- * measurement (also only if necessary), then gets the differential value
- * currently in the CONVERSION register.
- * @return 16-bit signed differential value
- * @see getConversion()
- */
- int16_t ADS1115::getConversionP1N3() {
- if (muxMode != ADS1115_MUX_P1_N3) setMultiplexer(ADS1115_MUX_P1_N3);
- return getConversion();
- }
- /** Get AIN2/N3 differential.
- * This changes the MUX setting to AIN2/N3 if necessary, triggers a new
- * measurement (also only if necessary), then gets the differential value
- * currently in the CONVERSION register.
- * @return 16-bit signed differential value
- * @see getConversion()
- */
- int16_t ADS1115::getConversionP2N3() {
- if (muxMode != ADS1115_MUX_P2_N3) setMultiplexer(ADS1115_MUX_P2_N3);
- return getConversion();
- }
- /** Get AIN0/GND differential.
- * This changes the MUX setting to AIN0/GND if necessary, triggers a new
- * measurement (also only if necessary), then gets the differential value
- * currently in the CONVERSION register.
- * @return 16-bit signed differential value
- * @see getConversion()
- */
- int16_t ADS1115::getConversionP0GND() {
- if (muxMode != ADS1115_MUX_P0_NG) setMultiplexer(ADS1115_MUX_P0_NG);
- return getConversion();
- }
- /** Get AIN1/GND differential.
- * This changes the MUX setting to AIN1/GND if necessary, triggers a new
- * measurement (also only if necessary), then gets the differential value
- * currently in the CONVERSION register.
- * @return 16-bit signed differential value
- * @see getConversion()
- */
- int16_t ADS1115::getConversionP1GND() {
- if (muxMode != ADS1115_MUX_P1_NG) setMultiplexer(ADS1115_MUX_P1_NG);
- return getConversion();
- }
- /** Get AIN2/GND differential.
- * This changes the MUX setting to AIN2/GND if necessary, triggers a new
- * measurement (also only if necessary), then gets the differential value
- * currently in the CONVERSION register.
- * @return 16-bit signed differential value
- * @see getConversion()
- */
- int16_t ADS1115::getConversionP2GND() {
- if (muxMode != ADS1115_MUX_P2_NG) setMultiplexer(ADS1115_MUX_P2_NG);
- return getConversion();
- }
- /** Get AIN3/GND differential.
- * This changes the MUX setting to AIN3/GND if necessary, triggers a new
- * measurement (also only if necessary), then gets the differential value
- * currently in the CONVERSION register.
- * @return 16-bit signed differential value
- * @see getConversion()
- */
- int16_t ADS1115::getConversionP3GND() {
- if (muxMode != ADS1115_MUX_P3_NG) setMultiplexer(ADS1115_MUX_P3_NG);
- return getConversion();
- }
- /** Get the current voltage reading
- * Read the current differential and return it multiplied
- * by the constant for the current gain. mV is returned to
- * increase the precision of the voltage
- * @param triggerAndPoll If true (and only in singleshot mode) the conversion trigger
- * will be executed and the conversion results will be polled.
- */
- float ADS1115::getMilliVolts(bool triggerAndPoll) {
- switch (pgaMode) {
- case ADS1115_PGA_6P144:
- return (getConversion(triggerAndPoll) * ADS1115_MV_6P144);
- break;
- case ADS1115_PGA_4P096:
- return (getConversion(triggerAndPoll) * ADS1115_MV_4P096);
- break;
- case ADS1115_PGA_2P048:
- return (getConversion(triggerAndPoll) * ADS1115_MV_2P048);
- break;
- case ADS1115_PGA_1P024:
- return (getConversion(triggerAndPoll) * ADS1115_MV_1P024);
- break;
- case ADS1115_PGA_0P512:
- return (getConversion(triggerAndPoll) * ADS1115_MV_0P512);
- break;
- case ADS1115_PGA_0P256:
- case ADS1115_PGA_0P256B:
- case ADS1115_PGA_0P256C:
- return (getConversion(triggerAndPoll) * ADS1115_MV_0P256);
- break;
- }
- }
- /**
- * Return the current multiplier for the PGA setting.
- *
- * This may be directly retreived by using getMilliVolts(),
- * but this causes an independent read. This function could
- * be used to average a number of reads from the getConversion()
- * getConversionx() functions and cut downon the number of
- * floating-point calculations needed.
- *
- */
-
- float ADS1115::getMvPerCount() {
- switch (pgaMode) {
- case ADS1115_PGA_6P144:
- return ADS1115_MV_6P144;
- break;
- case ADS1115_PGA_4P096:
- return ADS1115_MV_4P096;
- break;
- case ADS1115_PGA_2P048:
- return ADS1115_MV_2P048;
- break;
- case ADS1115_PGA_1P024:
- return ADS1115_MV_1P024;
- break;
- case ADS1115_PGA_0P512:
- return ADS1115_MV_0P512;
- break;
- case ADS1115_PGA_0P256:
- case ADS1115_PGA_0P256B:
- case ADS1115_PGA_0P256C:
- return ADS1115_MV_0P256;
- break;
- }
- }
- // CONFIG register
- /** Get operational status.
- * @return Current operational status (false for active conversion, true for inactive)
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_OS_BIT
- */
- bool ADS1115::isConversionReady() {
- I2Cdev::readBitW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_OS_BIT, buffer);
- return buffer[0];
- }
- /** Trigger a new conversion.
- * Writing to this bit will only have effect while in power-down mode (no conversions active).
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_OS_BIT
- */
- void ADS1115::triggerConversion() {
- I2Cdev::writeBitW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_OS_BIT, 1);
- }
- /** Get multiplexer connection.
- * @return Current multiplexer connection setting
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_MUX_BIT
- * @see ADS1115_CFG_MUX_LENGTH
- */
- uint8_t ADS1115::getMultiplexer() {
- I2Cdev::readBitsW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_MUX_BIT, ADS1115_CFG_MUX_LENGTH, buffer);
- muxMode = (uint8_t)buffer[0];
- return muxMode;
- }
- /** Set multiplexer connection. Continous mode may fill the conversion register
- * with data before the MUX setting has taken effect. A stop/start of the conversion
- * is done to reset the values.
- * @param mux New multiplexer connection setting
- * @see ADS1115_MUX_P0_N1
- * @see ADS1115_MUX_P0_N3
- * @see ADS1115_MUX_P1_N3
- * @see ADS1115_MUX_P2_N3
- * @see ADS1115_MUX_P0_NG
- * @see ADS1115_MUX_P1_NG
- * @see ADS1115_MUX_P2_NG
- * @see ADS1115_MUX_P3_NG
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_MUX_BIT
- * @see ADS1115_CFG_MUX_LENGTH
- */
- void ADS1115::setMultiplexer(uint8_t mux) {
- if (I2Cdev::writeBitsW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_MUX_BIT, ADS1115_CFG_MUX_LENGTH, mux)) {
- muxMode = mux;
- if (devMode == ADS1115_MODE_CONTINUOUS) {
- // Force a stop/start
- setMode(ADS1115_MODE_SINGLESHOT);
- getConversion();
- setMode(ADS1115_MODE_CONTINUOUS);
- }
- }
-
- }
- /** Get programmable gain amplifier level.
- * @return Current programmable gain amplifier level
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_PGA_BIT
- * @see ADS1115_CFG_PGA_LENGTH
- */
- uint8_t ADS1115::getGain() {
- I2Cdev::readBitsW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_PGA_BIT, ADS1115_CFG_PGA_LENGTH, buffer);
- pgaMode=(uint8_t)buffer[0];
- return pgaMode;
- }
- /** Set programmable gain amplifier level.
- * Continous mode may fill the conversion register
- * with data before the gain setting has taken effect. A stop/start of the conversion
- * is done to reset the values.
- * @param gain New programmable gain amplifier level
- * @see ADS1115_PGA_6P144
- * @see ADS1115_PGA_4P096
- * @see ADS1115_PGA_2P048
- * @see ADS1115_PGA_1P024
- * @see ADS1115_PGA_0P512
- * @see ADS1115_PGA_0P256
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_PGA_BIT
- * @see ADS1115_CFG_PGA_LENGTH
- */
- void ADS1115::setGain(uint8_t gain) {
- if (I2Cdev::writeBitsW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_PGA_BIT, ADS1115_CFG_PGA_LENGTH, gain)) {
- pgaMode = gain;
- if (devMode == ADS1115_MODE_CONTINUOUS) {
- // Force a stop/start
- setMode(ADS1115_MODE_SINGLESHOT);
- getConversion();
- setMode(ADS1115_MODE_CONTINUOUS);
- }
- }
- }
- /** Get device mode.
- * @return Current device mode
- * @see ADS1115_MODE_CONTINUOUS
- * @see ADS1115_MODE_SINGLESHOT
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_MODE_BIT
- */
- bool ADS1115::getMode() {
- I2Cdev::readBitW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_MODE_BIT, buffer);
- devMode = buffer[0];
- return devMode;
- }
- /** Set device mode.
- * @param mode New device mode
- * @see ADS1115_MODE_CONTINUOUS
- * @see ADS1115_MODE_SINGLESHOT
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_MODE_BIT
- */
- void ADS1115::setMode(bool mode) {
- if (I2Cdev::writeBitW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_MODE_BIT, mode)) {
- devMode = mode;
- }
- }
- /** Get data rate.
- * @return Current data rate
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_DR_BIT
- * @see ADS1115_CFG_DR_LENGTH
- */
- uint8_t ADS1115::getRate() {
- I2Cdev::readBitsW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_DR_BIT, ADS1115_CFG_DR_LENGTH, buffer);
- return (uint8_t)buffer[0];
- }
- /** Set data rate.
- * @param rate New data rate
- * @see ADS1115_RATE_8
- * @see ADS1115_RATE_16
- * @see ADS1115_RATE_32
- * @see ADS1115_RATE_64
- * @see ADS1115_RATE_128
- * @see ADS1115_RATE_250
- * @see ADS1115_RATE_475
- * @see ADS1115_RATE_860
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_DR_BIT
- * @see ADS1115_CFG_DR_LENGTH
- */
- void ADS1115::setRate(uint8_t rate) {
- I2Cdev::writeBitsW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_DR_BIT, ADS1115_CFG_DR_LENGTH, rate);
- }
- /** Get comparator mode.
- * @return Current comparator mode
- * @see ADS1115_COMP_MODE_HYSTERESIS
- * @see ADS1115_COMP_MODE_WINDOW
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_COMP_MODE_BIT
- */
- bool ADS1115::getComparatorMode() {
- I2Cdev::readBitW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_COMP_MODE_BIT, buffer);
- return buffer[0];
- }
- /** Set comparator mode.
- * @param mode New comparator mode
- * @see ADS1115_COMP_MODE_HYSTERESIS
- * @see ADS1115_COMP_MODE_WINDOW
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_COMP_MODE_BIT
- */
- void ADS1115::setComparatorMode(bool mode) {
- I2Cdev::writeBitW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_COMP_MODE_BIT, mode);
- }
- /** Get comparator polarity setting.
- * @return Current comparator polarity setting
- * @see ADS1115_COMP_POL_ACTIVE_LOW
- * @see ADS1115_COMP_POL_ACTIVE_HIGH
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_COMP_POL_BIT
- */
- bool ADS1115::getComparatorPolarity() {
- I2Cdev::readBitW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_COMP_POL_BIT, buffer);
- return buffer[0];
- }
- /** Set comparator polarity setting.
- * @param polarity New comparator polarity setting
- * @see ADS1115_COMP_POL_ACTIVE_LOW
- * @see ADS1115_COMP_POL_ACTIVE_HIGH
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_COMP_POL_BIT
- */
- void ADS1115::setComparatorPolarity(bool polarity) {
- I2Cdev::writeBitW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_COMP_POL_BIT, polarity);
- }
- /** Get comparator latch enabled value.
- * @return Current comparator latch enabled value
- * @see ADS1115_COMP_LAT_NON_LATCHING
- * @see ADS1115_COMP_LAT_LATCHING
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_COMP_LAT_BIT
- */
- bool ADS1115::getComparatorLatchEnabled() {
- I2Cdev::readBitW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_COMP_LAT_BIT, buffer);
- return buffer[0];
- }
- /** Set comparator latch enabled value.
- * @param enabled New comparator latch enabled value
- * @see ADS1115_COMP_LAT_NON_LATCHING
- * @see ADS1115_COMP_LAT_LATCHING
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_COMP_LAT_BIT
- */
- void ADS1115::setComparatorLatchEnabled(bool enabled) {
- I2Cdev::writeBitW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_COMP_LAT_BIT, enabled);
- }
- /** Get comparator queue mode.
- * @return Current comparator queue mode
- * @see ADS1115_COMP_QUE_ASSERT1
- * @see ADS1115_COMP_QUE_ASSERT2
- * @see ADS1115_COMP_QUE_ASSERT4
- * @see ADS1115_COMP_QUE_DISABLE
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_COMP_QUE_BIT
- * @see ADS1115_CFG_COMP_QUE_LENGTH
- */
- uint8_t ADS1115::getComparatorQueueMode() {
- I2Cdev::readBitsW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_COMP_QUE_BIT, ADS1115_CFG_COMP_QUE_LENGTH, buffer);
- return (uint8_t)buffer[0];
- }
- /** Set comparator queue mode.
- * @param mode New comparator queue mode
- * @see ADS1115_COMP_QUE_ASSERT1
- * @see ADS1115_COMP_QUE_ASSERT2
- * @see ADS1115_COMP_QUE_ASSERT4
- * @see ADS1115_COMP_QUE_DISABLE
- * @see ADS1115_RA_CONFIG
- * @see ADS1115_CFG_COMP_QUE_BIT
- * @see ADS1115_CFG_COMP_QUE_LENGTH
- */
- void ADS1115::setComparatorQueueMode(uint8_t mode) {
- I2Cdev::writeBitsW(devAddr, ADS1115_RA_CONFIG, ADS1115_CFG_COMP_QUE_BIT, ADS1115_CFG_COMP_QUE_LENGTH, mode);
- }
- // *_THRESH registers
- /** Get low threshold value.
- * @return Current low threshold value
- * @see ADS1115_RA_LO_THRESH
- */
- int16_t ADS1115::getLowThreshold() {
- I2Cdev::readWord(devAddr, ADS1115_RA_LO_THRESH, buffer);
- return buffer[0];
- }
- /** Set low threshold value.
- * @param threshold New low threshold value
- * @see ADS1115_RA_LO_THRESH
- */
- void ADS1115::setLowThreshold(int16_t threshold) {
- I2Cdev::writeWord(devAddr, ADS1115_RA_LO_THRESH, threshold);
- }
- /** Get high threshold value.
- * @return Current high threshold value
- * @see ADS1115_RA_HI_THRESH
- */
- int16_t ADS1115::getHighThreshold() {
- I2Cdev::readWord(devAddr, ADS1115_RA_HI_THRESH, buffer);
- return buffer[0];
- }
- /** Set high threshold value.
- * @param threshold New high threshold value
- * @see ADS1115_RA_HI_THRESH
- */
- void ADS1115::setHighThreshold(int16_t threshold) {
- I2Cdev::writeWord(devAddr, ADS1115_RA_HI_THRESH, threshold);
- }
- /** Configures ALERT/RDY pin as a conversion ready pin.
- * It does this by setting the MSB of the high threshold register to '1' and the MSB
- * of the low threshold register to '0'. COMP_POL and COMP_QUE bits will be set to '0'.
- * Note: ALERT/RDY pin requires a pull up resistor.
- */
- void ADS1115::setConversionReadyPinMode() {
- I2Cdev::writeBitW(devAddr, ADS1115_RA_HI_THRESH, 15, 1);
- I2Cdev::writeBitW(devAddr, ADS1115_RA_LO_THRESH, 15, 0);
- setComparatorPolarity(0);
- setComparatorQueueMode(0);
- }
- // Create a mask between two bits
- unsigned createMask(unsigned a, unsigned b) {
- unsigned mask = 0;
- for (unsigned i=a; i<=b; i++)
- mask |= 1 << i;
- return mask;
- }
- uint16_t shiftDown(uint16_t extractFrom, int places) {
- return (extractFrom >> places);
- }
- uint16_t getValueFromBits(uint16_t extractFrom, int high, int length) {
- int low= high-length +1;
- uint16_t mask = createMask(low ,high);
- return shiftDown(extractFrom & mask, low);
- }
- /** Show all the config register settings
- */
- void ADS1115::showConfigRegister() {
- I2Cdev::readWord(devAddr, ADS1115_RA_CONFIG, buffer);
- uint16_t configRegister =buffer[0];
-
-
- #ifdef ADS1115_SERIAL_DEBUG
- Serial.print("Register is:");
- Serial.println(configRegister,BIN);
-
- Serial.print("OS:\t");
- Serial.println(getValueFromBits(configRegister,
- ADS1115_CFG_OS_BIT,1), BIN);
- Serial.print("MUX:\t");
- Serial.println(getValueFromBits(configRegister,
- ADS1115_CFG_MUX_BIT,ADS1115_CFG_MUX_LENGTH), BIN);
-
- Serial.print("PGA:\t");
- Serial.println(getValueFromBits(configRegister,
- ADS1115_CFG_PGA_BIT,ADS1115_CFG_PGA_LENGTH), BIN);
-
- Serial.print("MODE:\t");
- Serial.println(getValueFromBits(configRegister,
- ADS1115_CFG_MODE_BIT,1), BIN);
-
- Serial.print("DR:\t");
- Serial.println(getValueFromBits(configRegister,
- ADS1115_CFG_DR_BIT,ADS1115_CFG_DR_LENGTH), BIN);
-
- Serial.print("CMP_MODE:\t");
- Serial.println(getValueFromBits(configRegister,
- ADS1115_CFG_COMP_MODE_BIT,1), BIN);
-
- Serial.print("CMP_POL:\t");
- Serial.println(getValueFromBits(configRegister,
- ADS1115_CFG_COMP_POL_BIT,1), BIN);
-
- Serial.print("CMP_LAT:\t");
- Serial.println(getValueFromBits(configRegister,
- ADS1115_CFG_COMP_LAT_BIT,1), BIN);
-
- Serial.print("CMP_QUE:\t");
- Serial.println(getValueFromBits(configRegister,
- ADS1115_CFG_COMP_QUE_BIT,ADS1115_CFG_COMP_QUE_LENGTH), BIN);
- #endif
- };
|