Welcome to the Pycom forum Forum
    • \[\[global:header.categories\]\]
    • \[\[global:header.recent\]\]
    • \[\[global:header.tags\]\]
    • \[\[global:header.popular\]\]
    • Login

    Explore Pybytes | Official Documentation | Report a Firmware Bug/Issue | GitHub

    Import Custom Library

    Scheduled Pinned Locked Moved MicroPython
    i2catomlibraryimportfipy
    3 Posts 2 Posters 856 Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • B Offline
      Burgeh
      last edited by Burgeh

      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...

      0_1537806299272_627f05cd-2144-4e1a-b0fe-2f3a18da6b0e-image.png
      0_1537806318279_5148aef7-c972-417c-9934-b697e07076ba-image.png

      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!

      1 Reply Last reply Reply Quote 0
      • danD Offline
        dan
        last edited by dan

        Hi @Burgeh

        You need to place the tcs34725.py in a folder called lib

        B 1 Reply Last reply Reply Quote 0
        • B Offline
          Burgeh @dan
          last edited by

          @dan

          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.
          0_1537809779675_2f6c007e-17d2-4496-a1eb-b82c77973113-image.png

          1 Reply Last reply Reply Quote 0

          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
          • 1 / 1
          • First post
            Last post

          Pycom on Twitter

          Pycom