GY-63_MS5611/libraries/MAX44007/Max44007.h

144 lines
4.1 KiB
C
Raw Normal View History

2022-01-04 15:06:58 -05:00
#pragma once
// FILE: Max44007.h
// AUTHOR: Rob Tillaart
2022-11-16 10:03:33 -05:00
// VERSION: 0.1.2
2022-01-04 15:06:58 -05:00
// PURPOSE: library for Max44007 lux sensor Arduino
// HISTORY: See Max44007.cpp
2022-11-16 10:03:33 -05:00
// breakout MAX44007
2022-01-04 15:06:58 -05:00
//
2022-11-16 10:03:33 -05:00
// +--------+
// VCC |o |
// GND |o |
// SCL |o o| ADDRESS
// SDA |o o| -INT
// +--------+
2022-01-04 15:06:58 -05:00
//
2022-11-16 10:03:33 -05:00
// ADDRESS:
// 0 = 0x4A
// 1 = 0x4B
2022-01-04 15:06:58 -05:00
//
2022-11-16 10:03:33 -05:00
// INT:
// Connect the INT pin to an pull up resistor
// 0 = interrupt
// 1 = no interrupt
// connect to an LED or an interrupt pin of an Arduino
2022-01-04 15:06:58 -05:00
//
#include "Wire.h"
#include "Arduino.h"
2022-11-16 10:03:33 -05:00
#define MAX44007_LIB_VERSION (F("0.1.2"))
2022-01-04 15:06:58 -05:00
2022-01-05 10:46:06 -05:00
#define MAX44007_DEFAULT_ADDRESS 0x5A
#define MAX44007_ALT_ADDRESS 0x5B
2022-01-04 15:06:58 -05:00
2022-11-16 10:03:33 -05:00
// REGISTERS
2022-01-05 10:46:06 -05:00
#define MAX44007_INTERRUPT_STATUS 0x00
#define MAX44007_INTERRUPT_ENABLE 0x01
#define MAX44007_CONFIGURATION 0x02
#define MAX44007_LUX_READING_HIGH 0x03
#define MAX44007_LUX_READING_LOW 0x04
#define MAX44007_THRESHOLD_HIGH 0x05
#define MAX44007_THRESHOLD_LOW 0x06
#define MAX44007_THRESHOLD_TIMER 0x07
2022-01-04 15:06:58 -05:00
2022-11-16 10:03:33 -05:00
// CONFIGURATION MASKS
2022-01-05 10:46:06 -05:00
#define MAX44007_CFG_CONTINUOUS 0x80
#define MAX44007_CFG_MANUAL 0x40
#define MAX44007_CFG_CDR 0x08
#define MAX44007_CFG_TIMER 0x07
2022-01-04 15:06:58 -05:00
2022-11-16 10:03:33 -05:00
// ERROR CODES
2022-01-05 10:46:06 -05:00
#define MAX44007_OK 0
#define MAX44007_ERROR_WIRE_REQUEST -10
#define MAX44007_ERROR_OVERFLOW -20
#define MAX44007_ERROR_HIGH_BYTE -30
#define MAX44007_ERROR_LOW_BYTE -31
2022-01-04 15:06:58 -05:00
class Max44007
{
public:
2022-11-16 10:03:33 -05:00
// enum class to prevent bool to be implicitly casted to int
2022-01-04 15:06:58 -05:00
enum class Boolean { True, False };
#if defined(ESP8266) || defined(ESP32)
2022-11-16 10:03:33 -05:00
// dataPin and clockPin can be used for ESP8266
2022-01-04 15:06:58 -05:00
Max44007(const uint8_t address, const uint8_t dataPin, const uint8_t clockPin);
#endif
2022-11-16 10:03:33 -05:00
// constructor for UNO
2022-01-04 15:06:58 -05:00
Max44007(const uint8_t address, const Boolean begin = Boolean::True);
2022-11-16 10:03:33 -05:00
// default constructor with default address
2022-01-04 15:06:58 -05:00
Max44007(const Boolean begin = Boolean::True);
2022-11-16 10:03:33 -05:00
// Change I2C interface and address
2022-01-04 15:06:58 -05:00
void configure(const uint8_t address, TwoWire *wire, const Boolean begin = Boolean::True);
bool isConnected();
float getLux();
int getError();
2022-11-16 10:03:33 -05:00
// threshold must be between 0 and 188006
bool setHighThreshold(const float value); // returns false if value out of range
2022-01-04 15:06:58 -05:00
float getHighThreshold(void);
2022-11-16 10:03:33 -05:00
bool setLowThreshold(const float value); // returns false if value out of range
2022-01-04 15:06:58 -05:00
float getLowThreshold(void);
2022-11-16 10:03:33 -05:00
void setThresholdTimer(const uint8_t value); // 2 seems practical minimum
2022-01-04 15:06:58 -05:00
uint8_t getThresholdTimer();
2022-01-05 10:46:06 -05:00
void enableInterrupt() { write(MAX44007_INTERRUPT_ENABLE, 1); };
void disableInterrupt() { write(MAX44007_INTERRUPT_ENABLE, 0); };
bool interruptEnabled() { return read(MAX44007_INTERRUPT_ENABLE) & 0x01; };
uint8_t getInterruptStatus() { return read(MAX44007_INTERRUPT_STATUS) & 0x01; };
2022-01-04 15:06:58 -05:00
2022-11-16 10:03:33 -05:00
// check datasheet for detailed behavior
2022-01-04 15:06:58 -05:00
void setConfiguration(uint8_t);
uint8_t getConfiguration();
void setAutomaticMode();
2022-11-16 10:03:33 -05:00
void setContinuousMode(); // uses more power
void clrContinuousMode(); // uses less power
// CDR = Current Divisor Ratio
// CDR = 1 ==> only 1/8th is measured
// TIM = Time Integration Measurement (table)
// 000 800ms
// 001 400ms
// 010 200ms
// 011 100ms
// 100 50ms manual only
// 101 25ms manual only
// 110 12.5ms manual only
// 111 6.25ms manual only
2022-01-04 15:06:58 -05:00
void setManualMode(uint8_t CDR, uint8_t TIM);
2022-11-16 10:03:33 -05:00
int getIntegrationTime() { return 800 >> (getConfiguration() & 0x07); }; // ms
2022-01-04 15:06:58 -05:00
2022-11-16 10:03:33 -05:00
// TEST the math
2022-01-04 15:06:58 -05:00
float convertToLux(uint8_t datahigh, uint8_t datalow);
protected:
bool setThreshold(uint8_t reg, float value);
float getThreshold(uint8_t reg);
uint8_t read(uint8_t reg);
void write(uint8_t reg, uint8_t value);
uint8_t _address;
uint8_t _data;
int _error;
TwoWire* _wire;
};
// -- END OF FILE --