Vladimir N. Shilov 2 роки тому
батько
коміт
8626be5d97
2 змінених файлів з 86 додано та 0 видалено
  1. 76 0
      app/gy49.cpp
  2. 10 0
      include/gy49.h

+ 76 - 0
app/gy49.cpp

@@ -0,0 +1,76 @@
+#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;
+}

+ 10 - 0
include/gy49.h

@@ -0,0 +1,10 @@
+#pragma once
+#ifndef _GY49_H_
+#define _GY49_H_
+
+#include <SmingCore.h>
+
+void GY49_Init(void);
+uint32_t GY49_GetData(void);
+
+#endif /* _GY49_H_ */