Как рассчитать освещенность по выходу цветового датчика 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);
}
Действительно ли выход в люксах или он имеет значение? Если это важно, как я могу рассчитать освещенность в люксах?
@user59381, 👍1
Обсуждение2 ответа
В техническом описании чипа на странице 8 в главе "Операция RGBC" (выделено мной):
Модуль RGBC содержит регулятор усиления RGBC (СНОВА) и четыре интегрирующих аналого-цифровых преобразователя (АЦП)для RGBC фотодиоды. Время интеграции RGBC (ATIME) влияет как на разрешение, так и на чувствительность считывания RGBC. Интеграция всех четырех каналов происходит одновременно, и по завершении цикла преобразования результаты передаются в регистры цветовых данных . Эти данные также называются количеством каналов.
Таким образом, если вы считываете значения из регистров данных, вы получаете простые значения подсчета, которые были определены АЦП, подключенными к каналам. Чтобы получить значение в люксах, вам нужно рассчитать его самостоятельно.
У Adafruit есть библиотека для их прорывной платы с этим чипом. В их учебнике кажется, что библиотека выводит значение в люксах. Возможно, вы также можете использовать эту библиотеку, или вы можете проверить, как они преобразуют значения с датчика в значения люкс.
мое конечное приложение другое.Мне нужно знать расчет люкса или интенсивности света по подсчетам, @user59381
float cData = (data[1] * 256.0) + data [0];У меня путаница в приведенной выше строке. Строка предназначена для хранения данных в одной переменной или для преобразования данных в значение RGB., @user59381
Результат этой программы - очень смелое предположение о том, какой
может быть освещенность. Я бы определенно не стал ему доверять. Он использует ту же формулу,
что и функция 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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
В соответствующем учебнике Adafruit говорится, что он находится в Lux, но вы не используете их библиотеку. Вы читали техническое описание?, @chrisl
Используете ли вы лазер или спектральную лампу для излучения монохроматического света (то есть света с четко определенной длиной волны) на ваш датчик? Если нет, то что вы подразумеваете под “вычислить длину волны”?, @Edgar Bonet
Привет, Chirsl, я не собираюсь использовать датчик на arduino для моего окончательного приложения.Это если для начальной тестовой погоды датчик работает или нет.Но мне нужно знать расчет люкса или интенсивности по подсчетам., @user59381
Привет Edger,Нужно рассчитать люкс или интенсивность формы отсчетов, @user59381
@user59381: Тогда говорить о длине волны - это нонсенс. И это “освещенность”, а не “интенсивность”. И это “Эдгар”, а не “Эджер”. Я отредактировал ваш вопрос, чтобы исправить все это., @Edgar Bonet