Adminhs пишет:
вот пример работы с датчиком
github.com/adafruit/TSL2561-Arduino-Libr...b/master/TSL2561.cpp , в прошивке реализовано аналогично.. Есть ардуина проверить на ней этот код ?
Проверил. Ведет себя примерно так же как и ваш код до 2000 люм значение растет после падает. Причем если установить
нулевое единичное усиление
tsl.setGain(TSL2561_GAIN_0X); // set no gain (for bright situtations)
то код нормально отрабатывает.
Разобрался! там внутри стоят 2 фотодиода один измеряет общее значение освещенности а второй инфракрасное, при усилении 16х данные с ацп 0 канала фотодиода становятся максимальными и расчеты освещенности неверными.
Решение при больших значениях с нулевого канала (общая освещенность) допустим половина от максимума, а это 2500 при tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS);
нужно изменять коэффициент усиления на 1
tsl.setGain(TSL2561_GAIN_0X); // set no gain (for bright situtations) (полагаю опечатка правильно все таки 1х ))
Раз уж этот датчик умеет измерять инфракрасную освещенность может и ее выводить, авось кому нибудь пригодится)
#include <Wire.h>
#include "TSL2561.h"
// Example for demonstrating the TSL2561 library - public domain!
// connect SCL to analog 5
// connect SDA to analog 4
// connect VDD to 3.3V DC
// connect GROUND to common ground
// ADDR can be connected to ground, or vdd or left floating to change the i2c address
// The address will be different depending on whether you let
// the ADDR pin float (addr 0x39), or tie it to ground or vcc. In those cases
// use TSL2561_ADDR_LOW (0x29) or TSL2561_ADDR_HIGH (0x49) respectively
TSL2561 tsl(TSL2561_ADDR_FLOAT);
void setup(void) {
Serial.begin(9600);
if (tsl.begin()) {
Serial.println("Found sensor");
} else {
Serial.println("No sensor?");
while (1);
}
// You can change the gain on the fly, to adapt to brighter/dimmer light situations
//tsl.setGain(TSL2561_GAIN_0X); // set no gain (for bright situtations)
tsl.setGain(TSL2561_GAIN_16X); // set 16x gain (for dim situations)
// Changing the integration time gives you a longer time over which to sense light
// longer timelines are slower, but are good in very low light situtations!
tsl.setTiming(TSL2561_INTEGRATIONTIME_13MS); // shortest integration time (bright light)
//tsl.setTiming(TSL2561_INTEGRATIONTIME_101MS); // medium integration time (medium light)
//tsl.setTiming(TSL2561_INTEGRATIONTIME_402MS); // longest integration time (dim light)
// Now we're ready to get readings!
}
void loop(void) {
// Simple data read example. Just read the infrared, fullspecrtrum diode
// or 'visible' (difference between the two) channels.
// This can take 13-402 milliseconds! Uncomment whichever of the following you want to read
uint16_t x = tsl.getLuminosity(TSL2561_VISIBLE);
//uint16_t x = tsl.getLuminosity(TSL2561_FULLSPECTRUM);
//uint16_t x = tsl.getLuminosity(TSL2561_INFRARED);
// Serial.println(x, DEC);
// More advanced data read example. Read 32 bits with top 16 bits IR, bottom 16 bits full spectrum
// That way you can do whatever math and comparisons you want!
uint32_t lum = tsl.getFullLuminosity();
uint16_t ir, full;
ir = lum >> 16;
full = lum & 0xFFFF;
Serial.print("D: "); Serial.print(lum); Serial.print("\t");
Serial.print("IR: "); Serial.print(ir); Serial.print("\t\t");
Serial.print("Full: "); Serial.print(full); Serial.print("\t");
Serial.print("Visible: "); Serial.print(full - ir); Serial.print("\t");
Serial.print("Lux: "); Serial.println(tsl.calculateLux(full, ir));
delay(100);
}