TSL25721 - problem z wiarygodnością wyników pomiarów

Linux jako system PC i Embedded
Regulamin forum
Aby łatwiej poruszać się w zagadnieniach to prosimy aby w temacie, na samym początku, w nawiasach prostokątnych umieszczać hasło wiodące dla opisywanego problemu np. [Debian], [System embedded], [Linux Mint] itp.
Awatar użytkownika
StaryAnoda_NEW
Newb
Newb
Posty: 78
Rejestracja: środa 04 kwie 2018, 16:48

TSL25721 - problem z wiarygodnością wyników pomiarów

Postautor: StaryAnoda_NEW » sobota 29 wrz 2018, 13:07

Hej

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.
Zrzut ekranu.png

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);
}
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Nie jest możliwe, żeby ludzki umysł opracował rzecz bardziej uniwersalną niż mikroprocesor - Andy Grove

Awatar użytkownika
piotrek
Newb
Newb
Posty: 92
Rejestracja: niedziela 05 lis 2017, 02:46

Re: TSL25721 - problem z wiarygodnością wyników pomiarów

Postautor: piotrek » sobota 29 wrz 2018, 15:05

A możesz podać przykładowe wartości c0 i c1 oraz oczekiwaną wartość lux1 i lux2?
Zamiast pisać "(float)101" możesz napisać 101.0f

Awatar użytkownika
StaryAnoda_NEW
Newb
Newb
Posty: 78
Rejestracja: środa 04 kwie 2018, 16:48

Re: TSL25721 - problem z wiarygodnością wyników pomiarów

Postautor: StaryAnoda_NEW » sobota 29 wrz 2018, 15:55

Hej

Zrzut ekranu.png


Dzięki za informację o tych rzutowaniach. Poprawie to przy następnej rewizji programu.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Nie jest możliwe, żeby ludzki umysł opracował rzecz bardziej uniwersalną niż mikroprocesor - Andy Grove


Wróć do „GNU/Linux”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 0 gości