//------------------------------------------------------------------------- void test_tsl(void) { #define TSL2591_COMMAND_BIT (0xA0) ///< 1010 0000: bits 7 and 5 for 'command normal' uint16_t ir, full; byte TSL_cas = 5; // cas snimani (0=100ms, 1=200ms, 2=300ms .... 5=600ms) byte cnf; // konfiguracni registr (slouceny cas mereni a citlivost) zobraz_text(6); // "JA5 " for (int TSL_gain = 48 ; TSL_gain >= 0 ; TSL_gain = TSL_gain - 16) // TSL_gain ma 4 urovne: 48 (9876x) // 32 (428x) // 16 (25x) // 0 (1x) { cnf = TSL_gain + TSL_cas; TSL_config(cnf); TSL_enable(); if (err == 0) { delay(1000); // obvod musi mit dostatek casu na mereni pri libovolnem casu mereni full = I2C_read_int(TSL2591_COMMAND_BIT | 0x14); // CH_0 ir = I2C_read_int(TSL2591_COMMAND_BIT | 0x16); // CH_1 TSL_disable(); Serial.print("GAIN: "); Serial.print(TSL_gain); Serial.print(" IR: "); Serial.print(ir); Serial.print(" FULL: "); Serial.println(full); } } } // ============== pomocne podprogramy pro cidlo cvetla TSL2591 ==================== // do config registru TSL cidla ulozi hodnotu (zkombinovany cas a citlivost) void TSL_config(byte data) { TSL_enable(); I2C_write(TSL2591_COMMAND_BIT | 0x01,data); TSL_disable(); } void TSL_enable(void) { I2C_write(TSL2591_COMMAND_BIT | 0x00, 147); // power_on bit se nastavi, ostatni bity (sleep a interrupty se zakazou) } void TSL_disable(void) { I2C_write(TSL2591_COMMAND_BIT | 0x00, 0x00); // power_on bit se zrusi, ostatni bity (sleep a interrupty se taky zakazou) } // zapis jedne hodnoty do zadaneho registru void I2C_write(byte registr, byte data) { if (err == 0) { Wire.beginTransmission(0x29); // zacatek komunikace s cidlem Wire.write(registr); // cislo registru Wire.write(data); // ulozeni hodnoty err = Wire.endTransmission(); if (err != 0) { Serial.print("Chyba I2C ... kod: "); Serial.println(err); return; } } } // cteni jedne hodnoty ze zadaneho registru byte I2C_read(byte registr) { if (err == 0) { Wire.beginTransmission(0x29); // zacatek komunikace s cidlem Wire.write(registr); // LSB z adresy err = Wire.endTransmission(); if (err != 0) { Serial.print("Chyba I2C ... kod: "); Serial.println(err); return 0xFF; } Wire.requestFrom(0x29, 1); byte x = Wire.read(); return x; } } // cteni hodnoty ze 2 po sobe jdoucich registru a jejich spojeni do jednoho 16-bitoveho cisla // pozor, nejdriv je LSB a az pak MSB unsigned int I2C_read_int(byte registr) { byte lsb = I2C_read(registr); byte msb = I2C_read(registr+1); return (256 * msb) + lsb; } // =============== konec pomocnych podprogramu pro TSL 2591 =================