mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-09-19 16:46:11 -04:00
0.3.6 ADS1x15
This commit is contained in:
parent
5c94b97699
commit
cbb91dc824
@ -1,31 +1,10 @@
|
||||
//
|
||||
// FILE: ADS1X15.cpp
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.3.5
|
||||
// VERSION: 0.3.6
|
||||
// DATE: 2013-03-24
|
||||
// PUPROSE: Arduino library for ADS1015 and ADS1115
|
||||
// URL: https://github.com/RobTillaart/ADS1X15
|
||||
//
|
||||
// HISTORY:
|
||||
// 0.0.0 2013-03-24 initial version
|
||||
// 0.0.1 2013-03-24 first working version
|
||||
// 0.1.0 2017-07-31 removed pre 1.0 support; added getVoltage
|
||||
// 0.2.0 2020-04-08 initial release; refactor ad fundum;
|
||||
// 0.2.1 2020-08-15 fix issue 2 gain; refactor
|
||||
// 0.2.2 2020-08-18 add begin(sda, scl) for ESP32
|
||||
// 0.2.3 2020-08-20 add comparator code + async mode
|
||||
// 0.2.4 2020-08-26 check readme.md and minor fixes
|
||||
// 0.2.5 2020-08-26 add missing readADC_Differential_X_X()
|
||||
// 0.2.6 2020-09-01 fix #12 - fix getMaxVoltage + minor refactor
|
||||
// 0.2.7 2020-09-27 redo readRegister() + getValue() + getError()
|
||||
// 0.3.0 2021-03-29 add Wire parameter to constructors.
|
||||
// 0.3.1 2021-04-25 #22, add get/setClock() for Wire speed + reset()
|
||||
// 0.3.2 2021-10-07 fix build-CI; update readme + add new examples
|
||||
// 0.3.3 2021-10-17 update build-CI (esp32), readme.md, keywords.txt
|
||||
// 0.3.4 2021-12-11 update library.json, license, minor edits incl layout)
|
||||
// add unit test constants.
|
||||
// 0.3.5 2022-01-21 fix #36 support for Nano Every
|
||||
|
||||
|
||||
|
||||
#include "ADS1X15.h"
|
||||
|
@ -2,7 +2,7 @@
|
||||
//
|
||||
// FILE: ADS1X15.H
|
||||
// AUTHOR: Rob Tillaart
|
||||
// VERSION: 0.3.5
|
||||
// VERSION: 0.3.6
|
||||
// DATE: 2013-03-24
|
||||
// PUPROSE: Arduino library for ADS1015 and ADS1115
|
||||
// URL: https://github.com/RobTillaart/ADS1X15
|
||||
@ -12,7 +12,7 @@
|
||||
#include "Arduino.h"
|
||||
#include "Wire.h"
|
||||
|
||||
#define ADS1X15_LIB_VERSION (F("0.3.5"))
|
||||
#define ADS1X15_LIB_VERSION (F("0.3.6"))
|
||||
|
||||
// allow compile time default address
|
||||
// address in { 0x48, 0x49, 0x4A, 0x4B }, no test...
|
||||
@ -67,7 +67,7 @@ public:
|
||||
void setDataRate(uint8_t dataRate = 4); // invalid values are mapped on 4 (default)
|
||||
uint8_t getDataRate(); // actual speed depends on device
|
||||
|
||||
int16_t readADC(uint8_t pin);
|
||||
int16_t readADC(uint8_t pin = 0);
|
||||
int16_t readADC_Differential_0_1();
|
||||
|
||||
// used by continuous mode and async mode.
|
||||
@ -78,7 +78,7 @@ public:
|
||||
// ASYNC INTERFACE
|
||||
// requestADC(pin) -> isBusy() or isReady() -> getValue();
|
||||
// see examples
|
||||
void requestADC(uint8_t pin);
|
||||
void requestADC(uint8_t pin = 0);
|
||||
void requestADC_Differential_0_1();
|
||||
bool isBusy();
|
||||
bool isReady();
|
||||
@ -163,6 +163,7 @@ protected:
|
||||
uint32_t _clockSpeed = 0;
|
||||
};
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Derived classes from ADS1X15
|
||||
@ -173,12 +174,14 @@ public:
|
||||
ADS1013(uint8_t Address = ADS1015_ADDRESS, TwoWire *wire = &Wire);
|
||||
};
|
||||
|
||||
|
||||
class ADS1014 : public ADS1X15
|
||||
{
|
||||
public:
|
||||
ADS1014(uint8_t Address = ADS1015_ADDRESS, TwoWire *wire = &Wire);
|
||||
};
|
||||
|
||||
|
||||
class ADS1015 : public ADS1X15
|
||||
{
|
||||
public:
|
||||
@ -193,6 +196,7 @@ public:
|
||||
void requestADC_Differential_2_3();
|
||||
};
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Derived classes from ADS1X15
|
||||
@ -203,12 +207,14 @@ public:
|
||||
ADS1113(uint8_t address = ADS1115_ADDRESS, TwoWire *wire = &Wire);
|
||||
};
|
||||
|
||||
|
||||
class ADS1114 : public ADS1X15
|
||||
{
|
||||
public:
|
||||
ADS1114(uint8_t address = ADS1115_ADDRESS, TwoWire *wire = &Wire);
|
||||
};
|
||||
|
||||
|
||||
class ADS1115 : public ADS1X15
|
||||
{
|
||||
public:
|
||||
@ -223,4 +229,6 @@ public:
|
||||
void requestADC_Differential_2_3();
|
||||
};
|
||||
|
||||
|
||||
// --- END OF FILE ---
|
||||
|
||||
|
124
libraries/ADS1x15/CHANGELOG.md
Normal file
124
libraries/ADS1x15/CHANGELOG.md
Normal file
@ -0,0 +1,124 @@
|
||||
# Change Log
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## [0.3.6] - 2022-03-10
|
||||
|
||||
### Added
|
||||
- CHANGELOG.md: moved history in ADS1x15.cpp to this file.
|
||||
- add default parameters for single channel devices.
|
||||
- **readADC(uint8_t pin = 0);**
|
||||
- **requestADC(uint8_t pin = 0);**
|
||||
- two examples for the **ADS1114** (single channel devices)
|
||||
- update readme.md.
|
||||
|
||||
### Changed
|
||||
|
||||
### Fixed
|
||||
|
||||
## [0.3.5] - 2022-01-21
|
||||
|
||||
### Added
|
||||
|
||||
### Changed
|
||||
|
||||
### Fixed
|
||||
- fix #36 support for Nano Every
|
||||
|
||||
## [0.3.4] - 2021-12-11
|
||||
|
||||
### Added
|
||||
- add unit test constants.
|
||||
|
||||
### Changed
|
||||
- update library.json, license,
|
||||
- minor edits incl layout
|
||||
|
||||
### Fixed
|
||||
|
||||
## [0.3.3] - 2021-10-17
|
||||
|
||||
### Added
|
||||
|
||||
### Changed
|
||||
- update build-CI (esp32), readme.md, keywords.txt
|
||||
|
||||
### Fixed
|
||||
|
||||
## [0.3.2] - 2021-10-07
|
||||
|
||||
### Added
|
||||
- added examples
|
||||
|
||||
### Changed
|
||||
- update readme
|
||||
|
||||
### Fixed
|
||||
- fix build-CI;
|
||||
|
||||
## [0.3.1] - 2021-04-25
|
||||
|
||||
### Added
|
||||
- add get/setClock() for Wire speed
|
||||
- reset()
|
||||
|
||||
### Changed
|
||||
|
||||
### Fixed
|
||||
- issue #22
|
||||
|
||||
## [0.3.0] - 2021-03-29
|
||||
|
||||
### Added
|
||||
- add Wire parameter to constructors.
|
||||
|
||||
### Changed
|
||||
|
||||
### Fixed
|
||||
|
||||
|
||||
## OLDER versions
|
||||
|
||||
### 0.2.7 - 2020-09-27
|
||||
- redo readRegister()
|
||||
- getValue()
|
||||
- getError()
|
||||
|
||||
### [0.2.6] - 2020-09-01
|
||||
- fix #12
|
||||
- fix getMaxVoltage
|
||||
- refactor
|
||||
|
||||
### [0.2.5] - 2020-08-26
|
||||
- add missing readADC_Differential_X_X()
|
||||
|
||||
### [0.2.4] - 2020-08-26
|
||||
- check readme.md and minor fixes
|
||||
|
||||
### [0.2.3] - 2020-08-20
|
||||
- add comparator code
|
||||
- add async mode
|
||||
|
||||
### [0.2.2] - 2020-08-18
|
||||
- add begin(sda, scl) for ESP32
|
||||
|
||||
### [0.2.1] - 2020-08-15
|
||||
- fix issue #2 gain
|
||||
|
||||
### [0.2.0] - 2020-04-08
|
||||
- initial release;
|
||||
- refactor ad fundum;
|
||||
|
||||
### [0.1.0] - 2017-07-31
|
||||
- removed pre 1.0 support; added getVoltage
|
||||
|
||||
### [0.0.1] - 2013-03-24
|
||||
- first working version
|
||||
|
||||
### [0.0.0] - 2013-03-24
|
||||
- initial version
|
||||
|
||||
|
||||
|
@ -5,12 +5,14 @@
|
||||
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/ADS1X15/blob/master/LICENSE)
|
||||
[![GitHub release](https://img.shields.io/github/release/RobTillaart/ADS1X15.svg?maxAge=3600)](https://github.com/RobTillaart/ADS1X15/releases)
|
||||
|
||||
|
||||
# ADS1X15
|
||||
|
||||
Arduino library for I2C ADC ADS1015, ADS1115, and similar.
|
||||
|
||||
For using I2C ADC with Raspberry pi or other SBC with Linux OS, you can check similar library [here](https://github.com/chandrawi/ADS1x15-ADC).
|
||||
|
||||
|
||||
## Description
|
||||
|
||||
This library should work for the devices mentioned below,
|
||||
@ -172,18 +174,24 @@ Data rate in samples per second, based on datasheet is described on table below.
|
||||
|
||||
Reading the ADC is very straightforward, the **readADC()** function handles all in one call.
|
||||
Under the hood it uses the asynchronous calls.
|
||||
- **int16_t readADC(uint8_t pin)** normal ADC functionality, pin = 0..3.
|
||||
- **int16_t readADC(uint8_t pin = 0)** normal ADC functionality, pin = 0..3.
|
||||
If the pin number is out of range, this function will return 0.
|
||||
Default pin = 0 as this is convenient for 1 channel devices.
|
||||
|
||||
```cpp
|
||||
// read ADC in pin 0
|
||||
// read ADC in pin 2
|
||||
ADS.readADC(2);
|
||||
|
||||
// read ADC in pin 0 - two ways
|
||||
ADS.readADC();
|
||||
ADS.readADC(0);
|
||||
```
|
||||
|
||||
See [examples](https://github.com/RobTillaart/ADS1X15/blob/master/examples/ADS_minimum/ADS_minimum.ino).
|
||||
|
||||
To read the ADC in an asynchronous way (e.g. to minimize blocking) you need call three functions:
|
||||
- **void requestADC(uint8_t pin)** Start the conversion. pin = 0..3.
|
||||
- **void requestADC(uint8_t pin = 0)** Start the conversion. pin = 0..3.
|
||||
Default pin = 0 as this is convenient for 1 channel devices.
|
||||
- **bool isBusy()** Is the conversion not ready yet? Works only in SINGLE mode!
|
||||
- **bool isReady()** Is the conversion ready? Works only in SINGLE mode! (= wrapper around **isBusy()** )
|
||||
- **int16_t getValue()** Read the result of the conversion.
|
||||
|
110
libraries/ADS1x15/examples/ADS_1114_four/ADS_1114_four.ino
Normal file
110
libraries/ADS1x15/examples/ADS_1114_four/ADS_1114_four.ino
Normal file
@ -0,0 +1,110 @@
|
||||
//
|
||||
// FILE: ADS_1114_four.ino
|
||||
// AUTHOR: Rob.Tillaart
|
||||
// PURPOSE: demo reading four ADS1114 modules in parallel
|
||||
// URL: https://github.com/RobTillaart/ADS1X15
|
||||
|
||||
|
||||
// Note all IO with the sensors are guarded by an isConnected()
|
||||
// this is max robust, in non critical application one may either
|
||||
// cache the value or only verify it in setup (least robust).
|
||||
// Less robust may cause the application to hang - watchdog reset ?
|
||||
|
||||
|
||||
#include "ADS1X15.h"
|
||||
|
||||
|
||||
ADS1114 ADS[4];
|
||||
uint16_t val[4];
|
||||
|
||||
uint32_t last = 0, now = 0;
|
||||
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(__FILE__);
|
||||
Serial.print("ADS1X15_LIB_VERSION: ");
|
||||
Serial.println(ADS1X15_LIB_VERSION);
|
||||
|
||||
for (uint8_t i = 0; i < 4; i++)
|
||||
{
|
||||
uint8_t address = 0x48 + i;
|
||||
ADS[i] = ADS1114(address);
|
||||
|
||||
Serial.print(address, HEX);
|
||||
Serial.print(" ");
|
||||
Serial.println(ADS[i].begin() ? "connected" : "not connected");
|
||||
|
||||
ADS[i].setDataRate(4); // 7 is fastest, but more noise
|
||||
}
|
||||
ADS_request_all();
|
||||
}
|
||||
|
||||
|
||||
void loop()
|
||||
{
|
||||
// Serial.println(__FUNCTION__);
|
||||
// wait until all is read...
|
||||
while(ADS_read_all());
|
||||
|
||||
// we have all values, so process (print) them
|
||||
ADS_print_all();
|
||||
|
||||
delay(1000); // wait a second, comment this line for more samples.
|
||||
ADS_request_all();
|
||||
}
|
||||
|
||||
|
||||
void ADS_request_all()
|
||||
{
|
||||
// Serial.println(__FUNCTION__);
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
if (ADS[i].isConnected()) ADS[i].requestADC(0);
|
||||
delayMicroseconds(200); // get them evenly spaced in time ...
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool ADS_read_all()
|
||||
{
|
||||
// Serial.println(__FUNCTION__);
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
if (ADS[i].isConnected() && ADS[i].isBusy()) return true;
|
||||
}
|
||||
// Serial.print("IDX:\t");
|
||||
// Serial.println(idx);
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
if (ADS[i].isConnected())
|
||||
{
|
||||
val[i] = ADS[i].getValue();
|
||||
}
|
||||
}
|
||||
ADS_request_all();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void ADS_print_all()
|
||||
{
|
||||
// Serial.println(__FUNCTION__);
|
||||
// print duration since last print.
|
||||
now = millis();
|
||||
Serial.print(now - last);
|
||||
last = now;
|
||||
Serial.println();
|
||||
|
||||
// PRINT ALL VALUES
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
Serial.print(val[i]);
|
||||
Serial.print("\t");
|
||||
}
|
||||
Serial.println();
|
||||
}
|
||||
|
||||
|
||||
// -- END OF FILE --
|
@ -0,0 +1,119 @@
|
||||
//
|
||||
// FILE: ADS_1114_two_continuous.ino
|
||||
// AUTHOR: Rob.Tillaart
|
||||
// PURPOSE: demo reading four ADS1114 modules in parallel
|
||||
// URL: https://github.com/RobTillaart/ADS1X15
|
||||
|
||||
|
||||
#include "ADS1X15.h"
|
||||
|
||||
|
||||
ADS1114 ADS_1(0x49);
|
||||
ADS1114 ADS_2(0x48);
|
||||
|
||||
|
||||
// two interrupt flags
|
||||
volatile bool RDY_1 = false;
|
||||
volatile bool RDY_2 = false;
|
||||
|
||||
int16_t val_1 = 0;
|
||||
int16_t val_2 = 0;
|
||||
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);
|
||||
Serial.println(__FILE__);
|
||||
Serial.print("ADS1X15_LIB_VERSION: ");
|
||||
Serial.println(ADS1X15_LIB_VERSION);
|
||||
|
||||
|
||||
// SETUP FIRST ADS1114
|
||||
ADS_1.begin();
|
||||
ADS_1.setGain(0); // 0 == 6.144 volt, default
|
||||
ADS_1.setDataRate(7); // 7 == highest
|
||||
|
||||
// SET ALERT RDY PIN
|
||||
ADS_1.setComparatorThresholdHigh(0x8000);
|
||||
ADS_1.setComparatorThresholdLow(0x0000);
|
||||
ADS_1.setComparatorQueConvert(0);
|
||||
|
||||
// SET INTERRUPT HANDLER TO CATCH CONVERSION READY
|
||||
pinMode(2, INPUT_PULLUP);
|
||||
attachInterrupt(digitalPinToInterrupt(2), adsReady_1, RISING);
|
||||
|
||||
ADS_1.setMode(0); // 0 == continuous mode
|
||||
ADS_1.readADC(); // 0 == default channel, trigger first read
|
||||
|
||||
|
||||
// SETUP SECOND ADS1114
|
||||
ADS_2.begin();
|
||||
ADS_2.setGain(0); // 0 == 6.144 volt, default
|
||||
ADS_2.setDataRate(7); // 7 == highest
|
||||
|
||||
// SET ALERT RDY PIN
|
||||
ADS_2.setComparatorThresholdHigh(0x8000);
|
||||
ADS_2.setComparatorThresholdLow(0x0000);
|
||||
ADS_2.setComparatorQueConvert(0);
|
||||
|
||||
// SET INTERRUPT HANDLER TO CATCH CONVERSION READY
|
||||
pinMode(3, INPUT_PULLUP);
|
||||
attachInterrupt(digitalPinToInterrupt(3), adsReady_2, RISING);
|
||||
|
||||
ADS_2.setMode(0); // 0 == continuous mode
|
||||
ADS_2.readADC(); // 0 == default channel, trigger first read
|
||||
}
|
||||
|
||||
|
||||
void loop()
|
||||
{
|
||||
if (handleConversion() == true)
|
||||
{
|
||||
Serial.print('\t');
|
||||
Serial.print(val_1);
|
||||
Serial.print('\t');
|
||||
Serial.print(val_2);
|
||||
Serial.println();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// catch interrupt and set flag device 1
|
||||
void adsReady_1()
|
||||
{
|
||||
RDY_1 = true;
|
||||
}
|
||||
|
||||
// catch interrupt and set flag device 1
|
||||
void adsReady_2()
|
||||
{
|
||||
RDY_2 = true;
|
||||
}
|
||||
|
||||
|
||||
// handle conversions that are ready
|
||||
bool handleConversion()
|
||||
{
|
||||
bool rv = false;
|
||||
if (RDY_1)
|
||||
{
|
||||
// save the last value
|
||||
val_1 = ADS_1.getValue();
|
||||
ADS_1.readADC(0);
|
||||
RDY_1 = false;
|
||||
rv = true;
|
||||
}
|
||||
if (RDY_2)
|
||||
{
|
||||
// save the last value
|
||||
val_2 = ADS_2.getValue();
|
||||
ADS_2.readADC(0);
|
||||
RDY_2 = false;
|
||||
rv = true;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
// -- END OF FILE --
|
||||
|
@ -110,8 +110,9 @@ void adsReady_2()
|
||||
|
||||
|
||||
// handle conversions that are ready
|
||||
void handleConversion()
|
||||
bool handleConversion()
|
||||
{
|
||||
bool rv = false;
|
||||
if (RDY_1)
|
||||
{
|
||||
// save the last value
|
||||
@ -121,6 +122,7 @@ void handleConversion()
|
||||
if (channel_1 >= 4) channel_1 = 0;
|
||||
ADS_1.readADC(channel_1);
|
||||
RDY_1 = false;
|
||||
rv = true;
|
||||
}
|
||||
if (RDY_2)
|
||||
{
|
||||
@ -131,7 +133,9 @@ void handleConversion()
|
||||
if (channel_2 >= 4) channel_2 = 0;
|
||||
ADS_2.readADC(channel_2);
|
||||
RDY_2 = false;
|
||||
rv = true;
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
"type": "git",
|
||||
"url": "https://github.com/RobTillaart/ADS1X15"
|
||||
},
|
||||
"version": "0.3.5",
|
||||
"version": "0.3.6",
|
||||
"license": "MIT",
|
||||
"frameworks": "*",
|
||||
"platforms": "*",
|
||||
|
@ -1,5 +1,5 @@
|
||||
name=ADS1X15
|
||||
version=0.3.5
|
||||
version=0.3.6
|
||||
author=Rob Tillaart <rob.tillaart@gmail.com>
|
||||
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
|
||||
sentence=Arduino library for ADS1015 - I2C 12 bit ADC and ADS1115 I2C 16 bit ADC
|
||||
|
Loading…
Reference in New Issue
Block a user