0.4.3 AM232X

This commit is contained in:
rob tillaart 2022-06-18 09:51:07 +02:00
parent 5fa29c20a1
commit f89e90f02a
7 changed files with 157 additions and 39 deletions

View File

@ -1,7 +1,7 @@
// //
// FILE: AM232X.cpp // FILE: AM232X.cpp
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// VERSION: 0.4.1 // VERSION: 0.4.3
// PURPOSE: AM232X library for AM2320 for Arduino. // PURPOSE: AM232X library for AM2320 for Arduino.
// //
// HISTORY: // HISTORY:
@ -31,7 +31,11 @@
// added some unit tests // added some unit tests
// fix _lastRead bug // fix _lastRead bug
// minor edits. // minor edits.
// 0.4.3 2022-06-17 add get/setSuppressError()
// add AM232X_HUMIDITY_OUT_OF_RANGE
// add AM232X_TEMPERATURE_OUT_OF_RANGE
// fix return -0.0 (from AM2315 lib)
// major rewrite readme.md (sync AM2315)
#include "AM232X.h" #include "AM232X.h"
@ -44,7 +48,6 @@ const uint8_t AM232X_ADDRESS = 0x5C;
// //
// PUBLIC // PUBLIC
// //
AM232X::AM232X(TwoWire *wire) AM232X::AM232X(TwoWire *wire)
{ {
_wire = wire; _wire = wire;
@ -55,6 +58,7 @@ AM232X::AM232X(TwoWire *wire)
_tempOffset = 0.0; _tempOffset = 0.0;
_lastRead = 0; _lastRead = 0;
_readDelay = 2000; _readDelay = 2000;
_suppressError = false;
} }
@ -104,18 +108,49 @@ int AM232X::read()
return AM232X_READ_TOO_FAST; return AM232X_READ_TOO_FAST;
} }
_lastRead = millis(); _lastRead = millis();
// READ HUMIDITY AND TEMPERATURE REGISTERS // READ HUMIDITY AND TEMPERATURE REGISTERS
int rv = _readRegister(0x00, 4); int rv = _readRegister(0x00, 4);
if (rv < 0) return rv; if (rv < 0) return rv;
// CONVERT AND STORE if (rv != AM232X_OK)
_humidity = (_bits[2] * 256 + _bits[3]) * 0.1;
_temperature = ((_bits[4] & 0x7F) * 256 + _bits[5]) * 0.1;
if (_bits[4] & 0x80)
{ {
_temperature = -_temperature; if (_suppressError == false)
{
_humidity = AM232X_INVALID_VALUE;
_temperature = AM232X_INVALID_VALUE;
}
return rv; // propagate error value
} }
// EXTRACT HUMIDITY AND TEMPERATURE
_humidity = (_bits[2] * 256 + _bits[3]) * 0.1;
int16_t t = ((_bits[4] & 0x7F) * 256 + _bits[5]);
if (t == 0)
{
_temperature = 0.0; // prevent -0.0;
}
else
{
_temperature = t * 0.1;
if ((_bits[4] & 0x80) == 0x80 )
{
_temperature = -_temperature;
}
}
#ifdef AM232X_VALUE_OUT_OF_RANGE
// TEST OUT OF RANGE
if (_humidity > 100)
{
return AM232X_HUMIDITY_OUT_OF_RANGE;
}
if ((_temperature < -40) || (_temperature > 80))
{
return AM232X_TEMPERATURE_OUT_OF_RANGE;
}
#endif
return AM232X_OK; return AM232X_OK;
} }

View File

@ -3,7 +3,7 @@
// FILE: AM232X.h // FILE: AM232X.h
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// PURPOSE: AM232X Temperature and Humidity sensor library for Arduino // PURPOSE: AM232X Temperature and Humidity sensor library for Arduino
// VERSION: 0.4.2 // VERSION: 0.4.3
// URL: https://github.com/RobTillaart/AM232X // URL: https://github.com/RobTillaart/AM232X
// //
// AM232X PIN layout AM2315 COLOR // AM232X PIN layout AM2315 COLOR
@ -23,7 +23,7 @@
#include "Wire.h" #include "Wire.h"
#define AM232X_LIB_VERSION (F("0.4.2")) #define AM232X_LIB_VERSION (F("0.4.3"))
#define AM232X_OK 0 #define AM232X_OK 0
@ -49,6 +49,20 @@
0x84: Write disabled 0x84: Write disabled
*/ */
// optionally detect out of range values.
// occurs seldom so not enabled by default.
// #define AM232X_VALUE_OUT_OF_RANGE
#define AM232X_HUMIDITY_OUT_OF_RANGE -100
#define AM232X_TEMPERATURE_OUT_OF_RANGE -101
// allows to overrule AM232X_INVALID_VALUE e.g. to prevent spike in graphs.
#ifndef AM232X_INVALID_VALUE
#define AM232X_INVALID_VALUE -999
#endif
class AM232X class AM232X
{ {
public: public:
@ -92,6 +106,10 @@ public:
float getHumOffset() { return _humOffset; }; float getHumOffset() { return _humOffset; };
float getTempOffset() { return _tempOffset; }; float getTempOffset() { return _tempOffset; };
// suppress error values of -999 => check return value of read() instead
bool getSuppressError() { return _suppressError; };
void setSuppressError(bool b) { _suppressError = b; };
bool wakeUp() { return isConnected(); }; bool wakeUp() { return isConnected(); };
protected: protected:
@ -103,6 +121,8 @@ protected:
uint32_t _lastRead = 0; uint32_t _lastRead = 0;
uint16_t _readDelay = 2000; uint16_t _readDelay = 2000;
bool _suppressError = false;
int _readRegister(uint8_t reg, uint8_t cnt); int _readRegister(uint8_t reg, uint8_t cnt);
int _writeRegister(uint8_t reg, uint8_t cnt, int16_t value); int _writeRegister(uint8_t reg, uint8_t cnt, int16_t value);
int _getData(uint8_t length); int _getData(uint8_t length);

View File

@ -19,16 +19,20 @@ the AM232X has a fixed address **0x5C** so one need to implement a
multiplexing strategy to have multiple sensors in practice. multiplexing strategy to have multiple sensors in practice.
See multiplexing below. See multiplexing below.
This library works also for the **AM2315** which has a library of its own - https://github.com/RobTillaart/AM2315
Typical parameters
#### Typical parameters
| | range | accuracy | repeatability | | | range | accuracy | repeatability |
|:------------|:----------:|:--------:|:-------------:| |:------------|:----------:|:--------:|:-------------:|
| Temperature | -40 - 80 | 0.5°C | ±0.1 | | Temperature | -40 - 80 | 0.5°C | ±0.1 |
| Humidity | 0.0 - 99.9 | 3% | ±0.1 | | Humidity | 0.0 - 99.9 | ±3% | ±0.1 |
| Sample time | 2 seconds | | | | Sample time | 2 seconds | | |
#### Hardware connection
``` ```
// AM232X PIN layout AM2315 COLOR // AM232X PIN layout AM2315 COLOR
// ============================================ // ============================================
@ -43,7 +47,12 @@ Typical parameters
// do not forget pull up resistors between SDA, SCL and VDD. // do not forget pull up resistors between SDA, SCL and VDD.
``` ```
This library works for the **AM2315** which has a library of its own - https://github.com/RobTillaart/AM2315
### I2C clock speed
The datasheet states the AM2320 should be used on 100 KHz I2C only.
TODO measure and verify (see AM2315)
## Interface ## Interface
@ -53,20 +62,27 @@ Since 0.4.2 the library provides specific classes for the AM2320, AM2321 and AM2
### Constructor ### Constructor
- **AM232X(TwoWire \*wire = &Wire)** constructor, optionally set Wire0..WireN. Default is Wire. - **AM232X(TwoWire \*wire = &Wire)** constructor, default using Wire (I2C bus), optionally set to Wire0 .. WireN.
- **bool begin(uint8_t sda, uint8_t scl)** for ESP32 alike devices, returns true if device address 0x5C is connected. - **bool begin(uint8_t dataPin, uint8_t clockPin)** begin for ESP32 et al, to set I2C bus pins.
- **bool begin()** for AVR alike devices, returns true if device address 0x5C is connected. Returns true if device address 0x5C is connected.
- **bool isConnected(uint16_t timeout = 3000)** returns true if device address 0x5C is found on I2C bus. - **bool begin()** initializer for non ESP32 e.g. AVR.
Returns true if device address 0x5C is connected.
- **bool isConnected(uint16_t timeout = 3000)** returns true if the device address 0x5C is found on I2C bus.
As the device can be in sleep modus it will retry for the defined timeout (in micros) with a minimum of 1 try. As the device can be in sleep modus it will retry for the defined timeout (in micros) with a minimum of 1 try.
minimum = 800 us and maximum = 3000 us according to datasheet. minimum = 800 us and maximum = 3000 us according to datasheet.
### Base calls ### Core
- **int read()** fetches the values from the sensor. - **int read()** read the sensor and store the values internally.
- **uint32_t lastRead()** returns milliseconds since start of last read. Returns the status of the read which should be **AM232X_OK** == 0.
- **float getHumidity()** returns the last read humidity. - **float getHumidity()** returns the last read humidity + optional offset,
- **float getTemperature()** returns the last read temperature. or **AM232X_INVALID_VALUE** == -999 in case of error.
This error can be suppressed, see below.
- **float getTemperature()** returns the last read temperature + optional offset,
or **AM232X_INVALID_VALUE** == -999 in case of error.
This error can be suppressed, see below.
- **uint32_t lastRead()** returns the timestamp in milliseconds since startup of the last successful read.
### Offset ### Offset
@ -81,15 +97,17 @@ Default offset = 0, so no parameter will reset the offset.
### Control ### Control
Functions to adjust the interval time the sensor may be called again. Functions to adjust the communication with the sensor.
Default = 2000 ms (from datasheet).
- **void setReadDelay(uint16_t rd = 0)** Tunes the time it waits before actual read can be done. - **void setReadDelay(uint16_t rd = 0)** Tunes the time it waits before actual read can be done.
Set readDelay to 0 will reset it to 2000 ms effictive the next **read()**. Set readDelay to 0 will reset it to 2000 ms effective the next **read()**.
- **uint16_t getReadDelay()** returns the above setting. - **uint16_t getReadDelay()** returns the above setting.
Note that a value of zero (reset) will return 0 before the call and 2000 after the call to **read()**. Note that a value of zero (reset) will return 0 before the call and 2000 after the call to **read()**.
- **bool wakeUp()** function that will try for 3 milliseconds to wake up the sensor. - **bool wakeUp()** function that will try for 3 milliseconds to wake up the sensor.
This can be done before an actual read to minimize the **read()** call. This can be done before an actual read to minimize the **read()** call.
- **void setSuppressError(bool b)** suppress error values of **AM232X_INVALID_VALUE** == -999 => you need to check the return value of read() instead.
This can be used to keep spikes out of your graphs / logs.
- **bool getSuppressError()** returns the above setting.
### Metadata ### Metadata
@ -113,6 +131,27 @@ Check datasheet for details.
- **int getUserRegisterB()** - **int getUserRegisterB()**
### Error codes
| name | value | notes |
|:----------------------------------|------:|:------------|
| AM232X_OK | 0 |
| AM232X_ERROR_UNKNOWN | -10 |
| AM232X_ERROR_CONNECT | -11 |
| AM232X_ERROR_FUNCTION | -12 |
| AM232X_ERROR_ADDRESS | -13 |
| AM232X_ERROR_REGISTER | -14 |
| AM232X_ERROR_CRC_1 | -15 |
| AM232X_ERROR_CRC_2 | -16 |
| AM232X_ERROR_WRITE_DISABLED | -17 |
| AM232X_ERROR_WRITE_COUNT | -18 |
| AM232X_MISSING_BYTES | -19 |
| AM232X_READ_TOO_FAST | -20 |
| AM232X_HUMIDITY_OUT_OF_RANGE | -100 | not used by default.
| AM232X_TEMPERATURE_OUT_OF_RANGE | -101 | not used by default.
| AM232X_INVALID_VALUE | -999 | can be suppressed.
## Operation ## Operation
See examples See examples
@ -122,8 +161,8 @@ the Wire library and do an initial **read()** to fill the variables temperature
To access these values one must use **getTemperature()** and **getHumidity()**. To access these values one must use **getTemperature()** and **getHumidity()**.
Multiple calls will give the same values until **read()** is called again. Multiple calls will give the same values until **read()** is called again.
Note that the sensor can go into sleep mode and one might need to call **wakeUp()** Note that the sensor can go into sleep mode after 3 seconds after last read,
before the **read()**. so one might need to call **wakeUp()** before the **read()**.
## Multiplexing ## Multiplexing
@ -138,22 +177,22 @@ the sensor takes to boot and to be ready for the first measurement.
pin of the sensors. This way one can enable / disable communication pin of the sensors. This way one can enable / disable communication
per sensor. This will still need an IO pin per sensor but does not per sensor. This will still need an IO pin per sensor but does not
have the "boot time" constraint mentioned above. have the "boot time" constraint mentioned above.
you may use a **PCF8574** to control these AND ports. you may use a **PCF8574** to control the AND gates.
https://github.com/RobTillaart/PCF8574
3. Use a **TCA9548A** I2C Multiplexer, or similar. https://github.com/RobTillaart/TCA9548 3. Use a **TCA9548A** I2C Multiplexer, or similar. https://github.com/RobTillaart/TCA9548
Which method fit your application depends on your requirements and constraints. Which method fit your application depends on your requirements and constraints.
## Warning
The library has not been tested extensively yet so use at own risk.
See also LICENSE
## Future ## Future
- update documentation - update documentation
- test more (other platforms) - test more (other platforms)
- keep in sync with AM2315 class - keep in sync with AM2315 class
- merge in a far future.
- update unit test
- add examples
- I2C performance measurements
- clock speed > 170 - see AM2315

View File

@ -35,6 +35,8 @@ getReadDelay KEYWORD2
setReadDelay KEYWORD2 setReadDelay KEYWORD2
lastRead KEYWORD2 lastRead KEYWORD2
getSuppressError KEYWORD2
setSuppressError KEYWORD2
# Constants (LITERAL1) # Constants (LITERAL1)
AM232X_LIB_VERSION LITERAL1 AM232X_LIB_VERSION LITERAL1
@ -52,3 +54,8 @@ AM232X_ERROR_WRITE_COUNT LITERAL1
AM232X_MISSING_BYTES LITERAL1 AM232X_MISSING_BYTES LITERAL1
AM232X_READ_TOO_FAST LITERAL1 AM232X_READ_TOO_FAST LITERAL1
AM232X_HUMIDITY_OUT_OF_RANGE LITERAL1
AM232X_TEMPERATURE_OUT_OF_RANGE LITERAL1
AM232X_INVALID_VALUE LITERAL1

View File

@ -15,7 +15,7 @@
"type": "git", "type": "git",
"url": "https://github.com/RobTillaart/AM232X" "url": "https://github.com/RobTillaart/AM232X"
}, },
"version": "0.4.2", "version": "0.4.3",
"license": "MIT", "license": "MIT",
"frameworks": "arduino", "frameworks": "arduino",
"platforms": "*", "platforms": "*",

View File

@ -1,5 +1,5 @@
name=AM232X name=AM232X
version=0.4.2 version=0.4.3
author=Rob Tillaart <rob.tillaart@gmail.com> author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com> maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Arduino library for AM2320 AM2321 and AM2323 I2C temperature and humidity sensor. sentence=Arduino library for AM2320 AM2321 and AM2323 I2C temperature and humidity sensor.

View File

@ -154,6 +154,23 @@ unittest(test_AM2322_hum_temp)
} }
unittest(test_AM232X_surpress_error)
{
AM232X AM;
Wire.begin();
assertTrue(AM.begin());
assertTrue(AM.isConnected());
assertFalse(AM.getSuppressError());
AM.setSuppressError(true);
assertTrue(AM.getSuppressError());
AM.setSuppressError(false);
assertFalse(AM.getSuppressError());
}
unittest_main() unittest_main()
// -------- // --------