Import Custom Library
-
Greetings,
I am using a LoPy with atom, and I am having some issues with using a custom library file. I'm still a bit unfamiliar with how files are linked in Python. I am using tcs34725 from adafruit and there is some documentation on GitHub that I would like to use. I copied the "header" type file and included it in my project folder with the main.py code. When I run the code it cannot find the module. When I download it onto the chip and place this file into the "lib" section I get errors. See images below...


import time import ustruct #const = lambda x:x _COMMAND_BIT = const(0x80) _REGISTER_ENABLE = const(0x00) _REGISTER_ATIME = const(0x01) _REGISTER_AILT = const(0x04) _REGISTER_AIHT = const(0x06) _REGISTER_ID = const(0x12) _REGISTER_APERS = const(0x0c) _REGISTER_CONTROL = const(0x0f) _REGISTER_SENSORID = const(0x12) _REGISTER_STATUS = const(0x13) _REGISTER_CDATA = const(0x14) _REGISTER_RDATA = const(0x16) _REGISTER_GDATA = const(0x18) _REGISTER_BDATA = const(0x1a) _ENABLE_AIEN = const(0x10) _ENABLE_WEN = const(0x08) _ENABLE_AEN = const(0x02) _ENABLE_PON = const(0x01) _GAINS = (1, 4, 16, 60) _CYCLES = (0, 1, 2, 3, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60) class TCS34725: def __init__(self, i2c, address=0x29): self.i2c = i2c self.address = address self._active = False self.integration_time(2.4) sensor_id = self.sensor_id() if sensor_id not in (0x44, 0x10): raise RuntimeError("wrong sensor id 0x{:x}".format(sensor_id)) def _register8(self, register, value=None): register |= _COMMAND_BIT if value is None: return self.i2c.readfrom_mem(self.address, register, 1)[0] data = ustruct.pack('<B', value) self.i2c.writeto_mem(self.address, register, data) def _register16(self, register, value=None): register |= _COMMAND_BIT if value is None: data = self.i2c.readfrom_mem(self.address, register, 2) return ustruct.unpack('<H', data)[0] data = ustruct.pack('<H', value) self.i2c.writeto_mem(self.address, register, data) def active(self, value=None): if value is None: return self._active value = bool(value) if self._active == value: return self._active = value enable = self._register8(_REGISTER_ENABLE) if value: self._register8(_REGISTER_ENABLE, enable | _ENABLE_PON) time.sleep_ms(3) self._register8(_REGISTER_ENABLE, enable | _ENABLE_PON | _ENABLE_AEN) else: self._register8(_REGISTER_ENABLE, enable & ~(_ENABLE_PON | _ENABLE_AEN)) def sensor_id(self): return self._register8(_REGISTER_SENSORID) def integration_time(self, value=None): if value is None: return self._integration_time value = min(614.4, max(2.4, value)) cycles = int(value / 2.4) self._integration_time = cycles * 2.4 return self._register8(_REGISTER_ATIME, 256 - cycles) def gain(self, value): if value is None: return _GAINS[self._register8(_REGISTER_CONTROL)] if value not in _GAINS: raise ValueError("gain must be 1, 4, 16 or 60") return self._register8(_REGISTER_CONTROL, _GAINS.index(value)) def _valid(self): return bool(self._register8(_REGISTER_STATUS) & 0x01) def read(self, raw=False): was_active = self.active() self.active(True) while not self._valid(): time.sleep_ms(int(self._integration_time + 0.9)) data = tuple(self._register16(register) for register in ( _REGISTER_RDATA, _REGISTER_GDATA, _REGISTER_BDATA, _REGISTER_CDATA, )) self.active(was_active) if raw: return data return self._temperature_and_lux(data) def _temperature_and_lux(self, data): r, g, b, c = data x = -0.14282 * r + 1.54924 * g + -0.95641 * b y = -0.32466 * r + 1.57837 * g + -0.73191 * b z = -0.68202 * r + 0.77073 * g + 0.56332 * b d = x + y + z n = (x / d - 0.3320) / (0.1858 - y / d) cct = 449.0 * n**3 + 3525.0 * n**2 + 6823.3 * n + 5520.33 return cct, y def threshold(self, cycles=None, min_value=None, max_value=None): if cycles is None and min_value is None and max_value is None: min_value = self._register16(_REGISTER_AILT) max_value = self._register16(_REGISTER_AILT) if self._register8(_REGISTER_ENABLE) & _ENABLE_AIEN: cycles = _CYCLES[self._register8(_REGISTER_APERS) & 0x0f] else: cycles = -1 return cycles, min_value, max_value if min_value is not None: self._register16(_REGISTER_AILT, min_value) if max_value is not None: self._register16(_REGISTER_AIHT, max_value) if cycles is not None: enable = self._register8(_REGISTER_ENABLE) if cycles == -1: self._register8(_REGISTER_ENABLE, enable & ~(_ENABLE_AIEN)) else: self._register8(_REGISTER_ENABLE, enable | _ENABLE_AIEN) if cycles not in _CYCLES: raise ValueError("invalid persistence cycles") self._register8(_REGISTER_APERS, _CYCLES.index(cycles)) def interrupt(self, value=None): if value is None: return bool(self._register8(_REGISTER_STATUS) & _ENABLE_AIEN) if value: raise ValueError("interrupt can only be cleared") self.i2c.writeto(self.address, b'\xe6') def html_rgb(data): r, g, b, c = data red = pow((int((r/c) * 256) / 255), 2.5) * 255 green = pow((int((g/c) * 256) / 255), 2.5) * 255 blue = pow((int((b/c) * 256) / 255), 2.5) * 255 return red, green, blue def html_hex(data): r, g, b = html_rgb(data) return "{0:02x}{1:02x}{2:02x}".format(int(r), int(g), int(b))Here's the link...https://github.com/adafruit/micropython-adafruit-tcs34725/blob/master/tcs34725.py
Thanks!
-
Hi @Burgeh
You need to place the
tcs34725.pyin a folder calledlib -
I understand that and get this error when I flash it, but I would also like it to link in Atom so I can build and run it right away without having to flash it.

Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better ๐
Register Login