This library gets information from TSL2550 ambient light sensor through SMBus / I²C.

Committer:
goeckeritz
Date:
Wed Mar 30 15:34:58 2011 +0000
Revision:
0:7e6a051d1700
initial upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
goeckeritz 0:7e6a051d1700 1 /*
goeckeritz 0:7e6a051d1700 2 * mbed library to use a TAOS TSL2550 Ambient Light Sensor
goeckeritz 0:7e6a051d1700 3 * Copyright (c) 2011 Stefan Goeckeritz,
goeckeritz 0:7e6a051d1700 4 * RheinAhrCampus Remagen, Suedallee 2, 53424 Remagen
goeckeritz 0:7e6a051d1700 5 *
goeckeritz 0:7e6a051d1700 6 * Released under the MIT License: http://mbed.org/license/mit
goeckeritz 0:7e6a051d1700 7 */
goeckeritz 0:7e6a051d1700 8
goeckeritz 0:7e6a051d1700 9 #include "mbed.h"
goeckeritz 0:7e6a051d1700 10 #include "TSL2550.h"
goeckeritz 0:7e6a051d1700 11
goeckeritz 0:7e6a051d1700 12 #define TSL2550_ADDR 0x72 //hardwired slave address of TSL2550
goeckeritz 0:7e6a051d1700 13 #define xpow(x, y) ((long)1 << y)
goeckeritz 0:7e6a051d1700 14
goeckeritz 0:7e6a051d1700 15
goeckeritz 0:7e6a051d1700 16 TSL2550::TSL2550 (PinName p_sda, PinName p_scl ) : i2c(p_sda, p_scl) {
goeckeritz 0:7e6a051d1700 17 init();
goeckeritz 0:7e6a051d1700 18 }
goeckeritz 0:7e6a051d1700 19
goeckeritz 0:7e6a051d1700 20 TSL2550::TSL2550 (I2C& p_i2c) : i2c(p_i2c) {
goeckeritz 0:7e6a051d1700 21 init();
goeckeritz 0:7e6a051d1700 22 }
goeckeritz 0:7e6a051d1700 23
goeckeritz 0:7e6a051d1700 24 unsigned short TSL2550::get_ch0() {
goeckeritz 0:7e6a051d1700 25 return ch0;
goeckeritz 0:7e6a051d1700 26 }
goeckeritz 0:7e6a051d1700 27
goeckeritz 0:7e6a051d1700 28 unsigned short TSL2550::get_ch1() {
goeckeritz 0:7e6a051d1700 29 return ch1;
goeckeritz 0:7e6a051d1700 30 }
goeckeritz 0:7e6a051d1700 31
goeckeritz 0:7e6a051d1700 32 double TSL2550::get_lux() {
goeckeritz 0:7e6a051d1700 33 return lux;
goeckeritz 0:7e6a051d1700 34 }
goeckeritz 0:7e6a051d1700 35
goeckeritz 0:7e6a051d1700 36 void TSL2550::update () {
goeckeritz 0:7e6a051d1700 37 unsigned short c0, c1, s0, s1;
goeckeritz 0:7e6a051d1700 38 int adc0, adc1;
goeckeritz 0:7e6a051d1700 39 double r;
goeckeritz 0:7e6a051d1700 40
goeckeritz 0:7e6a051d1700 41 //read channel 0 and 1
goeckeritz 0:7e6a051d1700 42 ch0 = twi_read(TSL2550_ADDR, 0x43);
goeckeritz 0:7e6a051d1700 43 wait(0.5);
goeckeritz 0:7e6a051d1700 44 ch1 = twi_read(TSL2550_ADDR, 0x83);
goeckeritz 0:7e6a051d1700 45
goeckeritz 0:7e6a051d1700 46 //now compute lux value, if data is valid
goeckeritz 0:7e6a051d1700 47 if((ch0 & 0x80) && (ch1 & 0x80))
goeckeritz 0:7e6a051d1700 48 {
goeckeritz 0:7e6a051d1700 49 c0 = (ch0 & ~0x80) >> 4 ;
goeckeritz 0:7e6a051d1700 50 c1 = (ch1 & ~0x80) >> 4 ;
goeckeritz 0:7e6a051d1700 51 s0 = ch0 & ~0xF0 ;
goeckeritz 0:7e6a051d1700 52 s1 = ch1 & ~0xF0 ;
goeckeritz 0:7e6a051d1700 53
goeckeritz 0:7e6a051d1700 54 //ADC Count Value
goeckeritz 0:7e6a051d1700 55 adc0 = int(16.5 * xpow(2,c0)) + (s0 * xpow(2,c0));
goeckeritz 0:7e6a051d1700 56 adc1 = int(16.5 * xpow(2,c1)) + (s1 * xpow(2,c1));
goeckeritz 0:7e6a051d1700 57
goeckeritz 0:7e6a051d1700 58 r = (double(adc1) / double(adc0));
goeckeritz 0:7e6a051d1700 59 lux = double(adc0) * 0.46 * exp(-3.13 * r);
goeckeritz 0:7e6a051d1700 60
goeckeritz 0:7e6a051d1700 61 //give debug information
goeckeritz 0:7e6a051d1700 62 //printf("\n\nZW: c0=%i s0=%i c1=%i s1=%i \n", c0, s0, c1, s1);
goeckeritz 0:7e6a051d1700 63 //printf("ZW: adc0=%i, adc1=%i\n", adc0, adc1);
goeckeritz 0:7e6a051d1700 64 }
goeckeritz 0:7e6a051d1700 65 else
goeckeritz 0:7e6a051d1700 66 printf("TSL2550: ***data not valid ! ***\n");
goeckeritz 0:7e6a051d1700 67 }
goeckeritz 0:7e6a051d1700 68
goeckeritz 0:7e6a051d1700 69 void TSL2550::init() {
goeckeritz 0:7e6a051d1700 70 unsigned short i;
goeckeritz 0:7e6a051d1700 71
goeckeritz 0:7e6a051d1700 72 i = twi_read(TSL2550_ADDR, 0x03);
goeckeritz 0:7e6a051d1700 73 if( i == 0x03 )
goeckeritz 0:7e6a051d1700 74 printf("TSL2550: Init successful\n");
goeckeritz 0:7e6a051d1700 75 else
goeckeritz 0:7e6a051d1700 76 printf("TSL2550: Init ***failed*** !\n");
goeckeritz 0:7e6a051d1700 77 }
goeckeritz 0:7e6a051d1700 78
goeckeritz 0:7e6a051d1700 79 unsigned short TSL2550::twi_read (unsigned short id, unsigned short data) {
goeckeritz 0:7e6a051d1700 80 unsigned short i;
goeckeritz 0:7e6a051d1700 81
goeckeritz 0:7e6a051d1700 82 //supply COMMAND byte to slave
goeckeritz 0:7e6a051d1700 83 i2c.start();
goeckeritz 0:7e6a051d1700 84 i2c.write(id);
goeckeritz 0:7e6a051d1700 85 i2c.write(data);
goeckeritz 0:7e6a051d1700 86
goeckeritz 0:7e6a051d1700 87 //demand ANSWER byte from slave
goeckeritz 0:7e6a051d1700 88 i2c.start();
goeckeritz 0:7e6a051d1700 89 i2c.write(id | 1);
goeckeritz 0:7e6a051d1700 90 i = i2c.read(0);
goeckeritz 0:7e6a051d1700 91 i2c.stop();
goeckeritz 0:7e6a051d1700 92
goeckeritz 0:7e6a051d1700 93
goeckeritz 0:7e6a051d1700 94 return i;
goeckeritz 0:7e6a051d1700 95 }
goeckeritz 0:7e6a051d1700 96
goeckeritz 0:7e6a051d1700 97 void TSL2550::twi_write (unsigned short id, unsigned short data) {
goeckeritz 0:7e6a051d1700 98
goeckeritz 0:7e6a051d1700 99 i2c.start();
goeckeritz 0:7e6a051d1700 100 i2c.write(id);
goeckeritz 0:7e6a051d1700 101 i2c.write(data);
goeckeritz 0:7e6a051d1700 102 i2c.stop();
goeckeritz 0:7e6a051d1700 103 }
goeckeritz 0:7e6a051d1700 104