{
  "store": "gekko-mip",
  "schema": 1,
  "updated": "2026-11-01",
  "base_url": "https://mygekko.si/mip",
  "licence_policy": "Only drivers whose licence allows redistribution are hosted: MIT, BSD-2-Clause, BSD-3-Clause, Apache-2.0 and ISC. GPL, D-FSL, unlicensed and unclear drivers are listed under not_hosted with their upstream github: install strings and are never copied to the server.",
  "count": 41,
  "packages": [
    {
      "name": "ads1x15",
      "summary": "ADS1115, ADS1015, ADS1113 and ADS1114 analog-to-digital converters over I2C",
      "category": "module",
      "version": "8981f67",
      "licence": "MIT",
      "parts": [
        "ads1115"
      ],
      "list_names": [
        "ads1115",
        "Adafruit_ADS1X15"
      ],
      "module": "ads1x15",
      "modules": [
        "ads1x15"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "ads1x15.py",
          "bytes": 9909,
          "sha256": "c8ad1a441752b69f8afeeba33d897f4ce23a8de518b715c6d98e9f36de6c9bee"
        }
      ],
      "source": "https://github.com/robert-hh/ads1x15",
      "commit": "8981f67137cdb01044c080863c653a7d7e7c87f6",
      "package_json": "https://mygekko.si/mip/ads1x15/package.json",
      "licence_url": "https://mygekko.si/mip/ads1x15/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/ads1x15\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/ads1x15",
        "board_index": "import mip; mip.install(\"ads1x15\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip ads1x15"
      },
      "usage": "from ads1x15 import ADS1115; adc = ADS1115(machine.I2C(0), address=0x48, gain=1); raw = adc.read(4, 0); volts = adc.raw_to_v(raw)",
      "problems": [
        "alert_start(latched=True) writes only the latch and one-conversion bits because of an operator precedence bug, so rate, gain, mode and channel fall back to the chip defaults; latched=False works."
      ]
    },
    {
      "name": "adxl345",
      "summary": "ADXL345 3-axis accelerometer over I2C",
      "category": "sensor",
      "version": "11cf142",
      "licence": "MIT",
      "parts": [
        "adxl345"
      ],
      "list_names": [
        "adxl345",
        "Adafruit_ADXL345"
      ],
      "module": "adxl345",
      "modules": [
        "adxl345"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "adxl345.py",
          "bytes": 3486,
          "sha256": "45d319ff0d50b2bf54f0f3c6f0ba1c2889e7bde91e0ab4bd0e4066c6bcfdc0cb"
        }
      ],
      "source": "https://github.com/zNitche/pico-adxl345",
      "commit": "11cf142dedf188a0445f075fa57600467af19f52",
      "package_json": "https://mygekko.si/mip/adxl345/package.json",
      "licence_url": "https://mygekko.si/mip/adxl345/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/adxl345\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/adxl345",
        "board_index": "import mip; mip.install(\"adxl345\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip adxl345"
      },
      "usage": "import adxl345; a = adxl345.ADXL345(machine.I2C(0)); a.start_measurements(); x, y, z = a.get_readings()  # m/s^2",
      "problems": [
        "Needs MicroPython 1.19 or newer (float-valued const()).",
        "The constructor talks to the sensor straight away (OSError if it does not answer), and readings stay zero until start_measurements() is called.",
        "I2C only: no SPI, interrupts, FIFO or tap detection."
      ]
    },
    {
      "name": "ahtx0",
      "summary": "AHT10 and AHT20 temperature and humidity sensors over I2C",
      "category": "sensor",
      "version": "d61a3c0",
      "licence": "MIT",
      "parts": [
        "aht20",
        "aht10"
      ],
      "list_names": [
        "aht10 / aht20"
      ],
      "module": "ahtx0",
      "modules": [
        "ahtx0"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "ahtx0.py",
          "bytes": 4505,
          "sha256": "de1fd826fb554ee6c281855fb44d3fca69d735be3e4fad9eaf7821e214bec846"
        }
      ],
      "source": "https://github.com/targetblank/micropython_ahtx0",
      "commit": "d61a3c04512193119cc78bbd156d4af422a42a6c",
      "package_json": "https://mygekko.si/mip/ahtx0/package.json",
      "licence_url": "https://mygekko.si/mip/ahtx0/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/ahtx0\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/ahtx0",
        "board_index": "import mip; mip.install(\"ahtx0\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip ahtx0"
      },
      "usage": "import ahtx0; s = ahtx0.AHT20(machine.I2C(0)); print(s.temperature, s.relative_humidity)",
      "problems": [
        "_wait_for_idle() has no timeout, so a sensor whose busy bit never clears hangs the caller."
      ]
    },
    {
      "name": "bh1750",
      "summary": "BH1750 ambient light sensor (GY-30, GY-302), lux over I2C",
      "category": "sensor",
      "version": "a66f11f",
      "licence": "Apache-2.0",
      "parts": [
        "bh1750"
      ],
      "list_names": [
        "bh1750"
      ],
      "module": "bh1750fvi",
      "modules": [
        "bh1750fvi"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "bh1750fvi.py",
          "bytes": 1355,
          "sha256": "9a2d1049918aff18dd007f9edda0aac3d66a69e0d48a594f88b730837ca7ddba"
        }
      ],
      "source": "https://github.com/catdog2/mpy_bh1750fvi_esp8266",
      "commit": "a66f11f88c6694b499fe92cbd627ede9f51b6c5c",
      "package_json": "https://mygekko.si/mip/bh1750/package.json",
      "licence_url": "https://mygekko.si/mip/bh1750/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/bh1750\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/bh1750",
        "board_index": "import mip; mip.install(\"bh1750\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip bh1750"
      },
      "usage": "import bh1750fvi; lux = bh1750fvi.sample(machine.I2C(0))  # one-shot high resolution, address 0x23",
      "problems": [
        "sample(mode=OP_SINGLE_HRES2) reads twice the real lux: high-resolution mode 2 counts 0.5 lx per step but the driver always divides by 1.2. OP_SINGLE_HRES1 (the default) and OP_SINGLE_LRES are correct."
      ]
    },
    {
      "name": "bme280",
      "summary": "BME280 temperature, humidity and pressure sensor over I2C (float and integer versions)",
      "category": "sensor",
      "version": "a9a7080",
      "licence": "MIT",
      "parts": [
        "bme280"
      ],
      "list_names": [
        "bme280",
        "Adafruit_BME280"
      ],
      "module": "bme280_float",
      "modules": [
        "bme280_float",
        "bme280_int"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "bme280_float.py",
          "bytes": 10022,
          "sha256": "1e2b3790e95b1752913ea643b34be6197e8f80c45da2868a2ce0a95d094bc217"
        },
        {
          "path": "bme280_int.py",
          "bytes": 10176,
          "sha256": "c1643d80f88d964bdc2b88f5cf3c3ed86db156e8601aab484edbdbd51a08dd29"
        }
      ],
      "source": "https://github.com/robert-hh/BME280",
      "commit": "a9a708015b149c23cf332f591b8371d217e416c1",
      "package_json": "https://mygekko.si/mip/bme280/package.json",
      "licence_url": "https://mygekko.si/mip/bme280/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/bme280\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/bme280",
        "board_index": "import mip; mip.install(\"bme280\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip bme280"
      },
      "usage": "import bme280_float; b = bme280_float.BME280(i2c=machine.I2C(0)); print(b.values)",
      "problems": [
        "Imports ustruct, the deprecated alias of struct (it still works on current MicroPython)."
      ]
    },
    {
      "name": "bmp280",
      "summary": "BMP280 pressure and temperature sensor over I2C",
      "category": "sensor",
      "version": "83dfdd6",
      "licence": "MIT",
      "parts": [
        "bmp280"
      ],
      "list_names": [
        "bmp280",
        "Adafruit_BMP280"
      ],
      "module": "bmp280",
      "modules": [
        "bmp280"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "bmp280.py",
          "bytes": 9983,
          "sha256": "905e089799732552d15ca60154b3b95c585159282855a36ec950f4d5f16ceda8"
        }
      ],
      "source": "https://github.com/dafvid/micropython-bmp280",
      "commit": "83dfdd6dff6382c7aff03138d32ae48d00ec729a",
      "package_json": "https://mygekko.si/mip/bmp280/package.json",
      "licence_url": "https://mygekko.si/mip/bmp280/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/bmp280\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/bmp280",
        "board_index": "import mip; mip.install(\"bmp280\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip bmp280"
      },
      "usage": "import bmp280; b = bmp280.BMP280(machine.I2C(0), addr=0x76); print(b.temperature, b.pressure)  # C, Pa",
      "problems": [
        "The default address is 0x76; boards strapped to 0x77 (Adafruit, for example) need addr=0x77.",
        "There is no chip-id check, so a different device at that address is used silently."
      ]
    },
    {
      "name": "dfplayer",
      "summary": "DFPlayer Mini MP3 player module over UART",
      "category": "module",
      "version": "ca8b5b2",
      "licence": "MIT",
      "parts": [
        "dfplayer-mini"
      ],
      "list_names": [
        "dfplayer",
        "DFRobotDFPlayerMini"
      ],
      "module": "dfplayer",
      "modules": [
        "dfplayer"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "dfplayer/__init__.py",
          "bytes": 2557,
          "sha256": "f6e7677fa0abae79d7acccb541086c6974e408c06a39d801042e826acf152a5f"
        }
      ],
      "source": "https://github.com/redoxcode/micropython-dfplayer",
      "commit": "ca8b5b27f97bf2a37dfddb1c1a0253613aac94d0",
      "package_json": "https://mygekko.si/mip/dfplayer/package.json",
      "licence_url": "https://mygekko.si/mip/dfplayer/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/dfplayer\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/dfplayer",
        "board_index": "import mip; mip.install(\"dfplayer\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip dfplayer"
      },
      "usage": "from dfplayer import DFPlayer; df = DFPlayer(uart_id=0, tx_pin_id=0, rx_pin_id=1); df.volume(20); df.play(1, 1)",
      "problems": [
        "Checksum bug in send_cmd(): frames whose bytes add up to 384 or more get a wrong checksum (for example play(folder, file) with folder + file >= 108), and the module may reject them.",
        "The constructor first opens the UART on the port's default pins. On a classic ESP32 avoid UART 1 (its default pins are flash pins on many modules) and use UART 2.",
        "is_playing(), get_volume() and get_files_in_folder() call UART.flush(), which needs MicroPython 1.20 or newer.",
        "esp8266 is not listed: its UART1 only transmits, so queries time out."
      ]
    },
    {
      "name": "dotstar",
      "summary": "APA102 (DotStar) addressable LED strips over SPI",
      "category": "display",
      "version": "f4ea122",
      "licence": "MIT",
      "parts": [
        "apa102"
      ],
      "list_names": [
        "apa102"
      ],
      "module": "micropython_dotstar",
      "modules": [
        "micropython_dotstar"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "micropython_dotstar.py",
          "bytes": 8962,
          "sha256": "85cdb238f219ffa77d113dc414d2fc54c64d9b1fd8cc05fef72422704e4ead5e"
        }
      ],
      "source": "https://github.com/mattytrentini/micropython-dotstar",
      "commit": "f4ea12232af219a39aa39b38252de999bd789063",
      "package_json": "https://mygekko.si/mip/dotstar/package.json",
      "licence_url": "https://mygekko.si/mip/dotstar/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/dotstar\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/dotstar",
        "board_index": "import mip; mip.install(\"dotstar\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip dotstar"
      },
      "usage": "import micropython_dotstar; strip = micropython_dotstar.DotStar(machine.SPI(1, baudrate=4_000_000), 30, brightness=0.2); strip[0] = (255, 0, 0); strip.show()",
      "problems": [
        "Reading a pixel back is only correct for the default BGR pixel order.",
        "The upstream README builds the bus with SPI(sck=..., mosi=...) and no id, the deprecated software SPI form; use machine.SPI(1, ...) or machine.SoftSPI(...)."
      ]
    },
    {
      "name": "ds3231",
      "summary": "DS3231 precision real-time clock (ZS-042 module) over I2C",
      "category": "module",
      "version": "6c4b362",
      "licence": "MIT",
      "parts": [
        "ds3231"
      ],
      "list_names": [
        "ds3231",
        "RTClib"
      ],
      "module": "ds3231_gen",
      "modules": [
        "ds3231_gen"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "ds3231_gen.py",
          "bytes": 4902,
          "sha256": "94a3d12bdef1cf8e3d09103beb466b168990975feae44e756768dddec6db2fd5"
        }
      ],
      "source": "https://github.com/peterhinch/micropython-samples",
      "commit": "6c4b362c0c0eb2ab8424dbe63587283154293ad0",
      "package_json": "https://mygekko.si/mip/ds3231/package.json",
      "licence_url": "https://mygekko.si/mip/ds3231/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/ds3231\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/ds3231",
        "board_index": "import mip; mip.install(\"ds3231\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip ds3231"
      },
      "usage": "from ds3231_gen import DS3231; d = DS3231(machine.I2C(0)); print(d.get_time(), d.temperature())",
      "problems": [
        "Importing it creates a module-level machine.RTC() and prints a warning if the port has none.",
        "DS3231(i2c) raises RuntimeError if 0x68 does not answer a bus scan.",
        "Uses f-strings (MicroPython 1.17 or newer)."
      ]
    },
    {
      "name": "hcsr04",
      "summary": "HC-SR04 ultrasonic distance sensor",
      "category": "sensor",
      "version": "17eafe3",
      "licence": "Apache-2.0",
      "parts": [
        "hc-sr04"
      ],
      "list_names": [
        "hcsr04",
        "NewPing",
        "Ultrasonic"
      ],
      "module": "hcsr04",
      "modules": [
        "hcsr04"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "hcsr04.py",
          "bytes": 3400,
          "sha256": "4214d4fbee9aaacd591e7df963c6f011dd76ddd6e5b9339543972cf77f47c117"
        }
      ],
      "source": "https://github.com/rsc1975/micropython-hcsr04",
      "commit": "17eafe3730ce27a880ba45f4c4891efeb112bf82",
      "package_json": "https://mygekko.si/mip/hcsr04/package.json",
      "licence_url": "https://mygekko.si/mip/hcsr04/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/hcsr04\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/hcsr04",
        "board_index": "import mip; mip.install(\"hcsr04\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip hcsr04"
      },
      "usage": "from hcsr04 import HCSR04; s = HCSR04(trigger_pin=5, echo_pin=18, echo_timeout_us=30000); cm = s.distance_cm()",
      "problems": [
        "On an echo timeout (nothing in range, or a wiring fault) it returns about 250 cm / 2500 mm instead of raising: current firmware's time_pulse_us returns a negative code, which the driver turns into a fixed 14,550 us pulse. Treat about 250 cm as 'no echo'."
      ]
    },
    {
      "name": "ht16k33",
      "summary": "HT16K33 LED backpacks: 7- and 14-segment displays, 8x8 and bicolour matrices, bar graphs",
      "category": "display",
      "version": "4.3.0",
      "licence": "MIT",
      "parts": [
        "ht16k33"
      ],
      "list_names": [
        "ht16k33"
      ],
      "module": "ht16k33",
      "modules": [
        "ht16k33"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "ht16k33/__init__.py",
          "bytes": 469,
          "sha256": "d5e2b6051bc2d854937054a5e12c7de82668f1f7472db7c97a23c7e70faf2465"
        },
        {
          "path": "ht16k33/ht16k33.py",
          "bytes": 4610,
          "sha256": "49358d7a131f34a4831bd40e4fe3775823227c70b3b5a85b4b444818e6c59b86"
        },
        {
          "path": "ht16k33/ht16k33bar.py",
          "bytes": 4649,
          "sha256": "fc92d49b8a2ee08873e971476c206f72f5802431d9783ec93fa116f83868ce9e"
        },
        {
          "path": "ht16k33/ht16k33matrix.py",
          "bytes": 14037,
          "sha256": "efb81dceaa1a1978472bf98b852eae7040cb87890bb969ad47ae1c64cf1f436e"
        },
        {
          "path": "ht16k33/ht16k33matrixcolour.py",
          "bytes": 15049,
          "sha256": "dbe3f46e34fbbbd396201da73548a9dd94e8fe5fb7a2ade716a67e00f01b147f"
        },
        {
          "path": "ht16k33/ht16k33matrixfeatherwing.py",
          "bytes": 11534,
          "sha256": "9de9f30ad39343a57d55012886d52c40c9564d0bd192d8f1c730e5670b115ba5"
        },
        {
          "path": "ht16k33/ht16k33matrixmulti.py",
          "bytes": 12614,
          "sha256": "5964db421c90cb26feb84e41397a1f8535d9aa8b5d39adb81788143a8bbb045a"
        },
        {
          "path": "ht16k33/ht16k33segment.py",
          "bytes": 7960,
          "sha256": "5a077602920cf8ef34aecabfc0ff44c7506f82e6f77c7b19df0d3e5c3ceefc86"
        },
        {
          "path": "ht16k33/ht16k33segment14.py",
          "bytes": 11120,
          "sha256": "a45c09f10bd13e4fcf89f91186fb46534bdf9bdfd2801fd01c80d331bba3e729"
        },
        {
          "path": "ht16k33/ht16k33segmentbig.py",
          "bytes": 6944,
          "sha256": "d917b1863a92bb84d22161faa034b51947f40339d3edef1cbf480f2c555af0ce"
        },
        {
          "path": "ht16k33/ht16k33segmentgen.py",
          "bytes": 6810,
          "sha256": "a2d595cebecb4a72d2863d7466d6714ca42b2ed62501bdb86987ad4a544c8400"
        }
      ],
      "source": "https://github.com/smittytone/HT16K33-Python",
      "commit": "0060f540d57798bf0c8f107a2338ec276de0c48d",
      "package_json": "https://mygekko.si/mip/ht16k33/package.json",
      "licence_url": "https://mygekko.si/mip/ht16k33/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/ht16k33\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/ht16k33",
        "board_index": "import mip; mip.install(\"ht16k33\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip ht16k33"
      },
      "usage": "from ht16k33 import HT16K33Segment; d = HT16K33Segment(machine.I2C(0)); d.set_number(4, 0); d.draw()",
      "problems": [
        "ht16k33/__init__.py imports all ten modules, so any import compiles about 95 KB of source: fine on rp2 and esp32, likely MemoryError on an ESP8266 (not listed).",
        "ht16k33bar uses f-strings (MicroPython 1.17 or newer).",
        "set_angle() with a negative angle falls back to 0 on the matrix classes."
      ]
    },
    {
      "name": "hx711",
      "summary": "HX711 load-cell amplifier (24-bit ADC)",
      "category": "sensor",
      "version": "a5502c9",
      "licence": "MIT",
      "parts": [
        "hx711"
      ],
      "list_names": [
        "hx711",
        "HX711"
      ],
      "module": "hx711_gpio",
      "modules": [
        "hx711_gpio",
        "hx711_pio",
        "hx711_spi"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "hx711_gpio.py",
          "bytes": 4506,
          "sha256": "76164835a0840e03c6b7a90d5424495610420fe596ce92d00571baf1b199ed11"
        },
        {
          "path": "hx711_pio.py",
          "bytes": 5346,
          "sha256": "8a18a9d7f9c93d2079253a6ca8baf5007e60484ea55a82dec4972a49174743e3"
        },
        {
          "path": "hx711_spi.py",
          "bytes": 4200,
          "sha256": "f3a4ef9b243b13552e59c44ce1fe23a066fde7c466c98de61d36640611b963fb"
        }
      ],
      "source": "https://github.com/robert-hh/hx711",
      "commit": "a5502c9400b72cc79c4343eb082a153f1ae2f3a5",
      "package_json": "https://mygekko.si/mip/hx711/package.json",
      "licence_url": "https://mygekko.si/mip/hx711/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/hx711\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/hx711",
        "board_index": "import mip; mip.install(\"hx711\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip hx711"
      },
      "usage": "from hx711_gpio import HX711; hx = HX711(machine.Pin(14, machine.Pin.OUT), machine.Pin(15, machine.Pin.IN)); hx.tare(); print(hx.get_value())",
      "problems": [
        "hx711_pio imports rp2, so it only works on the Pico; use hx711_gpio elsewhere.",
        "set_gain() compares with 'is', so any value other than the plain integers (128.0, for example) silently leaves the gain unset.",
        "Upstream points to its successor repository, HX71X.",
        "hx711_spi power_down() and power_up() may only work with SoftSPI."
      ]
    },
    {
      "name": "ili9341",
      "summary": "ILI9341 240x320 SPI TFT displays (drawing only, no touch)",
      "category": "display",
      "version": "67c5131",
      "licence": "MIT",
      "parts": [
        "ili9341"
      ],
      "list_names": [
        "ili9341",
        "Adafruit_ILI9341"
      ],
      "module": "ili9341",
      "modules": [
        "ili9341"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "ili9341.py",
          "bytes": 38851,
          "sha256": "a1096add89f3dae69b05e0f7e14a981f6c31f5abd539e66d266d7cddfdf40eb1"
        }
      ],
      "source": "https://github.com/rdagger/micropython-ili9341",
      "commit": "67c51314a7a3e3b379c13c40e03ca5c37d6489b9",
      "package_json": "https://mygekko.si/mip/ili9341/package.json",
      "licence_url": "https://mygekko.si/mip/ili9341/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/ili9341\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/ili9341",
        "board_index": "import mip; mip.install(\"ili9341\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip ili9341"
      },
      "usage": "import ili9341; d = ili9341.Display(machine.SPI(1, baudrate=40_000_000), cs=machine.Pin(9), dc=machine.Pin(8), rst=machine.Pin(7)); d.draw_text8x8(0, 0, 'Hi', ili9341.color565(255, 255, 255))",
      "problems": [
        "38.9 KB in one file: it will not compile in ESP8266 RAM (esp8266 is not listed), and the first import takes a moment on rp2 and esp32; mpy-cross helps.",
        "Touch (xpt2046.py) and the font loader (xglcd_font.py and its font files) are not included, so draw_text() needs files from the upstream repository."
      ]
    },
    {
      "name": "l298n",
      "summary": "L298N dual H-bridge: two DC motors, direction and PWM speed",
      "category": "actuator",
      "version": "1.0.0",
      "licence": "MIT",
      "parts": [
        "l298n"
      ],
      "list_names": [
        "l298n",
        "L298N"
      ],
      "module": "l298n",
      "modules": [
        "l298n"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "l298n.py",
          "bytes": 5264,
          "sha256": "59e98de308bdcb25473717de315611d77987705d21d2de1c1c0d228ac58d9302"
        }
      ],
      "source": "gekko",
      "commit": null,
      "package_json": "https://mygekko.si/mip/l298n/package.json",
      "licence_url": "https://mygekko.si/mip/l298n/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/l298n\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/l298n",
        "board_index": "import mip; mip.install(\"l298n\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip l298n"
      },
      "usage": "from l298n import L298N; m = L298N(ena=10, in1=11, in2=12, enb=13, in3=14, in4=15); m.a.speed(60)",
      "problems": [
        "Not yet run on a board: tested under CPython against simulated machine and time modules."
      ]
    },
    {
      "name": "lcd1602",
      "summary": "HD44780 character LCDs (16x2, 20x4) on a PCF8574 I2C backpack or wired in parallel",
      "category": "display",
      "version": "7affb0b",
      "licence": "MIT",
      "parts": [
        "lcd1602_i2c"
      ],
      "list_names": [
        "lcd1602",
        "LiquidCrystal_I2C",
        "LiquidCrystal (Built-in)"
      ],
      "module": "machine_i2c_lcd",
      "modules": [
        "machine_i2c_lcd",
        "lcd_api",
        "nodemcu_gpio_lcd"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "machine_i2c_lcd.py",
          "bytes": 3269,
          "sha256": "d07e045ff85c1351d9e99c0d9bda1f4cc1a7dc35ca67fdd928fadc9c14e50881"
        },
        {
          "path": "lcd_api.py",
          "bytes": 7669,
          "sha256": "4668f59fef84405a4294bcb0ee7309a97e87e5fc5adaab6aef7f622e3d54b569"
        },
        {
          "path": "nodemcu_gpio_lcd.py",
          "bytes": 5988,
          "sha256": "bcddd07626b71c4b77ea7ee86f6c2108feea1077357aaff76858700fdf7f804a"
        }
      ],
      "source": "https://github.com/dhylands/python_lcd",
      "commit": "7affb0bceae672624ce1360a18c90623ca6857c1",
      "package_json": "https://mygekko.si/mip/lcd1602/package.json",
      "licence_url": "https://mygekko.si/mip/lcd1602/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/lcd1602\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/lcd1602",
        "board_index": "import mip; mip.install(\"lcd1602\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip lcd1602"
      },
      "usage": "from machine_i2c_lcd import I2cLcd; lcd = I2cLcd(machine.I2C(0, freq=100_000), 0x27, 2, 16); lcd.putstr('Hello')",
      "problems": []
    },
    {
      "name": "lis3dh",
      "summary": "LIS3DH 3-axis accelerometer over I2C",
      "category": "sensor",
      "version": "da3b9da",
      "licence": "MIT",
      "parts": [
        "lis3dh"
      ],
      "list_names": [
        "lis3dh",
        "Adafruit_LIS3DH"
      ],
      "module": "micropython_lis3dh.lis3dh",
      "modules": [
        "micropython_lis3dh"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "micropython_lis3dh/__init__.py",
          "bytes": 0,
          "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
        },
        {
          "path": "micropython_lis3dh/i2c_helpers.py",
          "bytes": 2084,
          "sha256": "ecc8ab5be50d2e568536f582a18e3df5adbc081beb4046371f8404740fd399cb"
        },
        {
          "path": "micropython_lis3dh/lis3dh.py",
          "bytes": 9609,
          "sha256": "e836a0182f8cf4b795f39d851b268e94cf22003c05e6b101429d24a452ecfd11"
        }
      ],
      "source": "https://github.com/jposada202020/MicroPython_LIS3DH",
      "commit": "da3b9dabdadf94ae4a758663fc2eba19ebe6e472",
      "package_json": "https://mygekko.si/mip/lis3dh/package.json",
      "licence_url": "https://mygekko.si/mip/lis3dh/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/lis3dh\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/lis3dh",
        "board_index": "import mip; mip.install(\"lis3dh\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip lis3dh"
      },
      "usage": "from micropython_lis3dh import lis3dh; acc = lis3dh.LIS3DH(machine.I2C(0)); print(acc.acceleration)",
      "problems": [
        "Upstream marks the repository deprecated and unmaintained.",
        "Register access uses descriptors (MICROPY_PY_DESCRIPTORS): on in the standard rp2, esp32 and esp8266 builds, possibly off in minimal custom builds.",
        "I2C and acceleration only: no tap or click detection, interrupts, ADC or temperature."
      ]
    },
    {
      "name": "matrix_keypad",
      "summary": "Matrix keypads (4x4, 3x4 and other sizes) scanned from GPIOs",
      "category": "module",
      "version": "1.0.0",
      "licence": "MIT",
      "parts": [
        "keypad_4x4"
      ],
      "list_names": [
        "matrix_keypad",
        "Keypad"
      ],
      "module": "matrix_keypad",
      "modules": [
        "matrix_keypad"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "matrix_keypad.py",
          "bytes": 5081,
          "sha256": "88814bf22cf718ae22bd70453478fbf983746c28ac6bc21a0c9d5da0c8aae1e8"
        }
      ],
      "source": "gekko",
      "commit": null,
      "package_json": "https://mygekko.si/mip/matrix_keypad/package.json",
      "licence_url": "https://mygekko.si/mip/matrix_keypad/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/matrix_keypad\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/matrix_keypad",
        "board_index": "import mip; mip.install(\"matrix_keypad\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip matrix_keypad"
      },
      "usage": "from matrix_keypad import MatrixKeypad; kp = MatrixKeypad(rows=(2, 3, 4, 5), cols=(6, 7, 8, 9)); print(kp.get_key())",
      "problems": [
        "Not yet run on a board: tested under CPython against simulated machine and time modules."
      ]
    },
    {
      "name": "max7219",
      "summary": "MAX7219 8x8 LED matrix modules, chained (FC-16 4-in-1 and similar)",
      "category": "display",
      "version": "22195dc",
      "licence": "MIT",
      "parts": [
        "max7219"
      ],
      "list_names": [
        "max7219",
        "LedControl",
        "MD_Parola"
      ],
      "module": "max7219",
      "modules": [
        "max7219"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "max7219.py",
          "bytes": 3530,
          "sha256": "a039c885f28dab40722aba931287a3c5bc2447ae08bc97fda3d541fa78d8b6bc"
        }
      ],
      "source": "https://github.com/mcauser/micropython-max7219",
      "commit": "22195dcc56dc4e305848573946cdae68b9dd34dc",
      "package_json": "https://mygekko.si/mip/max7219/package.json",
      "licence_url": "https://mygekko.si/mip/max7219/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/max7219\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/max7219",
        "board_index": "import mip; mip.install(\"max7219\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip max7219"
      },
      "usage": "import max7219; d = max7219.Matrix8x8(machine.SPI(1, baudrate=10_000_000), machine.Pin(9, machine.Pin.OUT), 4); d.brightness(5); d.text('Hi', 0, 0, 1); d.show()",
      "problems": [
        "8x8 matrices only: no digit or segment API for the 8-digit 7-segment variant, and no scrolling-text engine like MD_Parola.",
        "Module order and orientation depend on the board: some 4-in-1 modules show mirrored or reversed panels."
      ]
    },
    {
      "name": "mfrc522",
      "summary": "MFRC522 (RC522) 13.56 MHz RFID reader over SPI",
      "category": "module",
      "version": "3d52d16",
      "licence": "MIT",
      "parts": [
        "mfrc522"
      ],
      "list_names": [
        "mfrc522",
        "MFRC522"
      ],
      "module": "mfrc522",
      "modules": [
        "mfrc522"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "mfrc522.py",
          "bytes": 14944,
          "sha256": "b9456632b9ea3d1ed0835595c812548e3f3af19066d987f00a39f9be5644ccba"
        }
      ],
      "source": "https://github.com/danjperron/micropython-mfrc522",
      "commit": "3d52d16f045558c1631e0b482c448e8ce0316c0a",
      "package_json": "https://mygekko.si/mip/mfrc522/package.json",
      "licence_url": "https://mygekko.si/mip/mfrc522/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/mfrc522\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/mfrc522",
        "board_index": "import mip; mip.install(\"mfrc522\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip mfrc522"
      },
      "usage": "from mfrc522 import MFRC522; r = MFRC522(spi_id=0, sck=18, mosi=19, miso=16, cs=17, rst=20); stat, bits = r.request(r.REQIDL)  # stat == r.OK when a card is in the field",
      "problems": [
        "On esp32 and esp8266 it builds the legacy software SPI (SPI with no id): it works at a fixed 100 kHz, ignores spi_id and baudrate, and prints a deprecation warning every time.",
        "IsNTAG() checks the wrong byte, so NTAG216 tags are never detected (NTAG213 and 215 are).",
        "A missing card costs the full 2000-poll timeout in _tocard(): slow, not wrong."
      ]
    },
    {
      "name": "micropygps",
      "summary": "NMEA sentence parser for UART GPS modules (u-blox NEO-6M and others)",
      "category": "module",
      "version": "f6c2b76",
      "licence": "MIT",
      "parts": [
        "neo-6m"
      ],
      "list_names": [
        "gps_nmea"
      ],
      "module": "micropyGPS",
      "modules": [
        "micropyGPS"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "micropyGPS.py",
          "bytes": 29515,
          "sha256": "ecbae3ad114ce4a9f786e8c6f02302d223973abe824061c7c2f0b76134bd4cd4"
        }
      ],
      "source": "https://github.com/inmcm/micropyGPS",
      "commit": "f6c2b76a3bedf7d85e77fc6d52e0346b68361ce2",
      "package_json": "https://mygekko.si/mip/micropygps/package.json",
      "licence_url": "https://mygekko.si/mip/micropygps/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/micropygps\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/micropygps",
        "board_index": "import mip; mip.install(\"micropygps\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip micropygps"
      },
      "usage": "from micropyGPS import MicropyGPS; gps = MicropyGPS(); uart = machine.UART(0, 9600); [gps.update(chr(b)) for b in (uart.read() or b'')]; print(gps.latitude, gps.longitude)",
      "problems": [
        "29.5 KB of source: compiling it on an ESP8266 probably runs out of heap (esp8266 is not listed; use a precompiled .mpy there).",
        "GA, GB and BD-only sentences are ignored; the NEO-6M sends GP, so it is fine.",
        "gpgsa() and gpgsv() can raise IndexError out of update() on a CRC-valid but truncated sentence."
      ]
    },
    {
      "name": "mpu6050",
      "summary": "MPU-6050 6-axis accelerometer and gyroscope (GY-521) over I2C",
      "category": "sensor",
      "version": "ae68046",
      "licence": "MIT",
      "parts": [
        "mpu6050"
      ],
      "list_names": [
        "mpu6050",
        "Adafruit_MPU6050"
      ],
      "module": "imu",
      "modules": [
        "imu",
        "vector3d"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "imu.py",
          "bytes": 14299,
          "sha256": "75e93336937ba2c993f5ed0051c86c0c59b1a93bddeb0e55e8850028512ccf32"
        },
        {
          "path": "vector3d.py",
          "bytes": 4784,
          "sha256": "af98570604d34b67756374a5697e47da07b47c2436e517b29d064916445eb8c3"
        }
      ],
      "source": "https://github.com/micropython-IMU/micropython-mpu9x50",
      "commit": "ae68046e310224ebc3e196a1e3692de018991dbb",
      "package_json": "https://mygekko.si/mip/mpu6050/package.json",
      "licence_url": "https://mygekko.si/mip/mpu6050/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/mpu6050\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/mpu6050",
        "board_index": "import mip; mip.install(\"mpu6050\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip mpu6050"
      },
      "usage": "from imu import MPU6050; m = MPU6050(machine.I2C(0)); print(m.accel.xyz, m.gyro.xyz, m.temperature)",
      "problems": [
        "device_addr is an index (0 for 0x68, 1 for 0x69), not an address: MPU6050(i2c, device_addr=0x68) raises ValueError. Leave it out to auto-detect.",
        "imu and vector3d are generic module names in /lib.",
        "The chip_id property uses an f-string (MicroPython 1.17 or newer).",
        "Every accel or gyro update re-reads the range register: slow, but correct."
      ]
    },
    {
      "name": "mq2",
      "summary": "MQ-2 smoke and combustible gas sensor on an ADC pin",
      "category": "sensor",
      "version": "1.0.0",
      "licence": "MIT",
      "parts": [
        "mq-2"
      ],
      "list_names": [
        "mq2",
        "MQUnifiedsensor"
      ],
      "module": "mq2",
      "modules": [
        "mq2"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "mq2.py",
          "bytes": 6320,
          "sha256": "4cc24671fca3401d62e150c2e0c73271076b5d4e4a865a01dcf60b89489f2433"
        }
      ],
      "source": "gekko",
      "commit": null,
      "package_json": "https://mygekko.si/mip/mq2/package.json",
      "licence_url": "https://mygekko.si/mip/mq2/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/mq2\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/mq2",
        "board_index": "import mip; mip.install(\"mq2\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip mq2"
      },
      "usage": "from mq2 import MQ2; gas = MQ2(26); print(gas.voltage(), gas.rs())",
      "problems": [
        "Not yet run on a board: tested under CPython against simulated machine and time modules."
      ]
    },
    {
      "name": "pca9685",
      "summary": "PCA9685 16-channel PWM and servo boards, and the Adafruit Motor Shield V2",
      "category": "actuator",
      "version": "0fea273",
      "licence": "MIT",
      "parts": [
        "pca9685",
        "adafruit_motor_shield_v2"
      ],
      "list_names": [
        "pca9685",
        "PWM Servo Driver Library",
        "Adafruit Motor Shield V2"
      ],
      "module": "pca9685",
      "modules": [
        "pca9685",
        "pca9685_servo",
        "motor",
        "stepper"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "pca9685.py",
          "bytes": 1893,
          "sha256": "5b4dfa9ad5ccf9e8871a422af0ee54c4e7ff008f0808a6639857ac7b80bdb5cb"
        },
        {
          "path": "motor.py",
          "bytes": 1262,
          "sha256": "fdf3488dfd0484923c95571b7dc419971ec5b282e6a3133ae0429507b032fd9b"
        },
        {
          "path": "stepper.py",
          "bytes": 6320,
          "sha256": "74df7f17a88e944fffccb57ef0634443238dc2a3168a5066c3a9760cee12117a"
        },
        {
          "path": "pca9685_servo.py",
          "bytes": 1177,
          "sha256": "c67597f539c72ced0ca322c3dc6ba79749c54ea4ad589a1ddb8755d5463a8b3a"
        }
      ],
      "source": "https://github.com/adafruit/micropython-adafruit-pca9685",
      "commit": "0fea2736f99a2840f0d644be866f6abd5bc14b48",
      "package_json": "https://mygekko.si/mip/pca9685/package.json",
      "licence_url": "https://mygekko.si/mip/pca9685/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/pca9685\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/pca9685",
        "board_index": "import mip; mip.install(\"pca9685\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip pca9685"
      },
      "usage": "from pca9685_servo import Servos; s = Servos(machine.I2C(0), address=0x40); s.position(0, degrees=90)",
      "problems": [
        "Upstream is archived (last commit 2018), so no fixes will come.",
        "duty() read-back is wrong for fully-off and fully-on channels (4096 for off, 0 for on); setting a duty is fine. DCMotors.speed() read-back inherits this.",
        "Upstream documentation says 'import servo'; in this store the module is pca9685_servo.",
        "motor.py and stepper.py install under those generic names in /lib; another module with either name would collide with them."
      ]
    },
    {
      "name": "pcd8544",
      "summary": "PCD8544 (Nokia 5110) 84x48 monochrome LCD over SPI",
      "category": "display",
      "version": "791d423",
      "licence": "MIT",
      "parts": [
        "pcd8544"
      ],
      "list_names": [
        "pcd8544"
      ],
      "module": "pcd8544_fb",
      "modules": [
        "pcd8544_fb",
        "pcd8544"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "pcd8544_fb.py",
          "bytes": 4957,
          "sha256": "2c10d27ae1a0d55cd95b4d9fe972aeef7fc4ac6050568ec37869dc34e70e4d1b"
        },
        {
          "path": "pcd8544.py",
          "bytes": 5669,
          "sha256": "8d81b6c7bb776938cda2ffd0aec068af516b5b24051a8501d5c5475e5e487538"
        }
      ],
      "source": "https://github.com/mcauser/micropython-pcd8544",
      "commit": "791d4239d77b0d06192c7ab7903d81a72a53f992",
      "package_json": "https://mygekko.si/mip/pcd8544/package.json",
      "licence_url": "https://mygekko.si/mip/pcd8544/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/pcd8544\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/pcd8544",
        "board_index": "import mip; mip.install(\"pcd8544\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip pcd8544"
      },
      "usage": "import pcd8544_fb; lcd = pcd8544_fb.PCD8544_FB(machine.SPI(1, baudrate=2_000_000), cs=machine.Pin(9), dc=machine.Pin(8), rst=machine.Pin(7)); lcd.text('Hi', 0, 0, 1); lcd.show()",
      "problems": [
        "Always pass a reset Pin: the documented rst=None default raises TypeError, because the constructor always calls reset().",
        "show() packs the buffer with a 504-argument struct.pack call each time: it works, but it is slow and allocates memory.",
        "Unmaintained since 2018."
      ]
    },
    {
      "name": "pn532",
      "summary": "PN532 NFC/RFID reader over SPI (Mifare Classic, NTAG2xx)",
      "category": "module",
      "version": "a5d8189",
      "licence": "MIT",
      "parts": [
        "pn532"
      ],
      "list_names": [
        "pn532"
      ],
      "module": "NFC_PN532",
      "modules": [
        "NFC_PN532"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "NFC_PN532.py",
          "bytes": 15788,
          "sha256": "c30f01cdd49c4d44378d7e983f64997139eb9e24af9a78c2f4859be8eeefd4a3"
        }
      ],
      "source": "https://github.com/Carglglz/NFC_PN532_SPI",
      "commit": "a5d81891634cdc45c8407fea4496023a2e644262",
      "package_json": "https://mygekko.si/mip/pn532/package.json",
      "licence_url": "https://mygekko.si/mip/pn532/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/pn532\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/pn532",
        "board_index": "import mip; mip.install(\"pn532\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip pn532"
      },
      "usage": "import NFC_PN532 as nfc; pn = nfc.PN532(machine.SPI(0, baudrate=1_000_000), machine.Pin(17, machine.Pin.OUT)); pn.SAM_configuration(); uid = pn.read_passive_target(timeout=500)",
      "problems": [
        "SPI only: no I2C or HSU (UART) transport.",
        "ntag2xx_read_block() raises TypeError when a read fails, and ntag2xx_write_block() and mifare_classic_authenticate_block() fail the same way when the PN532 times out (they index a None response).",
        "15.8 KB of source: compiling it on an ESP8266 may run out of RAM; precompile it with mpy-cross there."
      ]
    },
    {
      "name": "rcwl0516",
      "summary": "RCWL-0516 microwave radar motion sensor on one GPIO",
      "category": "sensor",
      "version": "1.0.0",
      "licence": "MIT",
      "parts": [
        "rcwl-0516"
      ],
      "list_names": [
        "rcwl0516"
      ],
      "module": "rcwl0516",
      "modules": [
        "rcwl0516"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "rcwl0516.py",
          "bytes": 3563,
          "sha256": "3bbb60297f56bbb3eeeea7fbba020248f20c4451565c1254ec14ef542eaf5e67"
        }
      ],
      "source": "gekko",
      "commit": null,
      "package_json": "https://mygekko.si/mip/rcwl0516/package.json",
      "licence_url": "https://mygekko.si/mip/rcwl0516/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/rcwl0516\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/rcwl0516",
        "board_index": "import mip; mip.install(\"rcwl0516\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip rcwl0516"
      },
      "usage": "from rcwl0516 import RCWL0516; radar = RCWL0516(15, callback=lambda s: print('motion'), holdoff_ms=10000); print(radar.motion())",
      "problems": [
        "Not yet run on a board: tested under CPython against simulated machine and time modules."
      ]
    },
    {
      "name": "relay",
      "summary": "Relay modules: single relays and 2, 4 or 8-channel boards",
      "category": "actuator",
      "version": "1.0.0",
      "licence": "MIT",
      "parts": [
        "relay_module"
      ],
      "list_names": [
        "relay"
      ],
      "module": "relay",
      "modules": [
        "relay"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "relay.py",
          "bytes": 3832,
          "sha256": "2737a268fc44c802f3d72c9dae685d04d33c785cf7abfa397510a98b2848346b"
        }
      ],
      "source": "gekko",
      "commit": null,
      "package_json": "https://mygekko.si/mip/relay/package.json",
      "licence_url": "https://mygekko.si/mip/relay/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/relay\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/relay",
        "board_index": "import mip; mip.install(\"relay\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip relay"
      },
      "usage": "from relay import Relay; pump = Relay(15); pump.on()",
      "problems": [
        "Not yet run on a board: tested under CPython against simulated machine and time modules."
      ]
    },
    {
      "name": "rf433",
      "summary": "433 MHz remote controls: record a remote's codes, then replay them",
      "category": "module",
      "version": "ffb12a1",
      "licence": "MIT",
      "parts": [],
      "list_names": [
        "RCSwitch"
      ],
      "module": "tx",
      "modules": [
        "tx",
        "rx"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "tx/__init__.py",
          "bytes": 4464,
          "sha256": "76b810d0030c15d5f75a31ee7552302ae65b79423ce63569dac7b549530460d8"
        },
        {
          "path": "tx/get_pin.py",
          "bytes": 729,
          "sha256": "9cdb3c37759344783b01c6828e8ebbcaabf6a3f8c19a6e05fc1d1da0900d9308"
        },
        {
          "path": "tx/rp2_rmt.py",
          "bytes": 3259,
          "sha256": "d9732d226bfb30fdd12964698d0e83b2e8d149ae07e17f4e76c53efd850a86b3"
        },
        {
          "path": "rx/__init__.py",
          "bytes": 4270,
          "sha256": "568556d9dd6b1fcb7f6e4c865bd832a5da080de2e6c8391a520c57516ee72355"
        },
        {
          "path": "rx/get_pin.py",
          "bytes": 623,
          "sha256": "19ea3c4016d362e5e46a67c5fed16cb256936b1870497a4dc2a4427abdb7e25e"
        }
      ],
      "source": "https://github.com/peterhinch/micropython_remote",
      "commit": "ffb12a12e565ee46616d10a84806f11fde6eae06",
      "package_json": "https://mygekko.si/mip/rf433/package.json",
      "licence_url": "https://mygekko.si/mip/rf433/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/rf433\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/rf433",
        "board_index": "import mip; mip.install(\"rf433\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip rf433"
      },
      "usage": "from rx import RX; r = RX(machine.Pin(17, machine.Pin.IN)); r('on'); r.save('remote.json')  # later: from tx import TX; TX(machine.Pin(16, machine.Pin.OUT), 'remote.json')('on')",
      "problems": [
        "Not an RCSwitch replacement: there is no send(code, bits) API, only record and replay.",
        "Installs two generic top-level packages, tx/ and rx/, which can clash with a project's own tx.py or rx.py.",
        "esp8266 is not supported.",
        "On the Pico, TX takes PIO 0 state machine 0 and the PIO0 IRQ, which clashes with other PIO0 users such as hx711_pio with its default state_machine=0.",
        "The receiver module's output is 5 V: level-shift it for 3.3 V boards."
      ]
    },
    {
      "name": "rotary",
      "summary": "Rotary encoders (KY-040 and similar), interrupt-driven",
      "category": "module",
      "version": "b4c8ce5",
      "licence": "MIT",
      "parts": [
        "ky-040"
      ],
      "list_names": [
        "rotary",
        "Encoder"
      ],
      "module": "rotary",
      "modules": [
        "rotary",
        "rotary_irq_rp2",
        "rotary_irq_esp"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "rotary.py",
          "bytes": 5408,
          "sha256": "feb7a23aa2aa1799f588f7a8541d952d2b177e5bdc81c7b75ac418cde9ab8a4b"
        },
        {
          "path": "rotary_irq_rp2.py",
          "bytes": 1826,
          "sha256": "5bbead0c626430ef2d3f00843d3c039e8d93cf8722eb25f272077af8d06a4d26"
        },
        {
          "path": "rotary_irq_esp.py",
          "bytes": 2457,
          "sha256": "cb5486686552aa4075ca097691f4466c2176e97613328d4fb064c11089cf904e"
        }
      ],
      "source": "https://github.com/miketeachman/micropython-rotary",
      "commit": "b4c8ce53ee2413bdad41d24a2fcf91fac6ab2d32",
      "package_json": "https://mygekko.si/mip/rotary/package.json",
      "licence_url": "https://mygekko.si/mip/rotary/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/rotary\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/rotary",
        "board_index": "import mip; mip.install(\"rotary\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip rotary"
      },
      "usage": "from rotary_irq_rp2 import RotaryIRQ; r = RotaryIRQ(pin_num_clk=16, pin_num_dt=17, min_val=0, max_val=100, range_mode=RotaryIRQ.RANGE_BOUNDED); print(r.value())",
      "problems": [
        "Exceptions raised by listeners are swallowed inside the pin IRQ handler.",
        "On an ESP8266, GPIO16 has no IRQ and is rejected."
      ]
    },
    {
      "name": "servo",
      "summary": "Hobby servos (SG90, MG90S, MG996R) on one PWM pin",
      "category": "actuator",
      "version": "1.0.0",
      "licence": "MIT",
      "parts": [
        "sg90"
      ],
      "list_names": [
        "servo",
        "Servo (Built-in)"
      ],
      "module": "servo",
      "modules": [
        "servo"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "servo.py",
          "bytes": 4820,
          "sha256": "964d96098600e3f6384c088b0bf44969f6c9fb7894686721d6473930932cc940"
        }
      ],
      "source": "gekko",
      "commit": null,
      "package_json": "https://mygekko.si/mip/servo/package.json",
      "licence_url": "https://mygekko.si/mip/servo/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/servo\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/servo",
        "board_index": "import mip; mip.install(\"servo\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip servo"
      },
      "usage": "from servo import Servo; s = Servo(15); s.angle(90)",
      "problems": [
        "Not yet run on a board: tested under CPython against simulated machine and time modules."
      ]
    },
    {
      "name": "sgp30",
      "summary": "SGP30 TVOC and eCO2 air quality sensor over I2C",
      "category": "sensor",
      "version": "45ad46b",
      "licence": "MIT",
      "parts": [
        "sgp30"
      ],
      "list_names": [
        "sgp30",
        "SGP30"
      ],
      "module": "adafruit_sgp30",
      "modules": [
        "adafruit_sgp30"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "adafruit_sgp30.py",
          "bytes": 7011,
          "sha256": "3c8956f67eeec1fa87d2772c659e61a87560de24637a097758537a364cc16625"
        }
      ],
      "source": "https://github.com/alexmrqt/micropython-sgp30",
      "commit": "45ad46b103458c445d0d5d33775d017b7e1f7d08",
      "package_json": "https://mygekko.si/mip/sgp30/package.json",
      "licence_url": "https://mygekko.si/mip/sgp30/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/sgp30\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/sgp30",
        "board_index": "import mip; mip.install(\"sgp30\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip sgp30"
      },
      "usage": "import adafruit_sgp30; s = adafruit_sgp30.Adafruit_SGP30(machine.I2C(0)); eco2, tvoc = s.iaq_measure()",
      "problems": [
        "set_iaq_baseline() and set_iaq_humidity() pack values with bytes() without range checks, so out-of-range values raise a bare ValueError.",
        "The upstream README and example use Pycom's I2C syntax; follow the usage line here instead."
      ]
    },
    {
      "name": "sh1106",
      "summary": "SH1106 1.3-inch 128x64 OLED over I2C or SPI",
      "category": "display",
      "version": "fe67423",
      "licence": "MIT",
      "parts": [
        "sh1106"
      ],
      "list_names": [
        "sh1106",
        "U8g2"
      ],
      "module": "sh1106",
      "modules": [
        "sh1106"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "sh1106.py",
          "bytes": 10394,
          "sha256": "a0b7c0465eb05fb7f1b8008755ea9b28858461f31b4f579ac1462daa21c57a8d"
        }
      ],
      "source": "https://github.com/robert-hh/SH1106",
      "commit": "fe674238f9e186c4a3801773b2dbd0100a662400",
      "package_json": "https://mygekko.si/mip/sh1106/package.json",
      "licence_url": "https://mygekko.si/mip/sh1106/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/sh1106\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/sh1106",
        "board_index": "import mip; mip.install(\"sh1106\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip sh1106"
      },
      "usage": "import sh1106; d = sh1106.SH1106_I2C(128, 64, machine.I2C(0, freq=400_000), addr=0x3c); d.text('Hi', 0, 0, 1); d.show()",
      "problems": [
        "ellipse() wraps FrameBuffer.ellipse, which needs MicroPython 1.20 or newer."
      ]
    },
    {
      "name": "sht31",
      "summary": "SHT30, SHT31 and SHT35 temperature and humidity sensors over I2C",
      "category": "sensor",
      "version": "b1e0ddb",
      "licence": "MIT",
      "parts": [
        "sht31"
      ],
      "list_names": [
        "Adafruit_SHT31"
      ],
      "module": "sht31",
      "modules": [
        "sht31"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "sht31.py",
          "bytes": 2331,
          "sha256": "bc0c3330586098c523f5d911e08b6784eb5a781c2b126dadf784950363633500"
        }
      ],
      "source": "https://github.com/kfricke/micropython-sht31",
      "commit": "b1e0ddb5ccaa9dda0f22b70bab1be7c0ebfdc6e4",
      "package_json": "https://mygekko.si/mip/sht31/package.json",
      "licence_url": "https://mygekko.si/mip/sht31/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/sht31\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/sht31",
        "board_index": "import mip; mip.install(\"sht31\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip sht31"
      },
      "usage": "import sht31; s = sht31.SHT31(machine.I2C(0), addr=0x44); t, rh = s.get_temp_humi()",
      "problems": [
        "Readings are not CRC-checked, and only single-shot mode is supported."
      ]
    },
    {
      "name": "solenoid",
      "summary": "Solenoids switched by a logic-level MOSFET, with an on-time guard",
      "category": "actuator",
      "version": "1.0.0",
      "licence": "MIT",
      "parts": [
        "solenoid"
      ],
      "list_names": [
        "solenoid"
      ],
      "module": "solenoid",
      "modules": [
        "solenoid"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "solenoid.py",
          "bytes": 4178,
          "sha256": "3a8470f7fb8d79863671aadc46365e0f4d55ea4bee84450b3b2afef179e451a0"
        }
      ],
      "source": "gekko",
      "commit": null,
      "package_json": "https://mygekko.si/mip/solenoid/package.json",
      "licence_url": "https://mygekko.si/mip/solenoid/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/solenoid\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/solenoid",
        "board_index": "import mip; mip.install(\"solenoid\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip solenoid"
      },
      "usage": "from solenoid import Solenoid; lock = Solenoid(15); lock.pulse(2000)",
      "problems": [
        "Not yet run on a board: tested under CPython against simulated machine and time modules."
      ]
    },
    {
      "name": "st7789py",
      "summary": "ST7789 SPI IPS TFT displays (240x240, 240x320, 135x240, 128x128), pure Python",
      "category": "display",
      "version": "7265925",
      "licence": "MIT",
      "parts": [
        "st7789"
      ],
      "list_names": [
        "st7789",
        "TFT_eSPI"
      ],
      "module": "st7789py",
      "modules": [
        "st7789py"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "st7789py.py",
          "bytes": 31173,
          "sha256": "a071cfc56a32006b3ddefcc1b68e158fbd7674df6a363cac59ea7ce9510ed958"
        }
      ],
      "source": "https://github.com/russhughes/st7789py_mpy",
      "commit": "7265925bd0c092e8105200d18b2dba9dfbc12c27",
      "package_json": "https://mygekko.si/mip/st7789py/package.json",
      "licence_url": "https://mygekko.si/mip/st7789py/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/st7789py\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/st7789py",
        "board_index": "import mip; mip.install(\"st7789py\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip st7789py"
      },
      "usage": "import st7789py; d = st7789py.ST7789(machine.SPI(1, baudrate=40_000_000), 240, 240, reset=machine.Pin(4, machine.Pin.OUT), dc=machine.Pin(5, machine.Pin.OUT), backlight=machine.Pin(6, machine.Pin.OUT)); d.fill(st7789py.BLUE)",
      "problems": [
        "Uses @micropython.viper and @micropython.native: rp2 and the Xtensa ESP32, S2 and S3 are fine; the RISC-V ESP32-C3 and C6 need a recent MicroPython with the RV32 native emitter.",
        "text() needs a bitmap font module and write() a converted TrueType font module from the upstream repository; neither is included.",
        "31 KB of source, too big to compile on an ESP8266, so esp8266 is not listed.",
        "Needs MicroPython 1.19 or newer (str-valued const()) and f-strings."
      ]
    },
    {
      "name": "stepper_4phase",
      "summary": "28BYJ-48 stepper on a ULN2003 board, or any 4-phase unipolar stepper",
      "category": "actuator",
      "version": "1.0.0",
      "licence": "MIT",
      "parts": [
        "uln2003"
      ],
      "list_names": [
        "step",
        "uln2003",
        "Stepper (Built-in)"
      ],
      "module": "stepper_4phase",
      "modules": [
        "stepper_4phase"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "stepper_4phase.py",
          "bytes": 4816,
          "sha256": "316ca07cb7411c8ca265538d2ad1159c294b7ba6e9886b4786de7e3737bee153"
        }
      ],
      "source": "gekko",
      "commit": null,
      "package_json": "https://mygekko.si/mip/stepper_4phase/package.json",
      "licence_url": "https://mygekko.si/mip/stepper_4phase/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/stepper_4phase\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/stepper_4phase",
        "board_index": "import mip; mip.install(\"stepper_4phase\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip stepper_4phase"
      },
      "usage": "from stepper_4phase import Stepper4Phase; m = Stepper4Phase(2, 3, 4, 5); m.step(4096)",
      "problems": [
        "Not yet run on a board: tested under CPython against simulated machine and time modules."
      ]
    },
    {
      "name": "stepper_stepdir",
      "summary": "STEP/DIR stepper drivers (DRV8825, A4988 and other StepStick carriers)",
      "category": "actuator",
      "version": "1.0.0",
      "licence": "MIT",
      "parts": [
        "drv8825"
      ],
      "list_names": [
        "drv8825",
        "AccelStepper"
      ],
      "module": "stepper_stepdir",
      "modules": [
        "stepper_stepdir"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "stepper_stepdir.py",
          "bytes": 6348,
          "sha256": "2c39757e4fa15a4e4848d7025a343818e22f684be3a8fe97b83ec7280dfedd67"
        }
      ],
      "source": "gekko",
      "commit": null,
      "package_json": "https://mygekko.si/mip/stepper_stepdir/package.json",
      "licence_url": "https://mygekko.si/mip/stepper_stepdir/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/stepper_stepdir\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/stepper_stepdir",
        "board_index": "import mip; mip.install(\"stepper_stepdir\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip stepper_stepdir"
      },
      "usage": "from stepper_stepdir import StepperStepDir; m = StepperStepDir(step=2, dir=3, en=4); m.turn(360)",
      "problems": [
        "Not yet run on a board: tested under CPython against simulated machine and time modules."
      ]
    },
    {
      "name": "tb6612fng",
      "summary": "TB6612FNG dual MOSFET motor driver: two DC motors",
      "category": "actuator",
      "version": "1.0.0",
      "licence": "MIT",
      "parts": [
        "tb6612fng"
      ],
      "list_names": [
        "tb6612fng"
      ],
      "module": "tb6612fng",
      "modules": [
        "tb6612fng"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "tb6612fng.py",
          "bytes": 6037,
          "sha256": "8830c65216885666a2810227008456f9011c18909503898c5087fbe5117603a7"
        }
      ],
      "source": "gekko",
      "commit": null,
      "package_json": "https://mygekko.si/mip/tb6612fng/package.json",
      "licence_url": "https://mygekko.si/mip/tb6612fng/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/tb6612fng\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/tb6612fng",
        "board_index": "import mip; mip.install(\"tb6612fng\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip tb6612fng"
      },
      "usage": "from tb6612fng import TB6612FNG; m = TB6612FNG(pwma=10, ain1=11, ain2=12, pwmb=13, bin1=14, bin2=15, stby=16); m.a.speed(60)",
      "problems": [
        "Not yet run on a board: tested under CPython against simulated machine and time modules."
      ]
    },
    {
      "name": "tm1637",
      "summary": "TM1637 4-digit 7-segment display modules",
      "category": "display",
      "version": "1.3.0",
      "licence": "MIT",
      "parts": [
        "tm1637"
      ],
      "list_names": [
        "tm1637"
      ],
      "module": "tm1637",
      "modules": [
        "tm1637"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "tm1637.py",
          "bytes": 7943,
          "sha256": "c02419e86e7ba301ac62947ab0b6e8ad1460c267a49ba4215300538a5f233e8c"
        }
      ],
      "source": "https://github.com/mcauser/micropython-tm1637",
      "commit": "cc9ecc642787b0c8afcb318a52865b855b4f0e5f",
      "package_json": "https://mygekko.si/mip/tm1637/package.json",
      "licence_url": "https://mygekko.si/mip/tm1637/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/tm1637\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/tm1637",
        "board_index": "import mip; mip.install(\"tm1637\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip tm1637"
      },
      "usage": "import tm1637; d = tm1637.TM1637(clk=machine.Pin(2), dio=machine.Pin(3)); d.numbers(12, 34)",
      "problems": [
        "The ACK bit is never read, so a wiring fault shows as a blank display rather than an exception."
      ]
    },
    {
      "name": "tsl2591",
      "summary": "TSL2591 high dynamic range light sensor over I2C",
      "category": "sensor",
      "version": "cc705df",
      "licence": "MIT",
      "parts": [
        "tsl2591"
      ],
      "list_names": [
        "tsl2591",
        "Adafruit_TSL2591"
      ],
      "module": "tsl2591",
      "modules": [
        "tsl2591"
      ],
      "ports": [
        "rp2",
        "esp32",
        "esp8266"
      ],
      "deps": [],
      "files": [
        {
          "path": "tsl2591.py",
          "bytes": 9254,
          "sha256": "b05b4b356a8434d6cfff8dcd7ba69e5b304f59ef6574204c2f2b89fbc8521188"
        }
      ],
      "source": "https://github.com/zyltr/TSL2591",
      "commit": "cc705df13f54268315b1a0f93b388e0be552d434",
      "package_json": "https://mygekko.si/mip/tsl2591/package.json",
      "licence_url": "https://mygekko.si/mip/tsl2591/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/tsl2591\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/tsl2591",
        "board_index": "import mip; mip.install(\"tsl2591\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip tsl2591"
      },
      "usage": "import tsl2591; s = tsl2591.TSL2591(machine.I2C(0)); print(s.lux)",
      "problems": [
        "Needs MicroPython 1.24 or newer (int.from_bytes and to_bytes without byteorder); 1.22 and 1.23 raise TypeError in the constructor.",
        "lux is about 9876 times too high at Gain.MAX (the gain ladder tests Gain.HIGH twice).",
        "raw_luminosity reads the four data bytes in four separate transactions, so the two channels can come from different integration cycles; lux raises RuntimeError on saturation."
      ]
    },
    {
      "name": "veml6075",
      "summary": "VEML6075 UVA/UVB light sensor over I2C (raw counts)",
      "category": "sensor",
      "version": "86d21ff",
      "licence": "MIT",
      "parts": [
        "veml6075"
      ],
      "list_names": [
        "veml6075"
      ],
      "module": "veml6075mod",
      "modules": [
        "veml6075mod",
        "sensor_pack_2"
      ],
      "ports": [
        "rp2",
        "esp32"
      ],
      "deps": [],
      "files": [
        {
          "path": "veml6075mod.py",
          "bytes": 15058,
          "sha256": "d07a6df3b70dd91104c4fdc7747593fbf26ed3f890120ab35283b799a79c01e6"
        },
        {
          "path": "sensor_pack_2/__init__.py",
          "bytes": 57,
          "sha256": "32eeb1cd44f4358b53ca3d8e221cff803e566a7dd23e5844a0caf28cdaf1c8de"
        },
        {
          "path": "sensor_pack_2/base_sensor.py",
          "bytes": 15913,
          "sha256": "4ea9d1fd20e1197884eea8cf122bf91bd746c0fd26cf2c32db8d4e4ff263cc5f"
        },
        {
          "path": "sensor_pack_2/bitfield.py",
          "bytes": 13582,
          "sha256": "5f84a60fbb237769a215d51a0758b648eea5ca7f3575a45384aaecaeaa1ce216"
        },
        {
          "path": "sensor_pack_2/bus_service.py",
          "bytes": 14511,
          "sha256": "7214c6d3559fb991b4e83c3124d55cba999dc64e3e64448211780d5e8dfd5220"
        }
      ],
      "source": "https://github.com/octaprog7/VEML6075",
      "commit": "86d21ff2d4ca0c770fba53a958bc81887098a2d3",
      "package_json": "https://mygekko.si/mip/veml6075/package.json",
      "licence_url": "https://mygekko.si/mip/veml6075/LICENSE",
      "install": {
        "board": "import mip; mip.install(\"https://mygekko.si/mip/veml6075\")",
        "mpremote": "mpremote mip install https://mygekko.si/mip/veml6075",
        "board_index": "import mip; mip.install(\"veml6075\", index=\"https://mygekko.si/mip\")",
        "mpremote_index": "mpremote mip install --index https://mygekko.si/mip veml6075"
      },
      "usage": "from sensor_pack_2.bus_service import I2cAdapter; import veml6075mod; s = veml6075mod.VEML6075(I2cAdapter(machine.I2C(0, freq=400_000))); s.shutdown(False); s.start_measurement(single_meas_mode=False, it_index=1); time.sleep_ms(100); uva, uvb = s.get_uv()",
      "problems": [
        "sensor_pack_2 uses @micropython.native: firmware without a native code emitter (some RISC-V builds, such as older ESP32-C3/C6 or RP2350-RISC-V firmware) fails at import with SyntaxError.",
        "Needs MicroPython 1.19 or newer (const() with string values).",
        "The sensor can start shut down: call shutdown(False) first. get_conversion_cycle_time() keeps the integration time from construction, so call read_settings() after start_measurement() or wait 50 * 2**it_index ms.",
        "sensor_pack_2 is shared by the author's other drivers; a package that ships a different sensor_pack_2 into /lib would overwrite this one.",
        "Too big to compile in ESP8266 RAM without mpy-cross, so esp8266 is not listed."
      ]
    }
  ],
  "not_hosted": [
    {
      "name": "vl53l0x",
      "summary": "VL53L0X laser time-of-flight distance sensor",
      "licence": "BSD-3-Clause (unclear)",
      "parts": [
        "vl53l0x"
      ],
      "list_names": [
        "vl53l0x",
        "VL53L0X"
      ],
      "modules": [
        "vl53l0x"
      ],
      "repo": "https://github.com/kevinmcaleer/vl53l0x",
      "commit": "d71ce30b0efaa4e45a771049056d8c9fdc2755ac",
      "install": [
        {
          "board": "import mip; mip.install(\"github:kevinmcaleer/vl53l0x/vl53l0x.py\", version=\"d71ce30b0efaa4e45a771049056d8c9fdc2755ac\")",
          "mpremote": "mpremote mip install github:kevinmcaleer/vl53l0x/vl53l0x.py@d71ce30b0efaa4e45a771049056d8c9fdc2755ac"
        }
      ],
      "reason": "Licence unclear. The BSD-3-Clause LICENSE was added in 2026, but about 500 of the file's 512 non-trivial lines are verbatim from uceeatz/VL53L0X, which has no licence; the new grant can only cover the later changes.",
      "alternative": "A Gekko helper ported from Adafruit_CircuitPython_VL53L0X (MIT), keeping its notice."
    },
    {
      "name": "fusion",
      "summary": "Madgwick sensor fusion (heading, pitch, roll) over any IMU's readings",
      "licence": "MIT (unclear)",
      "parts": [],
      "list_names": [
        "MadgwickAHRS"
      ],
      "modules": [
        "fusion",
        "deltat"
      ],
      "repo": "https://github.com/micropython-IMU/micropython-fusion",
      "commit": "43748e9cc277ed7d17445025f48b774e2cc2288e",
      "install": [
        {
          "board": "import mip; mip.install(\"github:micropython-IMU/micropython-fusion/fusion.py\", version=\"43748e9cc277ed7d17445025f48b774e2cc2288e\")",
          "mpremote": "mpremote mip install github:micropython-IMU/micropython-fusion/fusion.py@43748e9cc277ed7d17445025f48b774e2cc2288e"
        },
        {
          "board": "import mip; mip.install(\"github:micropython-IMU/micropython-fusion/deltat.py\", version=\"43748e9cc277ed7d17445025f48b774e2cc2288e\")",
          "mpremote": "mpremote mip install github:micropython-IMU/micropython-fusion/deltat.py@43748e9cc277ed7d17445025f48b774e2cc2288e"
        }
      ],
      "reason": "Licence unclear. The repository is MIT, but update() and update_nomag() transliterate x-io's MadgwickAHRS.cs line by line, and that code was published without a licence (x-io's site defaulted to the GPL), so the MIT grant cannot be relied on for the filter.",
      "alternative": "Port x-io's newer Fusion library (github.com/xioTechnologies/Fusion, MIT) as a Gekko helper, keeping x-io's notice."
    },
    {
      "name": "epaper",
      "summary": "Waveshare 2.13-inch e-paper (V4, SSD1680) on a Pico",
      "licence": "GPL-3.0",
      "parts": [
        "epaper_213"
      ],
      "list_names": [
        "epaper / epd",
        "GxEPD2"
      ],
      "modules": [],
      "repo": "https://github.com/waveshareteam/Pico_ePaper_Code",
      "commit": null,
      "install": [
        {
          "board": "import mip; mip.install(\"github:waveshareteam/Pico_ePaper_Code/python/Pico_ePaper-2.13_V4.py\")",
          "mpremote": "mpremote mip install github:waveshareteam/Pico_ePaper_Code/python/Pico_ePaper-2.13_V4.py"
        }
      ],
      "reason": "GPL-3.0 is copyleft; the store only redistributes MIT, BSD, Apache-2.0 and ISC drivers.",
      "alternative": "peterhinch/micropython-nano-gui drivers/epaper/pico_epaper_213_v4.py (MIT, needs drivers/boolpalette.py) could be resolved and hosted instead."
    },
    {
      "name": "apds9960",
      "summary": "APDS-9960 proximity and light sensor (no gestures)",
      "licence": "GPL-3.0",
      "parts": [
        "apds9960"
      ],
      "list_names": [
        "Adafruit_APDS9960"
      ],
      "modules": [
        "apds9960LITE"
      ],
      "repo": "https://github.com/rlangoy/uPy_APDS9960",
      "commit": null,
      "install": [
        {
          "board": "import mip; mip.install(\"github:rlangoy/uPy_APDS9960/uPy_APDS9960/apds9960LITE.py\")",
          "mpremote": "mpremote mip install github:rlangoy/uPy_APDS9960/uPy_APDS9960/apds9960LITE.py"
        }
      ],
      "reason": "GPL-3.0 is copyleft; the store only redistributes MIT, BSD, Apache-2.0 and ISC drivers.",
      "alternative": ""
    },
    {
      "name": "as608",
      "summary": "AS608 / ZhianTec optical fingerprint sensors over UART",
      "licence": "D-FSL-1.0",
      "parts": [
        "as608"
      ],
      "list_names": [
        "as608",
        "Adafruit_Fingerprint"
      ],
      "modules": [
        "pyfingerprint"
      ],
      "repo": "https://github.com/chrisb2/micropython-fingerprint",
      "commit": null,
      "install": [
        {
          "board": "import mip; mip.install(\"github:chrisb2/micropython-fingerprint/pyfingerprint.py\")",
          "mpremote": "mpremote mip install github:chrisb2/micropython-fingerprint/pyfingerprint.py"
        }
      ],
      "reason": "D-FSL (German Free Software License) is copyleft; the store only redistributes MIT, BSD, Apache-2.0 and ISC drivers.",
      "alternative": ""
    }
  ]
}
