12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #include "gy49.h"
- // MAX44009 I2C address is 0x4A/0x4B
- #define GY49_ADDR 0x4A
- /* Private variables */
- static bool isPresent;
- static Timer dataTimer;
- static uint32_t Luminance;
- /* Private Fuctions */
- void _read_data(void);
- /**
- * @brief Initialization
- */
- void GY49_Init(void) {
- // Start I2C Transmission
- Wire.beginTransmission(GY49_ADDR);
- // Select configuration register
- Wire.write(0x02);
- // Continuous mode, Integration time = 800 ms
- Wire.write(0x40);
- // Stop I2C transmission
- if (Wire.endTransmission()) {
- Serial.println("GY-49: Sensor not respond!");
- isPresent = false;
- return;
- }
- isPresent = true;
- // start polling sensors - once per two seconds
- dataTimer.initializeMs(1000, _read_data).start();
- }
- void _read_data(void) {
- if (!isPresent) { return; }
- unsigned int data[2] = {0};
- // Start I2C Transmission
- Wire.beginTransmission(GY49_ADDR);
- // Select data register
- Wire.write(0x03);
- // Stop I2C transmission
- Wire.endTransmission();
- // Request 2 bytes of data
- Wire.requestFrom(GY49_ADDR, 2);
- // Read 2 bytes of data
- // luminance msb, luminance lsb
- if (Wire.available() == 2) {
- data[0] = Wire.read();
- data[1] = Wire.read();
- } else {
- Serial.println("GY-49: No data from sensor.");
- return;
- }
- // Convert the data to microLux
- uint32_t exponent = 1 << ((data[0] & 0xF0) >> 4);
- uint32_t mantissa = ((data[0] & 0x0F) << 4) | (data[1] & 0x0F);
- Luminance = exponent * mantissa * 45;
- // Output data to serial monitor
- Serial.print("Ambient Light luminance :");
- Serial.print(Luminance/1000);
- Serial.print(",");
- Serial.print(Luminance%1000);
- Serial.println(" lux");
- }
- uint32_t GY49_GetData(void) {
- return Luminance;
- }
|