{"id":28755720,"url":"https://github.com/abxsantos/ucrimp","last_synced_at":"2026-04-29T19:33:36.448Z","repository":{"id":299408707,"uuid":"1001161531","full_name":"abxsantos/ucrimp","owner":"abxsantos","description":"A training for climbing tool built with MicroPython with ESP32-C3 Super Mini that integrates a load cell and  HX711 amplifier to measure weight around 80 samples per second.","archived":false,"fork":false,"pushed_at":"2025-06-16T11:13:40.000Z","size":2443,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-16T12:24:48.588Z","etag":null,"topics":["climbing","micropython"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/abxsantos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-12T23:31:31.000Z","updated_at":"2025-06-16T11:13:43.000Z","dependencies_parsed_at":"2025-06-16T12:36:22.432Z","dependency_job_id":null,"html_url":"https://github.com/abxsantos/ucrimp","commit_stats":null,"previous_names":["abxsantos/ucrimp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/abxsantos/ucrimp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abxsantos%2Fucrimp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abxsantos%2Fucrimp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abxsantos%2Fucrimp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abxsantos%2Fucrimp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abxsantos","download_url":"https://codeload.github.com/abxsantos/ucrimp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abxsantos%2Fucrimp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32441161,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T18:12:22.909Z","status":"ssl_error","status_checked_at":"2026-04-29T18:11:33.322Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["climbing","micropython"],"created_at":"2025-06-17T03:00:31.532Z","updated_at":"2026-04-29T19:33:36.431Z","avatar_url":"https://github.com/abxsantos.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ucrimp\n\n**ucrimp** is a MicroPython-based project for the ESP32-C3 Super Mini that integrates a load cell and \nHX711 amplifier to measure weight around 80 samples per second. \n\nThis setup is ideal for high-resolution force tracking in embedded and IoT applications, thus allowing \nforce measurements tools to be used in climbing/grip strenght training.\n\n---\n\n## Features\n\n* High-speed sampling (\\~80Hz) using HX711\n* SPI-based HX711 integration for efficiency\n* BLE support via `aioble`\n\n---\n\n## Credits\n\n* [HX711 SPI driver](https://github.com/robert-hh/hx711/tree/master)\n* [aioble](https://github.com/micropython/micropython-lib/blob/master/micropython/bluetooth/aioble/README.md)\n* People that helped e along the way!\n\n---\n\n## Project Structure\n\n```\nucrimp/\n└── src/\n    ├── main.py              # Entry point, starts weight acquisition\n    ├── calibration.py       # Manual or scripted calibration tool\n    └── lib/\n        ├── calculations.py  # Utility functions (e.g., averaging, filtering)\n        ├── devices.py       # Device setup: HX711, BLE, GPIO\n        ├── hx711_spi.py     # SPI-based HX711 interface\n        └── aioble/          # BLE support (optional)\n```\n\n---\n\n## Hardware Components\n\n* **[Load Cell](https://www.mercadolivre.com.br/balanca-digital-suspensa-100kg-200kg-alta-preciso/p/MLB27345293?pdp_filters=item_id%3AMLB5409409212\u0026from=gshop\u0026matt_tool=48995110\u0026matt_internal_campaign_id=\u0026matt_word=\u0026matt_source=google\u0026matt_campaign_id=22603531562\u0026matt_ad_group_id=185825366131\u0026matt_match_type=\u0026matt_network=g\u0026matt_device=c\u0026matt_creative=754595630379\u0026matt_keyword=\u0026matt_ad_position=\u0026matt_ad_type=pla\u0026matt_merchant_id=735125422\u0026matt_product_id=MLB27345293-product\u0026matt_product_partition_id=2423119992713\u0026matt_target_id=aud-1967156880386:pla-2423119992713\u0026cq_src=google_ads\u0026cq_cmp=22603531562\u0026cq_net=g\u0026cq_plt=gp\u0026cq_med=pla\u0026gad_source=1\u0026gad_campaignid=22603531562\u0026gclid=CjwKCAjw9anCBhAWEiwAqBJ-cy2Icaw-p0CzQJOuLoVcqTwQFDGHEJgobebDxcjHw2taVzbDG99TSRoCK3cQAvD_BwE)** (e.g., 5kg strain gauge)\n* **[HX711 Amplifier](https://www.mercadolivre.com.br/modulo-hx711-sensor-hx-711-carga-peso-balanca-arduino/p/MLB35506058?pdp_filters=item_id%3AMLB5303898590\u0026from=gshop\u0026matt_tool=49601181\u0026matt_internal_campaign_id=\u0026matt_word=\u0026matt_source=google\u0026matt_campaign_id=22090354496\u0026matt_ad_group_id=173090612396\u0026matt_match_type=\u0026matt_network=g\u0026matt_device=c\u0026matt_creative=727882733433\u0026matt_keyword=\u0026matt_ad_position=\u0026matt_ad_type=pla\u0026matt_merchant_id=735128188\u0026matt_product_id=MLB35506058-product\u0026matt_product_partition_id=2389865441028\u0026matt_target_id=aud-1967156880386:pla-2389865441028\u0026cq_src=google_ads\u0026cq_cmp=22090354496\u0026cq_net=g\u0026cq_plt=gp\u0026cq_med=pla\u0026gad_source=1\u0026gad_campaignid=22090354496\u0026gclid=CjwKCAjw9anCBhAWEiwAqBJ-c_wJKuCjUpCoC5fmaLhpNrOJXdtxKo3Ua0dWlXOjBRFVeqR5YC-U1hoCoekQAvD_BwE)**\n* **[ESP32-C3 Super Mini](https://curtocircuito.com.br/placa-super-mini-esp32-c3.html?utm_term=\u0026utm_campaign=\u0026utm_source=adwords\u0026utm_medium=ppc\u0026hsa_acc=7016354091\u0026hsa_cam=22017597287\u0026hsa_grp=175891755750\u0026hsa_ad=725220908819\u0026hsa_src=g\u0026hsa_tgt=pla-387028627337\u0026hsa_kw=\u0026hsa_mt=\u0026hsa_net=adwords\u0026hsa_ver=3\u0026gad_source=1\u0026gad_campaignid=22017597287\u0026gclid=CjwKCAjw9anCBhAWEiwAqBJ-cxDfs-f_OorbJr0qVmeDbDlpxcRIWRUBAUqFXv5W-pycp81IAaMtfhoCfnsQAvD_BwE)**\n* **[3 x AAA Battery casing](https://produto.mercadolivre.com.br/MLB-4498825192-suporte-para-3-pilhas-aaa-palito-com-rabicho-kit-5-pecas-_JM?matt_tool=49601181\u0026matt_internal_campaign_id=\u0026matt_word=\u0026matt_source=google\u0026matt_campaign_id=22090354496\u0026matt_ad_group_id=173090612396\u0026matt_match_type=\u0026matt_network=g\u0026matt_device=c\u0026matt_creative=727882733433\u0026matt_keyword=\u0026matt_ad_position=\u0026matt_ad_type=pla\u0026matt_merchant_id=5320477086\u0026matt_product_id=MLB4498825192\u0026matt_product_partition_id=2394343693421\u0026matt_target_id=aud-1967156880386:pla-2394343693421\u0026cq_src=google_ads\u0026cq_cmp=22090354496\u0026cq_net=g\u0026cq_plt=gp\u0026cq_med=pla\u0026gad_source=1\u0026gad_campaignid=22090354496\u0026gclid=CjwKCAjw9anCBhAWEiwAqBJ-c6juK0T7oJlDVjfdn3FYYlNcNvoucd6u9rzUwBtvLb1V5ePj9uzDThoCt4oQAvD_BwE)**\n* Breadboard / soldered connections / jumper wires\n\n\n### Hardware modifications\n\nTo make the HX711 work at 80 samples per seconds, it was needed to modify the board disconnecting the RATE pin from the GND and connecting it to the DVDD pin.\n\nFor this, the following [tutorial](https://www.youtube.com/watch?v=0cxS-a837bY) is very usefull.\nAlso for more improvements, there is [this video](https://www.youtube.com/watch?v=Rp_M0NbDSpo), which goes in details of some improvements that can be done.\n\n\n\u003cdiv\u003e\n    \u003cimg src=\"./assets/modified-hx711-module.jpeg\" width=\"256\"/\u003e\n\u003c/div\u003e\n\n---\n\n## Wiring Diagram\n\n**HX711 to ESP32-C3 Super Mini (example using SPI):**\n\nFor this the pin 4 should be kept without connections!\n\n| HX711 Pin | ESP32-C3 Pin |\n| --------- | ------------ |\n| VCC       | 3.3V         |\n| GND       | GND          |\n| DT (DOUT) | GPIO4        |\n| SCK       | GPIO5        |\n\nEnsure that the HX711 module supports 3.3V logic. Use a logic level converter if necessary.\n\n\u003cdiv\u003e\n    \u003cimg src=\"./assets/battery-holder.jpeg\" width=\"256\"/\u003e\n    \u003cimg src=\"./assets/connections-inside.jpeg\" width=\"256\"/\u003e\n\u003c/div\u003e\n\n---\n\n## Installation\n\n### 1. Flash MicroPython to ESP32-C3\n\nFollow the [instructions](https://docs.micropython.org/en/latest/esp32/tutorial/intro.html) at MicroPython page.\n\n### 2. Upload Project Files\n\nYou can use `mpremote`, `thonny`, or `ampy` to upload files:\n\n```bash\ncd src\nmpremote mkdir lib\nmpremote cp main.py :\nmpremote cp calibration.py :\nmpremote cp lib/* :lib/\nmpremote cp -r lib/aioble :lib/aioble\n```\n---\n\n## Calibration\n\nThis will need to be executed only once.\n\nThe callibration script will wait for the user to input the current weight value and will print the \nmedian of the raw values based on the samples amount.\n\nA good starting point of weights to be used for calibration is:\n0% -\u003e No additional load attached to the load cell\n25% -\u003e 25% of the maximum load of the load cell\n50% -\u003e 50% of the maximum load of the load cell\n\n\nTo end the calibration, interrupt with keyboard.\n\n1. To calibrate the load cell you can either:\n    - Run `calibration.py`\n    - Via REPL, import the `calibrate` function and call it.\n    ```python\n    \u003e\u003e\u003e from calibration import calibrate\n    \u003e\u003e\u003e calibrate()\n    ```\n2. Place a known weight on the load cell.\n3. Follow the prompts to adjust the scale factor until the correct value is reported.\n4. Update the calibration constant in `main.py` or save it persistently if implemented.\n\n---\n\n## Running the Project\n\nAfter connecting the hardware:\n\n1. Plug in the ESP32-C3 Super Mini and reset it.\n2. `main.py` will start the advertisement.\n3. As soon as you connect with the uCrimp device via bluetooth, the data will be streamed via notifications.\n4. The data will be sent as a little-endian weight (float) and timestamp (uint32)\n\n---\n\n## Final Product Image\n\nFor this specific project, I've used the following [scale](https://www.mercadolivre.com.br/balanca-digital-suspensa-100kg-200kg-alta-preciso/p/MLB27345293?pdp_filters=item_id%3AMLB5409409212\u0026from=gshop\u0026matt_tool=48995110\u0026matt_internal_campaign_id=\u0026matt_word=\u0026matt_source=google\u0026matt_campaign_id=22603531562\u0026matt_ad_group_id=185825366131\u0026matt_match_type=\u0026matt_network=g\u0026matt_device=c\u0026matt_creative=754595630379\u0026matt_keyword=\u0026matt_ad_position=\u0026matt_ad_type=pla\u0026matt_merchant_id=735125422\u0026matt_product_id=MLB27345293-product\u0026matt_product_partition_id=2423119992713\u0026matt_target_id=aud-1967156880386:pla-2423119992713\u0026cq_src=google_ads\u0026cq_cmp=22603531562\u0026cq_net=g\u0026cq_plt=gp\u0026cq_med=pla\u0026gad_source=1\u0026gad_campaignid=22603531562\u0026gclid=CjwKCAjw9anCBhAWEiwAqBJ-cy2Icaw-p0CzQJOuLoVcqTwQFDGHEJgobebDxcjHw2taVzbDG99TSRoCK3cQAvD_BwE)\n\nThe load cell in this probably isn't the best one around, but it's enough for this project.\nAlso the casing could be easily host in the ESP32-C3 Super Mini with wires attaching to the [HX711](https://www.mercadolivre.com.br/modulo-hx711-sensor-hx-711-carga-peso-balanca-arduino/p/MLB35506058?pdp_filters=item_id%3AMLB5303898590\u0026from=gshop\u0026matt_tool=49601181\u0026matt_internal_campaign_id=\u0026matt_word=\u0026matt_source=google\u0026matt_campaign_id=22090354496\u0026matt_ad_group_id=173090612396\u0026matt_match_type=\u0026matt_network=g\u0026matt_device=c\u0026matt_creative=727882733433\u0026matt_keyword=\u0026matt_ad_position=\u0026matt_ad_type=pla\u0026matt_merchant_id=735128188\u0026matt_product_id=MLB35506058-product\u0026matt_product_partition_id=2389865441028\u0026matt_target_id=aud-1967156880386:pla-2389865441028\u0026cq_src=google_ads\u0026cq_cmp=22090354496\u0026cq_net=g\u0026cq_plt=gp\u0026cq_med=pla\u0026gad_source=1\u0026gad_campaignid=22090354496\u0026gclid=CjwKCAjw9anCBhAWEiwAqBJ-c_wJKuCjUpCoC5fmaLhpNrOJXdtxKo3Ua0dWlXOjBRFVeqR5YC-U1hoCoekQAvD_BwE) conversor.\n\n\u003cimg src=\"./assets/prototype.jpeg\" width=\"128\"/\u003e\n\n---\n\n## License\n\nThis project is licensed under the MIT License. See `LICENSE` for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabxsantos%2Fucrimp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabxsantos%2Fucrimp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabxsantos%2Fucrimp/lists"}