Tsl2561.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*
  2. Copyright: Joachim Banzhaf, 2018
  3. This file is part of the Joba_Tsl2561 Library.
  4. Joba_Tsl2561 is free software: you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation, either version 3 of the License, or
  7. (at your option) any later version.
  8. Joba_Tsl2561 is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with Joba_Tsl2561. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. #include "Tsl2561.h"
  16. Tsl2561::Tsl2561( TwoWire &wire ) : _addr(ADDR_NONE), _wire(wire), _status(ERR_OK) {
  17. }
  18. bool Tsl2561::available() {
  19. _wire.beginTransmission(_addr);
  20. return (_status = static_cast<status_t>(_wire.endTransmission())) == ERR_OK;
  21. }
  22. bool Tsl2561::begin( address_t addr ) {
  23. _addr = addr;
  24. return available();
  25. }
  26. bool Tsl2561::begin() {
  27. static address_t addr[] = { ADDR_GND, ADDR_FLOAT, ADDR_VDD };
  28. for( uint8_t i=0; i<sizeof(addr)/sizeof(addr[0]); i++ ) {
  29. if( begin(addr[i]) ) {
  30. return true;
  31. }
  32. }
  33. _addr = ADDR_NONE;
  34. return false;
  35. }
  36. bool Tsl2561::readByte( register_t reg, uint8_t &val ) {
  37. _wire.beginTransmission(_addr);
  38. _wire.write(reg | CONTROL_CMD);
  39. if( (_status = static_cast<status_t>(_wire.endTransmission(false))) == ERR_OK ) {
  40. if( _wire.requestFrom(_addr, 1) == 1 ) {
  41. val = static_cast<uint8_t>(_wire.read());
  42. }
  43. else {
  44. _status = ERR_RW;
  45. }
  46. }
  47. return _status == ERR_OK;
  48. }
  49. bool Tsl2561::readWord( register_t reg, uint16_t &val ) {
  50. _wire.beginTransmission(_addr);
  51. _wire.write(reg | CONTROL_CMD);
  52. if( (_status = static_cast<status_t>(_wire.endTransmission(false))) == ERR_OK ) {
  53. if( _wire.requestFrom(_addr, 2) == 2 ) {
  54. val = static_cast<uint16_t>(_wire.read()) & 0xff;
  55. val |= (static_cast<uint16_t>(_wire.read()) & 0xff) << 8;
  56. }
  57. else {
  58. _status = ERR_RW;
  59. }
  60. }
  61. return _status == ERR_OK;
  62. }
  63. bool Tsl2561::writeByte( register_t reg, uint8_t val ) {
  64. _wire.beginTransmission(_addr);
  65. _wire.write(reg | CONTROL_CMD);
  66. _wire.write(val);
  67. return (_status = static_cast<status_t>(_wire.endTransmission())) == ERR_OK;
  68. }
  69. Tsl2561::status_t Tsl2561::status() const {
  70. return _status;
  71. }
  72. Tsl2561::address_t Tsl2561::address() const {
  73. return _addr;
  74. }
  75. bool Tsl2561::id( uint8_t &id ) {
  76. return readByte(REG_ID, id);
  77. }
  78. uint8_t Tsl2561::type( uint8_t id ) {
  79. return id & PKG_ID;
  80. }
  81. uint8_t Tsl2561::revision( uint8_t id ) {
  82. return id & PKG_REV;
  83. }
  84. bool Tsl2561::packageCS( uint8_t id ) {
  85. return type(id) == PKG_CS;
  86. }
  87. bool Tsl2561::packageT_FN_CL( uint8_t id ) {
  88. return type(id) == PKG_T_FN_CL;
  89. }
  90. bool Tsl2561::on() {
  91. return writeByte(REG_CONTROL, POWER_ON);
  92. }
  93. bool Tsl2561::off() {
  94. return writeByte(REG_CONTROL, POWER_OFF);
  95. }
  96. bool Tsl2561::setSensitivity( bool gain, exposure_t exposure ) {
  97. return writeByte(REG_TIMING, (gain ? GAIN_ON : GAIN_OFF) | exposure);
  98. }
  99. bool Tsl2561::getSensitivity( bool &gain, exposure_t &exposure )
  100. {
  101. uint8_t val;
  102. if( readByte(REG_TIMING, val) ) {
  103. gain = val & GAIN_ON;
  104. exposure = static_cast<exposure_t>(val & EXP_ON);
  105. }
  106. return _status == ERR_OK;
  107. }
  108. bool Tsl2561::fullLuminosity( uint16_t &luminosity ) {
  109. return readWord(REG_DATA0LOW, luminosity);
  110. }
  111. bool Tsl2561::irLuminosity( uint16_t &luminosity ) {
  112. return readWord(REG_DATA1LOW, luminosity);
  113. }