This library gets information from TSL2550 ambient light sensor through SMBus / I²C.
TSL2550.cpp@0:7e6a051d1700, 2011-03-30 (annotated)
- Committer:
- goeckeritz
- Date:
- Wed Mar 30 15:34:58 2011 +0000
- Revision:
- 0:7e6a051d1700
initial upload
Who changed what in which revision?
User | Revision | Line number | New 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 |