Posiadam czujnik TSL25721. Używam noty katalogowej https://dl.btc.pl/kamami_wa/tsl25721fn.pdf.
Czujnik po dokonaniu obliczeń zwraca bardzo duże wartości, zapewne nierealne.
Czy może ktoś sprawdzić czy poprawnie realizuję te rzutowania dla wartości LX1 i LX2.
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <sys/time.h>
#define TSL25721_ADDRESS (0x39)
int i2c_fd, ret;
float tsl25721_sunlight;
void TSL25721_write_register(uint8_t address, uint8_t value);
uint8_t TSL25721_read_register(uint8_t address);
void TSL25721_get_sunlight(float *sunlight);
int main(void)
{
i2c_fd = open("/dev/i2c-1", O_RDWR);
if(i2c_fd < 0)
{
printf("Failed to open the i2c bus\n");
return EXIT_FAILURE;
}
ret = ioctl(i2c_fd, I2C_SLAVE, TSL25721_ADDRESS);
if(ret < 0)
printf("Failed to acquire bus access and/or talk to slave\n");
return EXIT_FAILURE;
}
TSL25721_write_register(0x80 | 0x0F, 0x00); //1x gain
TSL25721_write_register(0x80 | 0x01, 0xDB); //101ms
TSL25721_write_register(0x80 | 0x00, 0x03); //Power ON ALS ENABLE
for(;;)
{
TSL25721_get_sunlight(&tsl25721_sunlight);
//printf("TSL25721: SUNLIGHT: %.2f lux\n", tsl25721_sunlight);
sleep(1);
}
return EXIT_SUCCESS;
}
void TSL25721_write_register(uint8_t address, uint8_t value)
{
uint8_t data_write[2] = {address, value};
write(i2c_fd, data_write, sizeof(data_write));
}
uint8_t TSL25721_read_register(uint8_t address)
{
uint8_t data_read;
write(i2c_fd, &address, sizeof(address));
read(i2c_fd, &data_read, sizeof(data_read));
return data_read;
}
void TSL25721_get_sunlight(float *sunlight)
{
uint8_t data_read[4];
int c0, c1;
float cpl, lux1, lux2;
data_read[0] = TSL25721_read_register(0x80 | 0x14);
data_read[1] = TSL25721_read_register(0x80 | 0x15);
data_read[2] = TSL25721_read_register(0x80 | 0x16);
data_read[3] = TSL25721_read_register(0x80 | 0x17);
c0 = (data_read[0] << 8);
c0 |= data_read[1];
c1 = (data_read[2] << 8);
c1 |= data_read[3];
cpl = ((float)101 * (float)1) / (float)60.0;
lux1 = ((float)1 * (float)c0 - 1.87f * (float)c1) / cpl;
lux2 = ((0.63f * (float)c0) - (float)1 * (float)c1) / cpl;
printf("%.2f lux || %.2f lux\n", lux1, lux2);
}