0.6.0 Max44009

This commit is contained in:
Rob Tillaart 2023-10-04 10:47:20 +02:00
parent 485efe5abf
commit 877d392562
15 changed files with 101 additions and 113 deletions

View File

@ -6,12 +6,19 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/). and this project adheres to [Semantic Versioning](http://semver.org/).
## [0.6.0] - 2023-10-02
- refactor constructor around I2C interface (simpler)
- remove **configure()**
- update readme.md
- update examples
----
## [0.5.3] - 2022-11-16 ## [0.5.3] - 2022-11-16
- add RP2040 in build-CI - add RP2040 in build-CI
- add changelog.md - add changelog.md
- minor edit readme.md - minor edit readme.md
## [0.5.2] - 2022-01-05 ## [0.5.2] - 2022-01-05
- minor edits after creating Max44007 library - minor edits after creating Max44007 library

View File

@ -1,10 +1,11 @@
#pragma once #pragma once
// FILE: Max44009.h // FILE: Max44009.h
// AUTHOR: Rob dot Tillaart at gmail dot com // AUTHOR: Rob Tillaart
// VERSION: 0.5.3 // VERSION: 0.6.0
// DATE: 2010-??-??
// PURPOSE: library for MAX44009 lux sensor Arduino // PURPOSE: library for MAX44009 lux sensor Arduino
// HISTORY: See changelog.md
// breakout MAX44009 / GY-49 // breakout MAX44009 / GY-49
@ -32,7 +33,7 @@
#include "Arduino.h" #include "Arduino.h"
#define MAX44009_LIB_VERSION (F("0.5.3")) #define MAX44009_LIB_VERSION (F("0.6.0"))
#define MAX44009_DEFAULT_ADDRESS 0x4A #define MAX44009_DEFAULT_ADDRESS 0x4A
#define MAX44009_ALT_ADDRESS 0x4B #define MAX44009_ALT_ADDRESS 0x4B
@ -67,20 +68,7 @@
class Max44009 class Max44009
{ {
public: public:
// enum class to prevent bool to be implicitly casted to int Max44009(const uint8_t address = MAX44009_DEFAULT_ADDRESS, TwoWire *wire = &Wire);
enum class Boolean { True, False };
#if defined(ESP8266) || defined(ESP32)
// dataPin and clockPin can be used for ESP8266
Max44009(const uint8_t address, const uint8_t dataPin, const uint8_t clockPin);
#endif
// constructor for UNO
Max44009(const uint8_t address, const Boolean begin = Boolean::True);
// default constructor with default address
Max44009(const Boolean begin = Boolean::True);
// Change I2C interface and address
void configure(const uint8_t address, TwoWire *wire, const Boolean begin = Boolean::True);
bool isConnected(); bool isConnected();
float getLux(); float getLux();
@ -105,7 +93,6 @@ public:
void setAutomaticMode(); void setAutomaticMode();
void setContinuousMode(); // uses more power void setContinuousMode(); // uses more power
void clrContinuousMode(); // uses less power void clrContinuousMode(); // uses less power
// CDR = Current Divisor Ratio // CDR = Current Divisor Ratio
// CDR = 1 ==> only 1/8th is measured // CDR = 1 ==> only 1/8th is measured
// TIM = Time Integration Measurement (table) // TIM = Time Integration Measurement (table)

View File

@ -16,7 +16,8 @@ uint32_t lastDisplay = 0;
void setup() void setup()
{ {
Serial.begin(115200); Serial.begin(115200);
Serial.print("\nStart max44009_interrupt : "); Serial.println(__FILE__);
Serial.print("MAX44009_LIB_VERSION: ");
Serial.println(MAX44009_LIB_VERSION); Serial.println(MAX44009_LIB_VERSION);
Wire.begin(); Wire.begin();

View File

@ -16,7 +16,8 @@ uint32_t lastDisplay = 0;
void setup() void setup()
{ {
Serial.begin(115200); Serial.begin(115200);
Serial.print("\nStart max44009_setAutomaticMode : "); Serial.println(__FILE__);
Serial.print("MAX44009_LIB_VERSION: ");
Serial.println(MAX44009_LIB_VERSION); Serial.println(MAX44009_LIB_VERSION);
Wire.begin(); Wire.begin();

View File

@ -25,7 +25,8 @@ int count = 0;
void setup() void setup()
{ {
Serial.begin(115200); Serial.begin(115200);
Serial.print("\nStart max44009_setContinuousMode : "); Serial.println(__FILE__);
Serial.print("MAX44009_LIB_VERSION: ");
Serial.println(MAX44009_LIB_VERSION); Serial.println(MAX44009_LIB_VERSION);
Wire.begin(); Wire.begin();

View File

@ -19,7 +19,8 @@ uint8_t TIM = 0;
void setup() void setup()
{ {
Serial.begin(115200); Serial.begin(115200);
Serial.print("\nStart max44009_setManualMode : "); Serial.println(__FILE__);
Serial.print("MAX44009_LIB_VERSION: ");
Serial.println(MAX44009_LIB_VERSION); Serial.println(MAX44009_LIB_VERSION);
Wire.begin(); Wire.begin();

View File

@ -29,7 +29,8 @@ uint32_t lastDisplay = 0;
void setup() void setup()
{ {
Serial.begin(115200); Serial.begin(115200);
Serial.print("Start max44009_test01 : "); Serial.println(__FILE__);
Serial.print("MAX44009_LIB_VERSION: ");
Serial.println(MAX44009_LIB_VERSION); Serial.println(MAX44009_LIB_VERSION);
Wire.begin(); Wire.begin();

View File

@ -16,10 +16,10 @@
#include "Max44009.h" #include "Max44009.h"
// Don't begin I2C interface (Wire). Will be called in setup() // Don't begin I2C interface (Wire). Will be called in setup()
Max44009 myLuxA(Max44009::Boolean::False); Max44009 myLuxA(MAX44009_DEFAULT_ADDRESS, &Wire);
Max44009 myLuxB(Max44009::Boolean::False); Max44009 myLuxB(MAX44009_ALT_ADDRESS, &Wire);
Max44009 myLuxC(Max44009::Boolean::False); Max44009 myLuxC(MAX44009_DEFAULT_ADDRESS, &Wire1);
Max44009 myLuxD(Max44009::Boolean::False); Max44009 myLuxD(MAX44009_ALT_ADDRESS, &Wire1);
uint32_t lastDisplay = 0; uint32_t lastDisplay = 0;
@ -27,15 +27,12 @@ uint32_t lastDisplay = 0;
void setup() void setup()
{ {
Serial.begin(115200); Serial.begin(115200);
Serial.print("Start max44009_test02 : "); Serial.println(__FILE__);
Serial.print("MAX44009_LIB_VERSION: ");
Serial.println(MAX44009_LIB_VERSION); Serial.println(MAX44009_LIB_VERSION);
Wire.begin(19, 18); Wire.begin(19, 18);
Wire1.begin(22, 23); Wire1.begin(22, 23);
myLuxA.configure(MAX44009_DEFAULT_ADDRESS, &Wire);
myLuxB.configure(MAX44009_ALT_ADDRESS, &Wire);
myLuxC.configure(MAX44009_DEFAULT_ADDRESS, &Wire1);
myLuxD.configure(MAX44009_ALT_ADDRESS, &Wire1);
} }

View File

@ -18,7 +18,8 @@ uint32_t count = 0;
void setup() void setup()
{ {
Serial.begin(115200); Serial.begin(115200);
Serial.print("Start max44009_two_sensors : "); Serial.println(__FILE__);
Serial.print("MAX44009_LIB_VERSION: ");
Serial.println(MAX44009_LIB_VERSION); Serial.println(MAX44009_LIB_VERSION);
Wire.begin(); Wire.begin();

View File

@ -5,7 +5,6 @@ Max44009 KEYWORD1
# Methods and Functions (KEYWORD2) # Methods and Functions (KEYWORD2)
configure KEYWORD2
isConnected KEYWORD2 isConnected KEYWORD2
getLux KEYWORD2 getLux KEYWORD2
getError KEYWORD2 getError KEYWORD2

View File

@ -15,9 +15,9 @@
"type": "git", "type": "git",
"url": "https://github.com/RobTillaart/Max44009.git" "url": "https://github.com/RobTillaart/Max44009.git"
}, },
"version": "0.5.3", "version": "0.6.0",
"license": "MIT", "license": "MIT",
"frameworks": "arduino", "frameworks": "*",
"platforms": "*", "platforms": "*",
"headers": "Max44009.h" "headers": "Max44009.h"
} }

View File

@ -1,9 +1,9 @@
name=Max44009 name=Max44009
version=0.5.3 version=0.6.0
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=Library for MAX44009 I2C LUX sensor Arduino. sentence=Library for MAX44009 I2C LUX sensor Arduino.
paragraph= paragraph=
category=Sensors category=Sensors
url=https://github.com/RobTillaart/Max44009 url=https://github.com/RobTillaart/Max44009
architectures=* architectures=*

View File

@ -1,12 +1,10 @@
// //
// FILE: Max44009.cpp // FILE: Max44009.cpp
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// VERSION: 0.5.3 // VERSION: 0.6.0
// DATE: 2010-??-??
// PURPOSE: library for MAX44009 lux sensor Arduino // PURPOSE: library for MAX44009 lux sensor Arduino
// URL: https://github.com/RobTillaart/MAX44009 // URL: https://github.com/RobTillaart/MAX44009
//
// HISTORY: see changelog.md
#include "Max44009.h" #include "Max44009.h"
@ -16,47 +14,12 @@
#define MAX44009_MAX_LUX (188006.0) #define MAX44009_MAX_LUX (188006.0)
#if defined(ESP8266) || defined(ESP32) Max44009::Max44009(const uint8_t address, TwoWire *wire)
Max44009::Max44009(const uint8_t address, const uint8_t dataPin, const uint8_t clockPin)
{
_address = address;
_data = 0;
_error = MAX44009_OK;
_wire = &Wire;
if ((dataPin < 255) && (clockPin < 255))
{
_wire->begin(dataPin, clockPin);
} else {
_wire->begin();
}
}
#endif
Max44009::Max44009(const uint8_t address, const Boolean begin)
{
Max44009::configure(address, &Wire, begin);
}
Max44009::Max44009(const Boolean begin)
{
Max44009::configure(MAX44009_DEFAULT_ADDRESS, &Wire, begin);
}
void Max44009::configure(const uint8_t address, TwoWire *wire, const Boolean begin)
{ {
_address = address; _address = address;
_data = 0; _data = 0;
_error = MAX44009_OK; _error = MAX44009_OK;
_wire = wire; _wire = wire;
if (begin == Boolean::True)
{
_wire->begin();
}
} }

View File

@ -1,9 +1,12 @@
[![Arduino CI](https://github.com/RobTillaart/MAX44009/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci) [![Arduino CI](https://github.com/RobTillaart/MAX44009/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
[![Arduino-lint](https://github.com/RobTillaart/Max44009/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/Max44009/actions/workflows/arduino-lint.yml) [![Arduino-lint](https://github.com/RobTillaart/MAX44009/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/MAX44009/actions/workflows/arduino-lint.yml)
[![JSON check](https://github.com/RobTillaart/Max44009/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/Max44009/actions/workflows/jsoncheck.yml) [![JSON check](https://github.com/RobTillaart/MAX44009/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/MAX44009/actions/workflows/jsoncheck.yml)
[![GitHub issues](https://img.shields.io/github/issues/RobTillaart/MAX44009.svg)](https://github.com/RobTillaart/MAX44009/issues)
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/MAX44009/blob/master/LICENSE) [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/MAX44009/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/release/RobTillaart/MAX44009.svg?maxAge=3600)](https://github.com/RobTillaart/MAX44009/releases) [![GitHub release](https://img.shields.io/github/release/RobTillaart/MAX44009.svg?maxAge=3600)](https://github.com/RobTillaart/MAX44009/releases)
[![PlatformIO Registry](https://badges.registry.platformio.org/packages/robtillaart/library/MAX44009.svg)](https://registry.platformio.org/libraries/robtillaart/MAX44009)
# MAX44009 I2C LUX sensor # MAX44009 I2C LUX sensor
@ -15,10 +18,20 @@ Library for MAX44009 / GY-49 I2C lux sensor.
a.k.a. GY-49 a.k.a. GY-49
The MAX44009 ambient light sensor is an I2C sensor, that has a 22 bit The MAX44009 ambient light sensor is an I2C sensor, that has a 22 bit
dynamic range from 0.045 lux to 188,000 lux. dynamic range from 0.045 lux to 188,000 lux.
Relates to https://github.com/RobTillaart/Max44007
#### MAX44007
The MAX44007 is an almost identical sensor that uses a step size of 0.025.
This implies that this library is not useable 1 to 1 for the MAX44007, however some parts will work/
#### Related
- https://github.com/RobTillaart/Max44007 (range 0.025 lux to 104,448 lux)
- https://github.com/RobTillaart/Max44009 (range 0.045 lux to 188,000 lux)
## Schema breakout max44009 / GY-49 ## Schema breakout max44009 / GY-49
@ -49,21 +62,22 @@ Relates to https://github.com/RobTillaart/Max44007
## Interface ## Interface
- **enum class Boolean { True, False }** enum class to prevent bool to be implicitly casted to int. ```cpp
#include "Max44009.h"
```
### Constructor
### Constructor - **Max44009(const uint8_t address = MAX44009_DEFAULT_ADDRESS, TwoWire \*wire = &Wire)** Constructor.
Optional address and optional I2C interface.\
- **Max44009(uint8_t address, uint8_t dataPin, uint8_t clockPin)** Constructor with dataPin (sda) and clockPin (scl) for ESP32 and ESP8266.
- **Max44009(uint8_t address, begin = Boolean::True)** Constructor for other boards e.g. UNO.
- **Max44009(begin = Boolean::True)** Constructor with default I2C address 0x4A == 74.
- **void configure(uint8_t address, TwoWire \*wire, begin = Boolean::True)** Change I2C interface and address.
- **bool isConnected()** returns true if the device address configured is available on I2C bus. - **bool isConnected()** returns true if the device address configured is available on I2C bus.
NOTE: The user must call **Wire.begin()** or **Wire.begin(SDA, SCL)** in **setup()**.
### Basic
- **float getLux()** read the sensor and return the value in LUX. If the value is negative, an error has occurred. ### Basic
- **float getLux()** read the sensor and return the value in LUX. If the value is negative, an error has occurred.
- **int getError()** returns last error. - **int getError()** returns last error.
```cpp ```cpp
@ -80,15 +94,15 @@ Relates to https://github.com/RobTillaart/Max44007
check datasheet for details check datasheet for details
- **bool setHighThreshold(float value)** sets the upper threshold for the interrupt - **bool setHighThreshold(float value)** sets the upper threshold for the interrupt
generation (INT pulls LOW). Works only if INTE bit is set by **enableInterrupt()**. generation (INT pulls LOW). Works only if INTE bit is set by **enableInterrupt()**.
Function returns false if the value is out of range. Function returns false if the value is out of range.
- **float getHighThreshold()** returns the value set. - **float getHighThreshold()** returns the value set.
- **bool setLowThreshold(float value)** sets the lower threshold for the interrupt - **bool setLowThreshold(float value)** sets the lower threshold for the interrupt
generation (INT pulls LOW). Works only if INTE bit is set by **enableInterrupt()**. generation (INT pulls LOW). Works only if INTE bit is set by **enableInterrupt()**.
Function returns false if the value is out of range. Function returns false if the value is out of range.
- **float getLowThreshold()** returns the value set. - **float getLowThreshold()** returns the value set.
- **void setThresholdTimer(uint8_t value)** Time the threshold needs to be exceeded, - **void setThresholdTimer(uint8_t value)** Time the threshold needs to be exceeded,
defined in steps of 100ms. 2 seems to be a practical minimum. defined in steps of 100ms. 2 seems to be a practical minimum.
- **uint8_t getThresholdTimer()** returns the value set. - **uint8_t getThresholdTimer()** returns the value set.
@ -107,7 +121,7 @@ check datasheet for details
check datasheet for details check datasheet for details
- **void setConfiguration(uint8_t)** writes directly to configuration register. - **void setConfiguration(uint8_t)** writes directly to configuration register.
**warning** Use with care. **warning** Use with care.
- **uint8_t getConfiguration()** reads the current configuration register. - **uint8_t getConfiguration()** reads the current configuration register.
@ -120,12 +134,12 @@ CCR = Current Divisor Ratio.
TIM = Integration time. TIM = Integration time.
- **void setAutomaticMode()** in automatic mode the MAX44009 determines the CDR and TIM - **void setAutomaticMode()** in automatic mode the MAX44009 determines the CDR and TIM
parameters. parameters.
- **void setContinuousMode()** continuous mode uses more power than a "single" conversion. - **void setContinuousMode()** continuous mode uses more power than a "single" conversion.
Advantage is that the latest data is always available fast. Advantage is that the latest data is always available fast.
- **void clrContinuousMode()** uses less power so better for LOW power configurations. - **void clrContinuousMode()** uses less power so better for LOW power configurations.
- **void setManualMode(uint8_t CDR, uint8_t TIM)** Set the Current Divisor Ratio and the - **void setManualMode(uint8_t CDR, uint8_t TIM)** Set the Current Divisor Ratio and the
integration time manually. Effectively disable automatic mode. integration time manually. Effectively disable automatic mode.
- **int getIntegrationTime()** returns the set integration time in milliseconds - **int getIntegrationTime()** returns the set integration time in milliseconds
@ -147,11 +161,11 @@ integration time manually. Effectively disable automatic mode.
### Test functions ### Test functions
Function for the conversion math, not meant to be used directly, Function for the conversion math, not meant to be used directly,
but by making them public they become testable. but by making them public they become testable.
- **float convertToLux(uint8_t datahigh, uint8_t datalow)** convert intern register - **float convertToLux(uint8_t dataHigh, uint8_t dataLow)** convert intern register
format to a LUX value. format to a LUX value.
## Examples ## Examples
@ -167,22 +181,36 @@ format to a LUX value.
## Notes ## Notes
Please be aware this is a **3.3 Volt device** so it should not be connected Please be aware this is a **3.3 Volt device** so it should not be connected
to an Arduino UNO or other 5 Volt device directly. to an Arduino UNO or other 5 Volt device directly.
Use a level convertor to solve this. Use a level convertor to solve this.
Do not forget to connect the address pin as you cannot read the sensor Do not forget to connect the address pin as you cannot read the sensor
in a reliable way. As the line will float it will sometimes have the in a reliable way. As the line will float it will sometimes have the
right address and sometimes not. (been there ;) right address and sometimes not. (been there ;)
Pull ups on I2C bus are recommended.
## Future ## Future
#### Must
- improve documentation - improve documentation
- merge MAX44007 library in the future. (shared base class?)
#### Should
#### Could
- merge MAX44007 / MAX44009 library in the future. (shared base class?)
#### Wont
#### MAX44007 ## Support
The MAX44007 is an almost identical sensor that uses a step size of 0.025. If you appreciate my libraries, you can support the development and maintenance.
This implies that this library is not useable 1 to 1 for the MAX44007, however some parts will work/ Improve the quality of the libraries by providing issues and Pull Requests, or
donate through PayPal or GitHub sponsors.
Thank you,

View File

@ -104,4 +104,5 @@ unittest(test_convertToLux)
unittest_main() unittest_main()
// --------
// -- END OF FILE --