Как рассчитать освещенность по выходу цветового датчика TCS34725?

Я использую Arduino UNO с датчиком со следующей программой.

#include <Wire.h>

// TCS34725 I2C address is 0x29(41)
#define Addr 0x29

void setup()
{
  // Initialise I2C communication as MASTER
  Wire.begin();
  // Initialise Serial Communication, set baud rate = 9600
  Serial.begin(9600);

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select Wait Time register
  Wire.write(0x83);
  // Set wait time = 2.4 ms
  Wire.write(0xFF);
  // Stop I2C Transmission
  Wire.endTransmission();

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select Atime register
  Wire.write(0x81);
  // Atime = 700 ms, max count = 65536
  Wire.write(0x00);
  // Stop I2C Transmission on the device
  Wire.endTransmission();

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select control register
  Wire.write(0x8F);
  // AGAIN = 1x
  Wire.write(0x00);
  // Stop I2C Transmission
  Wire.endTransmission();

  // Start I2C Transmission
  Wire.beginTransmission(Addr);
  // Select enable register
  Wire.write(0x80);
  // Power ON, RGBC enable, wait time disable
  Wire.write(0x03);
  // Stop I2C Transmission
  Wire.endTransmission();
  delay(800);
}

void loop()
{
  unsigned int data[8];

  // Start I2C Transmission on the device
  Wire.beginTransmission(Addr);
  // Select data register
  Wire.write(0x94);
  // Stop I2C Transmission on the device
  Wire.endTransmission();

  // Request 8 byte of data from the device
  Wire.requestFrom(Addr, 8);

  // Read 8 bytes of data
  // cData lsb, cData msb, red lsb, red msb, green lsb, green msb, blue lsb, blue msb
  if (Wire.available() == 8)
  {
    data[0] = Wire.read();
    data[1] = Wire.read();
    data[2] = Wire.read();
    data[3] = Wire.read();
    data[4] = Wire.read();
    data[5] = Wire.read();
    data[6] = Wire.read();
    data[7] = Wire.read();
  }

  // Convert the data
  float cData = (data[1] * 256.0) + data[0];
  float red = (data[3] * 256.0) + data[2];
  float green = (data[5] * 256.0) + data[4];
  float blue = (data[7] * 256.0) + data[6];

  // Calculate the final lux
  float luminance = (-0.32466 * red) + (1.57837 * green) + (-0.73191 * blue);

  // Output data to serial monitor
  Serial.print("Red color Luminance   : ");
  Serial.print(red);
  Serial.println(" lux");
  Serial.print("Green color Luminance : ");
  Serial.print(green);
  Serial.println(" lux");
  Serial.print("Blue color Luminance  : ");
  Serial.print(blue);
  Serial.println(" lux");
  Serial.print("IR Luminance          : ");
  Serial.print(cData);
  Serial.println(" lux");
  Serial.print("Ambient Light Luminance : ");
  Serial.print(luminance);
  Serial.println(" lux");
  delay(500);
}

Действительно ли выход в люксах или он имеет значение? Если это важно, как я могу рассчитать освещенность в люксах?

, 👍1

Обсуждение

В соответствующем учебнике Adafruit говорится, что он находится в Lux, но вы не используете их библиотеку. Вы читали техническое описание?, @chrisl

Используете ли вы лазер или спектральную лампу для излучения монохроматического света (то есть света с четко определенной длиной волны) на ваш датчик? Если нет, то что вы подразумеваете под “вычислить длину волны”?, @Edgar Bonet

Привет, Chirsl, я не собираюсь использовать датчик на arduino для моего окончательного приложения.Это если для начальной тестовой погоды датчик работает или нет.Но мне нужно знать расчет люкса или интенсивности по подсчетам., @user59381

Привет Edger,Нужно рассчитать люкс или интенсивность формы отсчетов, @user59381

@user59381: Тогда говорить о длине волны - это нонсенс. И это “освещенность”, а не “интенсивность”. И это “Эдгар”, а не “Эджер”. Я отредактировал ваш вопрос, чтобы исправить все это., @Edgar Bonet


2 ответа


0

В техническом описании чипа на странице 8 в главе "Операция RGBC" (выделено мной):

Модуль RGBC содержит регулятор усиления RGBC (СНОВА) и четыре интегрирующих аналого-цифровых преобразователя (АЦП)для RGBC фотодиоды. Время интеграции RGBC (ATIME) влияет как на разрешение, так и на чувствительность считывания RGBC. Интеграция всех четырех каналов происходит одновременно, и по завершении цикла преобразования результаты передаются в регистры цветовых данных . Эти данные также называются количеством каналов.

Таким образом, если вы считываете значения из регистров данных, вы получаете простые значения подсчета, которые были определены АЦП, подключенными к каналам. Чтобы получить значение в люксах, вам нужно рассчитать его самостоятельно.

У Adafruit есть библиотека для их прорывной платы с этим чипом. В их учебнике кажется, что библиотека выводит значение в люксах. Возможно, вы также можете использовать эту библиотеку, или вы можете проверить, как они преобразуют значения с датчика в значения люкс.

,

мое конечное приложение другое.Мне нужно знать расчет люкса или интенсивности света по подсчетам, @user59381

float cData = (data[1] * 256.0) + data [0];У меня путаница в приведенной выше строке. Строка предназначена для хранения данных в одной переменной или для преобразования данных в значение RGB., @user59381


1

Результат этой программы - очень смелое предположение о том, какой может быть освещенность. Я бы определенно не стал ему доверять. Он использует ту же формулу, что и функция Adafruit_TCS34725::calculateLux (), из драйвера Adafruit TCS34725. Поискав в Google числовые коэффициенты, я обнаружил, что вероятным источником этой формулы является примечание к приложению, рассчитывающее цветовую температуру и освещенность с помощью цифрового цветового датчика TAOS TCS3414CS. Это примечание к приложению кажется серьезным, но оно касается другой модели датчика, отличной от той, которая у вас есть. Он также дает формулу, которая не зависит ни от коэффициента усиления , ни от времени интеграции (возможно, это не регулируется в TCS3414CS), что абсолютно бессмысленно, если у вас есть TCS34725. Я обнаружил проблему, связанную с драйвером Adafruit, которая показывает, что формулы , используемые в библиотеке, сильно ошибочны по сравнению с высококачественным измерителем люкса и цвета.

Я предлагаю вам попробовать реализовать формулу освещенности, приведенную в примечании к приложению DN40 – Люкс и расчеты CCT с использованием цвета ams Датчики. В этом документе приведена общая формула с определенным коэффициентом, соответствующим различным моделям цветовых датчиков, и приведены коэффициенты, характерные для семейства TCS3472. Adafruit использовал этот документ для реализации расчета цветовой температуры (функция Adafruit_TCS34725::calculateColorTemperature_dn40()), но они не смогли использовать его для расчета освещенности.

,

float cData = (data[1] * 256.0) + data[0];У меня путаница в приведенной выше строке. Строка предназначена для хранения данных в одной переменной или для преобразования данных в значение RGB., @user59381

float cData = (data[1] * 256.0) + data[0];У меня путаница в приведенной выше строке. Является ли строка для хранения данных в одной переменной или для покрытия данных в значение RGB, @user59381

@user59381: Это для объединения двух байтов (data[0] и data[1]) в одно число., @Edgar Bonet

ОК.Большое вам спасибо, @user59381