Skip to content
This repository was archived by the owner on Dec 20, 2018. It is now read-only.

Commit 97536a4

Browse files
committed
Initial commit.
1 parent a07225a commit 97536a4

File tree

5 files changed

+666
-0
lines changed

5 files changed

+666
-0
lines changed

Adafruit_TCS34725/TCS34725.py

+248
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,248 @@
1+
# The MIT License (MIT)
2+
#
3+
# Copyright (c) 2016 Adafruit Industries
4+
#
5+
# Permission is hereby granted, free of charge, to any person obtaining a copy
6+
# of this software and associated documentation files (the "Software"), to deal
7+
# in the Software without restriction, including without limitation the rights
8+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
# copies of the Software, and to permit persons to whom the Software is
10+
# furnished to do so, subject to the following conditions:
11+
#
12+
# The above copyright notice and this permission notice shall be included in all
13+
# copies or substantial portions of the Software.
14+
#
15+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
# SOFTWARE.
22+
import time
23+
24+
25+
TCS34725_ADDRESS = 0x29
26+
TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727
27+
28+
TCS34725_COMMAND_BIT = 0x80
29+
30+
TCS34725_ENABLE = 0x00
31+
TCS34725_ENABLE_AIEN = 0x10 # RGBC Interrupt Enable
32+
TCS34725_ENABLE_WEN = 0x08 # Wait enable - Writing 1 activates the wait timer
33+
TCS34725_ENABLE_AEN = 0x02 # RGBC Enable - Writing 1 actives the ADC, 0 disables it
34+
TCS34725_ENABLE_PON = 0x01 # Power on - Writing 1 activates the internal oscillator, 0 disables it
35+
TCS34725_ATIME = 0x01 # Integration time
36+
TCS34725_WTIME = 0x03 # Wait time (if TCS34725_ENABLE_WEN is asserted)
37+
TCS34725_WTIME_2_4MS = 0xFF # WLONG0 = 2.4ms WLONG1 = 0.029s
38+
TCS34725_WTIME_204MS = 0xAB # WLONG0 = 204ms WLONG1 = 2.45s
39+
TCS34725_WTIME_614MS = 0x00 # WLONG0 = 614ms WLONG1 = 7.4s
40+
TCS34725_AILTL = 0x04 # Clear channel lower interrupt threshold
41+
TCS34725_AILTH = 0x05
42+
TCS34725_AIHTL = 0x06 # Clear channel upper interrupt threshold
43+
TCS34725_AIHTH = 0x07
44+
TCS34725_PERS = 0x0C # Persistence register - basic SW filtering mechanism for interrupts
45+
TCS34725_PERS_NONE = 0b0000 # Every RGBC cycle generates an interrupt
46+
TCS34725_PERS_1_CYCLE = 0b0001 # 1 clean channel value outside threshold range generates an interrupt
47+
TCS34725_PERS_2_CYCLE = 0b0010 # 2 clean channel values outside threshold range generates an interrupt
48+
TCS34725_PERS_3_CYCLE = 0b0011 # 3 clean channel values outside threshold range generates an interrupt
49+
TCS34725_PERS_5_CYCLE = 0b0100 # 5 clean channel values outside threshold range generates an interrupt
50+
TCS34725_PERS_10_CYCLE = 0b0101 # 10 clean channel values outside threshold range generates an interrupt
51+
TCS34725_PERS_15_CYCLE = 0b0110 # 15 clean channel values outside threshold range generates an interrupt
52+
TCS34725_PERS_20_CYCLE = 0b0111 # 20 clean channel values outside threshold range generates an interrupt
53+
TCS34725_PERS_25_CYCLE = 0b1000 # 25 clean channel values outside threshold range generates an interrupt
54+
TCS34725_PERS_30_CYCLE = 0b1001 # 30 clean channel values outside threshold range generates an interrupt
55+
TCS34725_PERS_35_CYCLE = 0b1010 # 35 clean channel values outside threshold range generates an interrupt
56+
TCS34725_PERS_40_CYCLE = 0b1011 # 40 clean channel values outside threshold range generates an interrupt
57+
TCS34725_PERS_45_CYCLE = 0b1100 # 45 clean channel values outside threshold range generates an interrupt
58+
TCS34725_PERS_50_CYCLE = 0b1101 # 50 clean channel values outside threshold range generates an interrupt
59+
TCS34725_PERS_55_CYCLE = 0b1110 # 55 clean channel values outside threshold range generates an interrupt
60+
TCS34725_PERS_60_CYCLE = 0b1111 # 60 clean channel values outside threshold range generates an interrupt
61+
TCS34725_CONFIG = 0x0D
62+
TCS34725_CONFIG_WLONG = 0x02 # Choose between short and long (12x) wait times via TCS34725_WTIME
63+
TCS34725_CONTROL = 0x0F # Set the gain level for the sensor
64+
TCS34725_ID = 0x12 # 0x44 = TCS34721/TCS34725, 0x4D = TCS34723/TCS34727
65+
TCS34725_STATUS = 0x13
66+
TCS34725_STATUS_AINT = 0x10 # RGBC Clean channel interrupt
67+
TCS34725_STATUS_AVALID = 0x01 # Indicates that the RGBC channels have completed an integration cycle
68+
69+
TCS34725_CDATAL = 0x14 # Clear channel data
70+
TCS34725_CDATAH = 0x15
71+
TCS34725_RDATAL = 0x16 # Red channel data
72+
TCS34725_RDATAH = 0x17
73+
TCS34725_GDATAL = 0x18 # Green channel data
74+
TCS34725_GDATAH = 0x19
75+
TCS34725_BDATAL = 0x1A # Blue channel data
76+
TCS34725_BDATAH = 0x1B
77+
78+
TCS34725_INTEGRATIONTIME_2_4MS = 0xFF # 2.4ms - 1 cycle - Max Count: 1024
79+
TCS34725_INTEGRATIONTIME_24MS = 0xF6 # 24ms - 10 cycles - Max Count: 10240
80+
TCS34725_INTEGRATIONTIME_50MS = 0xEB # 50ms - 20 cycles - Max Count: 20480
81+
TCS34725_INTEGRATIONTIME_101MS = 0xD5 # 101ms - 42 cycles - Max Count: 43008
82+
TCS34725_INTEGRATIONTIME_154MS = 0xC0 # 154ms - 64 cycles - Max Count: 65535
83+
TCS34725_INTEGRATIONTIME_700MS = 0x00 # 700ms - 256 cycles - Max Count: 65535
84+
85+
TCS34725_GAIN_1X = 0x00 # No gain
86+
TCS34725_GAIN_4X = 0x01 # 2x gain
87+
TCS34725_GAIN_16X = 0x02 # 16x gain
88+
TCS34725_GAIN_60X = 0x03 # 60x gain
89+
90+
# Lookup table for integration time delays.
91+
INTEGRATION_TIME_DELAY = {
92+
0xFF: 0.0024, # 2.4ms - 1 cycle - Max Count: 1024
93+
0xF6: 0.024, # 24ms - 10 cycles - Max Count: 10240
94+
0xEB: 0.050, # 50ms - 20 cycles - Max Count: 20480
95+
0xD5: 0.101, # 101ms - 42 cycles - Max Count: 43008
96+
0xC0: 0.154, # 154ms - 64 cycles - Max Count: 65535
97+
0x00: 0.700 # 700ms - 256 cycles - Max Count: 65535
98+
}
99+
100+
101+
# Utility methods:
102+
def calculate_color_temperature(r, g, b):
103+
"""Converts the raw R/G/B values to color temperature in degrees Kelvin."""
104+
# 1. Map RGB values to their XYZ counterparts.
105+
# Based on 6500K fluorescent, 3000K fluorescent
106+
# and 60W incandescent values for a wide range.
107+
# Note: Y = Illuminance or lux
108+
X = (-0.14282 * r) + (1.54924 * g) + (-0.95641 * b)
109+
Y = (-0.32466 * r) + (1.57837 * g) + (-0.73191 * b)
110+
Z = (-0.68202 * r) + (0.77073 * g) + ( 0.56332 * b)
111+
# Check for divide by 0 (total darkness) and return None.
112+
if (X + Y + Z) == 0:
113+
return None
114+
# 2. Calculate the chromaticity co-ordinates
115+
xc = (X) / (X + Y + Z)
116+
yc = (Y) / (X + Y + Z)
117+
# Check for divide by 0 again and return None.
118+
if (0.1858 - yc) == 0:
119+
return None
120+
# 3. Use McCamy's formula to determine the CCT
121+
n = (xc - 0.3320) / (0.1858 - yc)
122+
# Calculate the final CCT
123+
cct = (449.0 * (n ** 3.0)) + (3525.0 *(n ** 2.0)) + (6823.3 * n) + 5520.33
124+
return int(cct)
125+
126+
def calculate_lux(r, g, b):
127+
"""Converts the raw R/G/B values to luminosity in lux."""
128+
illuminance = (-0.32466 * r) + (1.57837 * g) + (-0.73191 * b)
129+
return int(illuminance)
130+
131+
132+
class TCS34725(object):
133+
"""TCS34725 color sensor."""
134+
135+
def __init__(self, integration_time=TCS34725_INTEGRATIONTIME_2_4MS,
136+
gain=TCS34725_GAIN_4X, address=TCS34725_ADDRESS, i2c=None, **kwargs):
137+
"""Initialize the TCS34725 sensor."""
138+
# Setup I2C interface for the device.
139+
if i2c is None:
140+
import Adafruit_GPIO.I2C as I2C
141+
i2c = I2C
142+
self._device = i2c.get_i2c_device(address, **kwargs)
143+
# Make sure we're connected to the sensor.
144+
chip_id = self._readU8(TCS34725_ID)
145+
if chip_id != 0x44:
146+
raise RuntimeError('Failed to read TCS34725 chip ID, check your wiring.')
147+
# Set default integration time and gain.
148+
self.set_integration_time(integration_time)
149+
self.set_gain(gain)
150+
# Enable the device (by default, the device is in power down mode on bootup).
151+
self.enable()
152+
153+
def _readU8(self, reg):
154+
"""Read an unsigned 8-bit register."""
155+
return self._device.readU8(TCS34725_COMMAND_BIT | reg)
156+
157+
def _readU16LE(self, reg):
158+
"""Read a 16-bit little endian register."""
159+
return self._device.readU16LE(TCS34725_COMMAND_BIT | reg)
160+
161+
def _write8(self, reg, value):
162+
"""Write a 8-bit value to a register."""
163+
self._device.write8(TCS34725_COMMAND_BIT | reg, value)
164+
165+
def enable(self):
166+
"""Enable the chip."""
167+
# Flip on the power and enable bits.
168+
self._write8(TCS34725_ENABLE, TCS34725_ENABLE_PON)
169+
time.sleep(0.01)
170+
self._write8(TCS34725_ENABLE, (TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN))
171+
172+
def disable(self):
173+
"""Disable the chip (power down)."""
174+
# Flip off the power on and enable bits.
175+
reg = self._readU8(TCS34725_ENABLE)
176+
reg &= ~(TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN)
177+
self._write8(TCS34725_ENABLE, reg)
178+
179+
def set_integration_time(self, integration_time):
180+
"""Sets the integration time for the TC34725. Provide one of these
181+
constants:
182+
- TCS34725_INTEGRATIONTIME_2_4MS = 2.4ms - 1 cycle - Max Count: 1024
183+
- TCS34725_INTEGRATIONTIME_24MS = 24ms - 10 cycles - Max Count: 10240
184+
- TCS34725_INTEGRATIONTIME_50MS = 50ms - 20 cycles - Max Count: 20480
185+
- TCS34725_INTEGRATIONTIME_101MS = 101ms - 42 cycles - Max Count: 43008
186+
- TCS34725_INTEGRATIONTIME_154MS = 154ms - 64 cycles - Max Count: 65535
187+
- TCS34725_INTEGRATIONTIME_700MS = 700ms - 256 cycles - Max Count: 65535
188+
"""
189+
self._integration_time = integration_time
190+
self._write8(TCS34725_ATIME, integration_time)
191+
192+
def get_integration_time(self):
193+
"""Return the current integration time value. This will be one of the
194+
constants specified in the set_integration_time doc string.
195+
"""
196+
return self._readU8(TCS34725_ATIME)
197+
198+
def set_gain(self, gain):
199+
"""Adjusts the gain on the TCS34725 (adjusts the sensitivity to light).
200+
Use one of the following constants:
201+
- TCS34725_GAIN_1X = No gain
202+
- TCS34725_GAIN_4X = 2x gain
203+
- TCS34725_GAIN_16X = 16x gain
204+
- TCS34725_GAIN_60X = 60x gain
205+
"""
206+
self._write8(TCS34725_CONTROL, gain)
207+
208+
def get_gain(self):
209+
"""Return the current gain value. This will be one of the constants
210+
specified in the set_gain doc string.
211+
"""
212+
return self._readU8(TCS34725_CONTROL)
213+
214+
def get_raw_data(self):
215+
"""Reads the raw red, green, blue and clear channel values. Will return
216+
a 4-tuple with the red, green, blue, clear color values (unsigned 16-bit
217+
numbers).
218+
"""
219+
# Read each color register.
220+
r = self._readU16LE(TCS34725_RDATAL)
221+
g = self._readU16LE(TCS34725_GDATAL)
222+
b = self._readU16LE(TCS34725_BDATAL)
223+
c = self._readU16LE(TCS34725_CDATAL)
224+
# Delay for the integration time to allow for next reading immediately.
225+
time.sleep(INTEGRATION_TIME_DELAY[self._integration_time])
226+
return (r, g, b, c)
227+
228+
def set_interrupt(self, enabled):
229+
"""Enable or disable interrupts by setting enabled to True or False."""
230+
enable_reg = self._readU8(TCS34725_ENABLE)
231+
if enabled:
232+
enable_reg |= TCS34725_ENABLE_AIEN
233+
else:
234+
enable_reg &= ~TCS34725_ENABLE_AIEN
235+
self._write8(TCS34725_ENABLE, enable_reg)
236+
time.sleep(1)
237+
238+
def clear_interrupt(self):
239+
"""Clear interrupt."""
240+
self._device.write8(0x66 & 0xff)
241+
242+
def set_interrupt_limits(self, low, high):
243+
"""Set the interrupt limits to provied unsigned 16-bit threshold values.
244+
"""
245+
self._device.write8(0x04, low & 0xFF)
246+
self._device.write8(0x05, low >> 8)
247+
self._device.write8(0x06, high & 0xFF)
248+
self._device.write8(0x07, high >> 8)

Adafruit_TCS34725/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from .TCS34725 import *

examples/simpletest.py

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Simple demo of reading color data with the TCS34725 sensor.
2+
# Will read the color from the sensor and print it out along with lux and
3+
# color temperature.
4+
# Author: Tony DiCola
5+
# License: Public Domain
6+
import time
7+
8+
# Import the TCS34725 module.
9+
import Adafruit_TCS34725
10+
11+
12+
# Create a TCS34725 instance with default integration time (2.4ms) and gain (4x).
13+
tcs = Adafruit_TCS34725.TCS34725()
14+
15+
# You can also override the I2C device address and/or bus with parameters:
16+
#tcs = Adafruit_TCS34725.TCS34725(address=0x30, bus=2)
17+
18+
# Or you can change the integration time and/or gain:
19+
#tcs = Adafruit_TCS34725.TCS34725(integration_time=Adafruit_TCS34725.TCS34725_INTEGRATIONTIME_700MS,
20+
# gain=Adafruit_TCS34725.TCS34725_GAIN_60X)
21+
# Possible integration time values:
22+
# - TCS34725_INTEGRATIONTIME_2_4MS (2.4ms, default)
23+
# - TCS34725_INTEGRATIONTIME_24MS
24+
# - TCS34725_INTEGRATIONTIME_50MS
25+
# - TCS34725_INTEGRATIONTIME_101MS
26+
# - TCS34725_INTEGRATIONTIME_154MS
27+
# - TCS34725_INTEGRATIONTIME_700MS
28+
# Possible gain values:
29+
# - TCS34725_GAIN_1X
30+
# - TCS34725_GAIN_4X
31+
# - TCS34725_GAIN_16X
32+
# - TCS34725_GAIN_60X
33+
34+
# Disable interrupts (can enable them by passing true, see the set_interrupt_limits function too).
35+
tcs.set_interrupt(False)
36+
37+
# Read the R, G, B, C color data.
38+
r, g, b, c = tcs.get_raw_data()
39+
40+
# Calculate color temperature using utility functions. You might also want to
41+
# check out the colormath library for much more complete/accurate color functions.
42+
color_temp = Adafruit_TCS34725.calculate_color_temperature(r, g, b)
43+
44+
# Calculate lux with another utility function.
45+
lux = Adafruit_TCS34725.calculate_lux(r, g, b)
46+
47+
# Print out the values.
48+
print('Color: red={0} green={1} blue={2} clear={3}'.format(r, g, b, c))
49+
50+
# Print out color temperature.
51+
if color_temp is None:
52+
print('Too dark to determine color temperature!')
53+
else:
54+
print('Color Temperature: {0} K'.format(color_temp))
55+
56+
# Print out the lux.
57+
print('Luminosity: {0} lux'.format(lux))
58+
59+
# Enable interrupts and put the chip back to low power sleep/disabled.
60+
tcs.set_interrupt(True)
61+
tcs.disable()

0 commit comments

Comments
 (0)