From eee1a9b97ee90e8114ab938fa9cb25c2047cdd21 Mon Sep 17 00:00:00 2001 From: Knowit Date: Wed, 29 Apr 2026 00:24:55 +0800 Subject: [PATCH] crawler: --skip-ext + --max-source-mb gates for batch-50 expansion Two CLI gates needed before scaling Pro batch beyond top-5: --skip-ext mp4,qt,mov (attachment filter) Skips video extensions in attachment download. Phase 1 measurements showed mp4+qt occupy ~54% of attachment storage. Entry still recorded in metadata.json with skipped:ext: so we can re-fetch later if the policy changes. Honors both server-declared `ext` and filename suffix, case-insensitively. --max-source-mb N (Pro source size cap) Trips inside the chain replay loop on encrypted-blob total. On trip: raise ProjectOversizeError, wipe partial source/, append a row to data/state/oshwhub_pro_oversize.jsonl. Lets us shortlist 50+ Pro projects without one X86-board-class outlier (~500 MB) blowing the LFS budget. Std and Pro 2.x legacy are not capped (both <2 MB in sample). Verified: - cap=0 trips on first blob (1.2 MB), source/ wiped, state recorded - cap=100 runs full ESP-VoCat (7.5 MB plain, 278 docs) - skip-ext microtest: 8/8 cases (case-insensitive, declared/suffix fallback, empty-token edge cases) Plan + frozen candidate list for the next 50 projects: - docs/plans/oshwhub_batch50.md - data/state/oshwhub_batch50_candidates.jsonl (gitignore exception added) Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitignore | 2 + crawlers/oshwhub/crawler.py | 102 ++++++++- .../source/manifest.json | 2 +- data/state/oshwhub_batch50_candidates.jsonl | 50 +++++ docs/plans/oshwhub_batch50.md | 196 ++++++++++++++++++ 5 files changed, 347 insertions(+), 5 deletions(-) create mode 100644 data/state/oshwhub_batch50_candidates.jsonl create mode 100644 docs/plans/oshwhub_batch50.md diff --git a/.gitignore b/.gitignore index 5d232cd..48f946f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ data/state/* !data/state/.gitkeep # 例外:oshwhub 全量 listing 索引快照入库(28 MB jsonl,可重抓但要钉个版本) !data/state/oshwhub_listing_full.jsonl +# 例外:扩抓批次的"冻结候选清单"——计划文档以这份为准,可重生成 +!data/state/oshwhub_batch50_candidates.jsonl # data/raw 入库(工程二进制走 LFS,见 .gitattributes) diff --git a/crawlers/oshwhub/crawler.py b/crawlers/oshwhub/crawler.py index 6cbf121..aa3e812 100644 --- a/crawlers/oshwhub/crawler.py +++ b/crawlers/oshwhub/crawler.py @@ -19,6 +19,7 @@ import hashlib import html as _html import json import re +import shutil import sys import time import urllib.parse @@ -428,11 +429,42 @@ def _order_history_chain(chain: list[dict]) -> list[dict]: return ordered +class ProjectOversizeError(Exception): + """Raised when a Pro project's chain replay would exceed the configured cap. + + `cap_mb` is the trip threshold; `bytes_so_far` is the *encrypted blob* total + accumulated when we tripped (pre-decompression, pre-partition). + """ + + def __init__(self, bytes_so_far: int, cap_mb: int) -> None: + super().__init__( + f"oversize: blob bytes {bytes_so_far // 1024 // 1024} MB > cap {cap_mb} MB" + ) + self.bytes_so_far = bytes_so_far + self.cap_mb = cap_mb + + +def _record_oversize(out_root: Path, uuid: str, err: ProjectOversizeError) -> None: + """Append one row to data/state/oshwhub_pro_oversize.jsonl for later review.""" + state_path = Path("data/state/oshwhub_pro_oversize.jsonl") + state_path.parent.mkdir(parents=True, exist_ok=True) + row = { + "uuid": uuid, + "out_root": str(out_root), + "bytes_so_far": err.bytes_so_far, + "cap_mb": err.cap_mb, + "ts": datetime.now(timezone.utc).isoformat(), + } + with state_path.open("a") as f: + f.write(json.dumps(row, ensure_ascii=False) + "\n") + + def fetch_pro_source( pro_client: httpx.Client, project_uuid: str, proj_dir: Path, sleep: float = SLEEP_PRO, + max_source_mb: int | None = None, ) -> dict: """Dispatcher: pick modern (3.x branch+EPRO2) vs legacy (2.x v2/documents/lists) based on whether project meta contains a non-null branch_uuid. @@ -440,11 +472,16 @@ def fetch_pro_source( Pro 3.x stores in git-style branch+history with AES-encrypted EPRO2 streams; Pro 2.x predates that and uses Std-style per-doc dataStr served from /api/v2/documents/lists. See docs/sources/easyeda_pro_source.md §1.1. + + `max_source_mb` only gates modern-path projects (legacy is always tiny: <2 MB + in our 2/2 sample) and trips before any blob is written to disk past the cap. """ proj = _pro_get_json(pro_client, f"{PRO_API}/projects/{project_uuid}", project_uuid) time.sleep(sleep) if proj.get("branch_uuid"): - return _fetch_pro_modern(pro_client, project_uuid, proj, proj_dir, sleep) + return _fetch_pro_modern( + pro_client, project_uuid, proj, proj_dir, sleep, max_source_mb=max_source_mb + ) return _fetch_pro_legacy(pro_client, project_uuid, proj, proj_dir, sleep) @@ -454,6 +491,7 @@ def _fetch_pro_modern( proj: dict, proj_dir: Path, sleep: float = SLEEP_PRO, + max_source_mb: int | None = None, ) -> dict: """Modern Pro 3.x fetcher: full history chain, AES-GCM decrypted, gunzipped, and partitioned into per-document EPRO2 streams. @@ -513,11 +551,19 @@ def _fetch_pro_modern( cur_doc: str | None = None bytes_blob_total = 0 bytes_plain_total = 0 + cap_bytes = max_source_mb * 1024 * 1024 if max_source_mb is not None else None for h in ordered: blob_r = pro_client.get(h["dataStrUrl"], headers={"path": project_uuid}) blob_r.raise_for_status() blob = blob_r.content bytes_blob_total += len(blob) + # Trip cap on the encrypted blob total. Hits *after* the offending + # download, but before we decrypt/gunzip/partition (those scale with + # plain bytes which is even larger). Wipe any partial source/ so disk + # doesn't accumulate junk on multi-project runs. + if cap_bytes is not None and bytes_blob_total > cap_bytes: + shutil.rmtree(src_dir, ignore_errors=True) + raise ProjectOversizeError(bytes_blob_total, max_source_mb) if len(blob) < 16: raise RuntimeError(f"history {h['uuid']} blob too short ({len(blob)} B)") ct, tag = blob[:-16], blob[-16:] @@ -849,6 +895,8 @@ def crawl_one( fetch_files: bool = True, source_client: httpx.Client | None = None, pro_source_client: httpx.Client | None = None, + skip_exts: set[str] | None = None, + max_source_mb: int | None = None, ) -> CrawlResult: uuid = list_item["uuid"] path = list_item["path"] @@ -916,6 +964,14 @@ def crawl_one( "size": a.get("size"), "md5": a.get("md5"), } + # ext gate: declared `ext` first, fall back to filename suffix. Lower-case + # compare; entry kept in metadata so we can re-fetch later if policy changes. + ext_token = (a.get("ext") or Path(safe_name).suffix.lstrip(".")).lower() + if skip_exts and ext_token in skip_exts: + entry["skipped"] = f"ext:{ext_token}" + skipped.append(f"{name}: ext:{ext_token}") + files_meta.append(entry) + continue if fetch_files: try: size, sha = download_to(client, file_url, local_path) @@ -950,11 +1006,17 @@ def crawl_one( origin = list_item.get("origin") if origin == "pro" and pro_source_client is not None: try: - src_meta = fetch_pro_source(pro_source_client, uuid, proj_dir) + src_meta = fetch_pro_source( + pro_source_client, uuid, proj_dir, max_source_mb=max_source_mb + ) print( f" pro source: {len(src_meta.get('source_documents', []))} docs, " f"editor={src_meta.get('editor_version')}" ) + except ProjectOversizeError as e: + print(f" pro source SKIPPED (oversize): {e}", file=sys.stderr) + skipped.append(f"pro_source: oversize ({e.bytes_so_far // 1024 // 1024} MB > {e.cap_mb} MB)") + _record_oversize(out_root, uuid, e) except Exception as e: # noqa: BLE001 print(f" pro source FAIL: {e}", file=sys.stderr) skipped.append(f"pro_source: {e}") @@ -1088,7 +1150,27 @@ def main(argv: list[str] | None = None) -> int: default=PRO_COOKIE_PATH_DEFAULT, help="path to file with Cookie header for pro.lceda.cn", ) + ap.add_argument( + "--skip-ext", + type=str, + default=None, + help="comma-separated list of attachment extensions to skip (e.g. mp4,qt,mov). " + "Saves ~30-50%% LFS storage on average. Entry still recorded in metadata.json " + "with skipped:ext: so we can re-fetch later.", + ) + ap.add_argument( + "--max-source-mb", + type=int, + default=None, + help="skip Pro modern projects whose chain blob total exceeds N MB. " + "Trips inside the chain loop, wipes partial source/, records to " + "data/state/oshwhub_pro_oversize.jsonl. No effect on Std or Pro 2.x legacy.", + ) args = ap.parse_args(argv) + skip_exts: set[str] | None = ( + {x.strip().lower().lstrip(".") for x in args.skip_ext.split(",") if x.strip()} + if args.skip_ext else None + ) n_target = args.limit if args.limit is not None else args.top args.out.mkdir(parents=True, exist_ok=True) @@ -1099,7 +1181,10 @@ def main(argv: list[str] | None = None) -> int: return _run_backfill_source(args.out, only_uuids=args.uuids) if args.backfill_pro_source: return _run_backfill_pro_source( - args.out, only_uuids=args.uuids, cookie_path=args.pro_cookie + args.out, + only_uuids=args.uuids, + cookie_path=args.pro_cookie, + max_source_mb=args.max_source_mb, ) with make_client() as client: @@ -1149,6 +1234,8 @@ def main(argv: list[str] | None = None) -> int: fetch_files=not args.no_files, source_client=source_client_ctx, pro_source_client=pro_source_client_ctx, + skip_exts=skip_exts, + max_source_mb=args.max_source_mb, ) print( f" OK: {r.files_count} files, {r.bytes_total / 1024 / 1024:.1f} MB " @@ -1217,6 +1304,7 @@ def _run_backfill_pro_source( out_root: Path, only_uuids: str | None = None, cookie_path: str = PRO_COOKIE_PATH_DEFAULT, + max_source_mb: int | None = None, ) -> int: """Walk per-project dirs in out_root, fetch Pro source for origin=pro projects. @@ -1253,7 +1341,13 @@ def _run_backfill_pro_source( meta = json.loads(meta_path.read_text(encoding="utf-8")) print(f"[{i}/{len(targets)}] {uuid} ({meta.get('title', '?')})") try: - src_meta = fetch_pro_source(pro_client, uuid, proj_dir) + src_meta = fetch_pro_source( + pro_client, uuid, proj_dir, max_source_mb=max_source_mb + ) + except ProjectOversizeError as e: + print(f" SKIPPED (oversize): {e}", file=sys.stderr) + _record_oversize(out_root, uuid, e) + continue except Exception as e: # noqa: BLE001 print(f" FAIL: {e}", file=sys.stderr) continue diff --git a/data/raw/oshwhub/ba64bd6f1c9c467ba3b674a54943557d/source/manifest.json b/data/raw/oshwhub/ba64bd6f1c9c467ba3b674a54943557d/source/manifest.json index 723e63f..db7225c 100644 --- a/data/raw/oshwhub/ba64bd6f1c9c467ba3b674a54943557d/source/manifest.json +++ b/data/raw/oshwhub/ba64bd6f1c9c467ba3b674a54943557d/source/manifest.json @@ -2,7 +2,7 @@ "project_uuid": "ba64bd6f1c9c467ba3b674a54943557d", "branch_uuid": "ef5f58bd0f1245b0a808c07e541a1b5c", "head_uuid": "764dd8b722a44914a915493277e204c9", - "fetched_at": "2026-04-28T16:06:55.434479+00:00", + "fetched_at": "2026-04-28T16:23:06.697278+00:00", "editor_version": "3.2.91", "chain_length": 12, "blob_bytes_total": 1195716, diff --git a/data/state/oshwhub_batch50_candidates.jsonl b/data/state/oshwhub_batch50_candidates.jsonl new file mode 100644 index 0000000..484d61d --- /dev/null +++ b/data/state/oshwhub_batch50_candidates.jsonl @@ -0,0 +1,50 @@ +{"owner": {"nickname": "pengzhihui", "avatar": "/image/avatar-default.png", "team": false, "uuid": "07d6c15e714c4f6aaba8aa0c3737379e", "username": "pengzhihui"}, "thumb": "//image.lceda.cn/pullimage/3X5wPID5TfY2QATyzcLAeXExhakaDHZSGnFrsTC3.jpeg", "origin": "pro", "count": {"fork": 0, "star": 3157, "like": 2137, "watch": 0, "views": 329510}, "created_at": "2022-08-20T04:18:00.000Z", "uuid": "c4aad9461c3941228a784944eb500757", "tags": [], "path": "pengzhihui/b11afae464c54a3e8d0f77e1f92dc7b7", "public": true, "updated_at": "2026-02-24T03:18:19.000Z", "members": ["07d6c15e714c4f6aaba8aa0c3737379e"], "grade": 4, "publish": true, "name": "【瀚文】HelloWord-Keyboard", "oshwhub_publish_at": "2023-08-28T08:11:34.000Z", "introduction": "`瀚文` 智能键盘是一把我为自己使用需求设计的 多功能、模块化 机械键盘。", "comments_count": 586} +{"owner": {"nickname": "Sngels_wyh", "avatar": "//image.lceda.cn/avatars/2024/12/s9etBtOA1q39LNLVZsfmkSrhj2DlgmIL2wFnv7f1.webp", "team": false, "uuid": "f5e5983cd8e94ba3b7f01b6e21d709b8", "username": "sngelswyh"}, "thumb": "https://image.lceda.cn/oshwhub/pullImage/35077647fee7471cb3f2dacc50ec3b37.jpg", "origin": "pro", "count": {"fork": 0, "star": 2766, "like": 1525, "watch": 0, "views": 362182}, "created_at": "2024-12-15T08:48:43.151Z", "uuid": "d865cb8992f1437ca728ed11b9ec9421", "tags": [], "path": "sngelswyh/stm32-smart-desktop-pet", "public": true, "updated_at": "2026-03-29T11:08:51.451Z", "members": ["f5e5983cd8e94ba3b7f01b6e21d709b8"], "grade": 3, "publish": true, "name": "STM32智能桌面宠物", "oshwhub_publish_at": "2026-03-30T03:13:02.395Z", "introduction": "可以进行一些简单的交流互动,立正,前进,后退,左转,右转,摇尾巴,趴下,蹲下,睡觉,向前跳,打招呼,伸懒腰等,一般用于放置桌面上。语音可以自定义设置,需要到智能公元网站自行配置。", "comments_count": 698} +{"owner": {"nickname": "不吃油炸鸡", "avatar": "//image.lceda.cn/avatars/2023/3/78VoBEi9LuHrNvVduuFevnBfZJysXc0Awt3RxNPi.png", "team": false, "uuid": "f7bcdbf6b47c41bdb9ee2f15c10033a9", "username": "no_chicken"}, "thumb": "https://image.lceda.cn/oshwhub/pullImage/532f00b2d581404bbce37aedaa31ab45.jpeg", "origin": "pro", "count": {"fork": 0, "star": 3422, "like": 1397, "watch": 0, "views": 361711}, "created_at": "2023-05-06T12:09:09.000Z", "uuid": "da55d50b394b4553bbcb799dc27a7e63", "path": "no_chicken/zhi-neng-shou-biao-OV-Watch_V2.2", "public": true, "updated_at": "2026-03-20T10:38:26.000Z", "members": ["f7bcdbf6b47c41bdb9ee2f15c10033a9"], "grade": 4, "publish": true, "name": "智能手表OV-Watch", "oshwhub_publish_at": "2025-12-29T03:42:25.000Z", "introduction": "功能包括日历、计算器、秒表、NFC、蓝牙无线升级、与手机传信息、抬腕亮屏、心率检测、环境温湿度检测、指南针、海拔测量等功能。已经尽量满足现在智能手表的功能,后期大家可以继续添加修改很多东西~", "comments_count": 374} +{"owner": {"nickname": "小O和小Q", "avatar": "//image.lceda.cn/pullimage/vPyLIOw60BN9Qi0mLwe2Dm5rZApORWMzFKMmLfvu.jpeg", "team": false, "uuid": "9ff80e24b505422a87c592cd4c6efb69", "username": "littleoandlittleq"}, "thumb": "//image.lceda.cn/pullimage/jDqTDFPFZtipYNYB0YLY3eLCALiFStAnJA1XThW3.jpeg", "origin": "pro", "count": {"fork": 0, "star": 2257, "like": 994, "watch": 0, "views": 218248}, "created_at": "2022-09-12T11:49:10.000Z", "uuid": "977b637a85fa44fbb5d4214373576a04", "path": "littleoandlittleq/bian-xie-jia-re-tai", "public": true, "updated_at": "2026-04-03T01:41:10.000Z", "members": ["9ff80e24b505422a87c592cd4c6efb69"], "grade": 4, "publish": true, "name": "[PD协议 | 高颜值]mini加热台", "oshwhub_publish_at": "2023-07-27T01:58:31.000Z", "introduction": "超迷你的加热台,PD20V供电,加热面大小5.6*5.6cm,可以通过两个按键设置参数。", "comments_count": 728} +{"owner": {"nickname": "乐鑫小铁匠", "avatar": "//image.lceda.cn/avatars/2023/7/DgnM9iWggXtWZa70BQwJnpb1x7P2etO5s7i6vqxp.png", "team": false, "uuid": "16555ec60452466ea4dbaa7c6b92cd89", "username": "esp-college"}, "thumb": "//image.lceda.cn/pullimage/YyPkhuGTNedxg6yM3fkJBovQB2b56pCCJb27zQjN.png", "origin": "pro", "count": {"fork": 0, "star": 2135, "like": 837, "watch": 0, "views": 304205}, "created_at": "2024-10-15T03:45:10.000Z", "uuid": "91fd41224cd74ffd8410bc77b216693b", "tags": [], "path": "esp-college/esp-sparkbot", "public": true, "updated_at": "2025-11-11T10:24:51.000Z", "members": ["f7922f3e92344fd69adf06f12263ee47", "a1aad839debe49d9b890a35890f849c6", "16555ec60452466ea4dbaa7c6b92cd89"], "grade": 3, "publish": true, "name": "ESP-SparkBot", "oshwhub_publish_at": "2025-03-12T05:42:19.000Z", "introduction": "ESP-SparkBot 基于 ESP32-S3,融合语音交互、图像识别与多媒体娱乐,可变身遥控小车、玩转本地 AI,支持大模型对话、实时视频传输和高清视频投屏,性能强大,乐趣无限!", "comments_count": 343} +{"owner": {"nickname": "Expert电子实验室", "avatar": "//image.lceda.cn/avatars/2023/3/YDZJyXLzXAX9CWyRpUeunFB4pdQrUx1uELdJytUC.png", "team": false, "uuid": "33e19026ed794dc99d07c4686fe7eb17", "username": "expert"}, "thumb": "//image.lceda.cn/oshwhub/ee5d2d79720249efa47d42b06483ead2.png", "origin": "pro", "count": {"fork": 0, "star": 2024, "like": 804, "watch": 0, "views": 135854}, "created_at": "2024-09-23T16:22:19.000Z", "uuid": "c8142997cb5c4e43acc5be42f54be6d2", "award_uuid": "e758bcd689234446a2b7ef4e90ef50a5", "path": "expert/gai-jin-xin-exlink-duo-gong-neng-diao-shi-qi-fen-li-die-ban", "public": true, "updated_at": "2026-03-18T07:05:51.000Z", "members": ["33e19026ed794dc99d07c4686fe7eb17"], "grade": 4, "publish": true, "name": "Exlink最好用的嵌入式多功能调试器", "oshwhub_publish_at": "2025-08-25T02:11:58.000Z", "introduction": "Exlink是一款基于ESP32S3设计的优雅的嵌入式多功能调试器,具有DAPlink、逻辑分析仪、串口助手、数控电源、无线下载器、无线串口、简易示波器等十余种不同功能,涵盖大部分嵌入式调试场景。", "comments_count": 530, "award_info": {"name": "星火2024高阶一等奖", "image": "https://image.lceda.cn/easyedaResource/images/d54874e35af645b4948763aba5bb5cea.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "e758bcd689234446a2b7ef4e90ef50a5"}} +{"owner": {"nickname": "EDA课程案例团队", "avatar": "//image.lceda.cn/avatar/jzC6S6odSY18Wlyl8LVUDrnabeedBVOtLS8EyUmL.png", "team": true, "uuid": "ebbda44292b4423b92db6e999d50f4d4", "username": "course-examples"}, "thumb": "//image.lceda.cn/pullimage/vZ4gYlm4aPajQfTGsAfyIPsZu12NXrt3CZIDGgGx.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1824, "like": 708, "watch": 0, "views": 199957}, "created_at": "2023-12-25T08:15:57.000Z", "uuid": "5e03b6545745463bb8b64813209ffb8c", "tags": [], "path": "course-examples/yi-qi-yi-biao-jian-yi-shu-zi-shi-bo-qi-she-ji-cha-jian-ban", "public": true, "updated_at": "2026-04-05T03:44:46.000Z", "members": ["cbb9d417f71441f78575dff6d9732aae", "1f391f553d454e5aaee93777ca35939c", "43c71ae1e8eb459785a5a6bd7899aea7", "7bb15a0fdb7c4c20ac6e8cc87ae87d6a", "ece185a2bf4d46218fc0dab0af6739d4"], "grade": 4, "publish": true, "name": "简易数字示波器设计(入门版)", "oshwhub_publish_at": "2026-01-16T09:07:45.000Z", "introduction": "打造一套针对电子爱好者及学生学习数字示波器的基础项目,以单片机核心板与插件元器件结合起来,十分适合入门学习!", "comments_count": 390} +{"owner": {"nickname": "黑马小乌龟", "avatar": "//image.lceda.cn/avatars/2025/9/x4ppQaoWrzq5ZwDsGj1hgXmSrzcX7euCZsgz45hE.webp", "team": false, "uuid": "1eb895ea1970464ba4a8e4a1565b0830", "username": "bryan_he"}, "thumb": "//image.lceda.cn/pullimage/Lrf0ZtIUAbrwgDC24lEzoJTsYs5s5klsd8n0YPay.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1578, "like": 928, "watch": 0, "views": 112602}, "created_at": "2024-01-10T09:31:52.000Z", "uuid": "ddcc963f6e234ee5b25bdf62d13c4a6b", "award_uuid": "e50644433a0e443cb38c273458a79345", "path": "bryan_he/usb_dc_ps", "public": true, "updated_at": "2025-12-22T15:18:17.000Z", "members": ["1eb895ea1970464ba4a8e4a1565b0830"], "grade": 4, "publish": true, "name": "【星火计划】USB可编程电源/功率监测", "oshwhub_publish_at": "2024-11-01T06:26:49.000Z", "introduction": "【星火计划】USB可编程电源/功耗监测,小程序控制,\n支持USB PD3.0,BC1.2协议,支持5V~20V输入,\n宽范围的输出电压,从2.7V ~ 20V可调,3A的带载能力", "comments_count": 389, "award_info": {"name": "星火2024初级优秀奖", "image": "https://image.lceda.cn/easyedaResource/images/bdf7c58b5f6341a29ea4ca0e53324392.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "e50644433a0e443cb38c273458a79345"}} +{"owner": {"nickname": "蓝星多面体", "avatar": "//image.lceda.cn/avatars/2025/3/hJUtxYRZcsSwXDf2DDfcpjVjPIVw1VoXtmOpVtQl.webp", "team": false, "uuid": "67341ef1bd084fdc82253c172303c478", "username": "ran-pang"}, "thumb": "//image.lceda.cn/oshwhub/bc1b869340da45b5b133f7873ef0316b.png", "origin": "pro", "count": {"fork": 0, "star": 1702, "like": 844, "watch": 0, "views": 140596}, "created_at": "2024-04-09T03:31:50.000Z", "uuid": "6f0c151b366d46fe90126093dd604afe", "award_uuid": "c5dd7f6930b54ae59e009396cf677215", "path": "ran-pang/multifunctional-keyboard", "public": true, "updated_at": "2026-03-02T03:04:18.131Z", "members": ["67341ef1bd084fdc82253c172303c478"], "grade": 4, "publish": true, "name": "承载我所有幻想的键盘", "oshwhub_publish_at": "2026-03-02T03:05:48.000Z", "introduction": "支持WIFI的4模机械键盘(USB、蓝牙、WIFI、2.4G接收器),搭载可拆卸FOC旋钮屏,支持SurfaceDial,支持多功能磁吸扩展(例如小键盘等),支持语音交互。", "comments_count": 168, "award_info": {"name": "星火2024高阶特等奖", "image": "https://image.lceda.cn/easyedaResource/images/49f42601ab1343eaa730ce7ef4f1eba1.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "c5dd7f6930b54ae59e009396cf677215"}} +{"owner": {"nickname": "小李电子实验室", "avatar": "//image.lceda.cn/avatars/2023/10/IGaX9IOU3oPdDoIp7MX6D6k1um7rbjoOOGwTJ84z.png", "team": false, "uuid": "19aab6b29e4b41dc8c821d2a6c008f02", "username": "lxu0423"}, "thumb": "//image.lceda.cn/oshwhub/80e9753174914f49b84889f0d552b457.jpg", "origin": "pro", "count": {"fork": 0, "star": 1482, "like": 634, "watch": 0, "views": 136810}, "created_at": "2024-09-09T09:41:55.642Z", "uuid": "126f1a61e36a4e859cd7a0c15ddcefe5", "award_uuid": "866441ba45bb4cd58f81a4d25986d14d", "tags": [], "path": "lxu0423/lithermal-thermal-imaging-camera", "public": true, "updated_at": "2025-03-23T22:11:50.000Z", "members": ["19aab6b29e4b41dc8c821d2a6c008f02"], "grade": 4, "publish": true, "name": "[LiThermal] 热成像相机", "oshwhub_publish_at": "2024-12-30T01:07:54.000Z", "introduction": "基于全志T113-S3和海康威视4117的热成像相机", "comments_count": 575, "award_info": {"name": "星火2024高阶二等奖", "image": "https://image.lceda.cn/easyedaResource/images/2d45dd35d22e4b26bbac002f9d1d7b9b.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "866441ba45bb4cd58f81a4d25986d14d"}} +{"owner": {"nickname": "EDA课程案例团队", "avatar": "//image.lceda.cn/avatar/jzC6S6odSY18Wlyl8LVUDrnabeedBVOtLS8EyUmL.png", "team": true, "uuid": "ebbda44292b4423b92db6e999d50f4d4", "username": "course-examples"}, "thumb": "//image.lceda.cn/oshwhub/b5a3370cb7994efc8d4051635879d0a1.jpg", "origin": "pro", "count": {"fork": 0, "star": 1259, "like": 470, "watch": 0, "views": 152521}, "created_at": "2024-11-29T03:28:45.000Z", "uuid": "8101a18ad83a49b8937b4c3b25d4490a", "tags": [], "path": "course-examples/bot-dog", "public": true, "updated_at": "2025-12-13T09:17:08.000Z", "members": ["88f0d6ac70c547ac8f46fa5c32e4a316", "cbb9d417f71441f78575dff6d9732aae", "1f391f553d454e5aaee93777ca35939c"], "grade": 4, "publish": true, "name": "EDA-Robot机器狗", "oshwhub_publish_at": "2025-11-19T01:45:41.000Z", "introduction": "此项目采用ESP8266主控,支持手机遥控,采用插件封装,非常适合新手焊接。", "comments_count": 754} +{"owner": {"nickname": "科技大卜玩", "avatar": "//image.lceda.cn/avatars/2023/8/iivPJo2WDI8YeDC26hjjikYyahm7p9l8QLU2Xusj.png", "team": false, "uuid": "33524017c335440c83753c5f5dde11c1", "username": "bukaiyuan"}, "thumb": "//image.lceda.cn/pullimage/F1q5Xo9lCwwJJ46DYpTFkR3KA8CXI8DGy76ZgKoi.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1634, "like": 828, "watch": 0, "views": 123542}, "created_at": "2023-08-01T13:42:52.000Z", "uuid": "2246f96d10b04e94bf3170bb4837d647", "award_uuid": "351adf59fe9247518a3a00311c718f4d", "tags": [], "path": "bukaiyuan/ESP32-hang-mu-yao-kong-qi", "public": true, "updated_at": "2026-04-24T01:47:05.000Z", "members": ["33524017c335440c83753c5f5dde11c1"], "grade": 3, "publish": true, "name": "ESP32 万能遥控器", "oshwhub_publish_at": "2023-09-27T05:44:40.000Z", "introduction": "基于ESP32-S3做一个万能的遥控器,作为以后各种RC模型,机器人的通用控制方案。\n还可以蓝牙连接电脑玩游戏,或者在遥控器上玩自己编写的游戏。", "comments_count": 191, "award_info": {"name": "星火2023自由二等奖", "image": "https://image.lceda.cn/easyedaResource/images/bda97f4e6096447791a6c6421a6cffd3.png", "links": "https://oshwhub.com/recommend/activities%20II", "uuid": "351adf59fe9247518a3a00311c718f4d"}} +{"owner": {"nickname": "小渣渣", "avatar": "//image.lceda.cn/avatars/2021/1/fd4EGq1OrDGMMae1XY5msOL6J6plEol13Wf8IPhm.jpeg", "team": false, "uuid": "26fa92c7af6f431490e2da8805f1d791", "username": "myzhazha"}, "thumb": "//image.lceda.cn/pullimage/qbr0oZSUa25qiNIioPT4PUzSCSwWAuzERX8WnuHC.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1419, "like": 666, "watch": 0, "views": 141262}, "created_at": "2022-09-01T09:15:36.000Z", "uuid": "53e6c236b9d14e74944e460ac11c7c1d", "tags": [], "path": "myzhazha/esp32s3_86-kai-fa-ban", "public": true, "updated_at": "2025-12-29T06:58:15.000Z", "members": ["26fa92c7af6f431490e2da8805f1d791"], "grade": 4, "publish": true, "name": "ESP32S3 86盒开发板 带触摸", "oshwhub_publish_at": "2024-01-02T02:06:18.000Z", "introduction": "使用ESP32S3N8R8作为主控的86面板开发板,带触摸带扬声器,可用于86面板开发,LVGL开发", "comments_count": 325} +{"owner": {"nickname": "未来电子工作室", "avatar": "//image.lceda.cn/avatar/zqSh6Yw1O37QCPOMDXbTdlodHuQ61J66gbIPOAnb.png", "team": true, "uuid": "fca3941cdb75438d9b2a128be1be731b", "username": "wei-lai-dian-zi-gong-zuo-shi"}, "thumb": "//image.lceda.cn/pullimage/RbtzBBvdIJIdAxBUtjynAvNDdGU55JWdusa1Y7Wk.png", "origin": "pro", "count": {"fork": 0, "star": 1471, "like": 753, "watch": 0, "views": 127493}, "created_at": "2022-09-11T01:55:17.000Z", "uuid": "a670e60acee54566a9f3e841bb634274", "tags": [], "path": "wei-lai-dian-zi-gong-zuo-shi/qian-ru-shi-ji-yu-stc32-de-zhi-nen-xiao-che-she-ji", "public": true, "updated_at": "2026-01-19T09:45:29.000Z", "members": ["29f4e3b4d7124899a00c47191347fe01", "09e443533d9445f181e6d24aaab68f47"], "grade": 4, "publish": true, "name": "【嵌入式】逐梦壹号-基于STC32的智能小车设计", "oshwhub_publish_at": "2023-09-14T12:30:21.000Z", "introduction": "如果说小时候有什么梦想,那可能就是想拥有一辆属于自己的四驱车了。为了圆造车梦,将电路学习、PCB设计、焊接与单片机开发结合起来,真正做到零基础学习,这辆小车我们便给它取名为:逐梦壹号。", "comments_count": 224} +{"owner": {"nickname": "画板当吃生菜", "avatar": "//image.lceda.cn/avatars/2020/7/cSvEeXEMvT02Z4q7FdMG0Nln8xGdBtytpMGf57lu.jpeg", "team": false, "uuid": "235e0ca983624789a6f0492cd5a4b512", "username": "yangzen"}, "thumb": "//image.lceda.cn/pullimage/CNLYX16K1KVs8dV2DftiiriK7beCyFGqOqwhB0rZ.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1124, "like": 685, "watch": 0, "views": 150162}, "created_at": "2022-06-09T02:30:50.000Z", "uuid": "3e3c7725251c4456ad91cd88308944ff", "tags": [], "path": "yangzen/xing-huo-ji-hua-zui-gai-17-4-chu-mo-ji-xie-jian-pan-pro", "public": true, "updated_at": "2025-12-28T05:40:29.000Z", "members": ["235e0ca983624789a6f0492cd5a4b512"], "grade": 3, "publish": true, "name": "最丐17+4TPRO机械键盘", "oshwhub_publish_at": "2025-10-11T03:00:53.000Z", "introduction": "2025年10月11日稳定性更新: \n1. 修复上报32位坐标溢出的问题\n2. 每次W11_LAMP更新时切换到在线模式\n3. 屏蔽休眠恢复后的重加载功能", "comments_count": 376} +{"owner": {"nickname": "logicworld", "avatar": "https://u.lceda.cn/images/avatar-default.png?id=f119c61e3d5ce714b4b8", "team": false, "uuid": "0d18a61fce2a475c94847e0ea05339a5", "username": "logicworld"}, "thumb": "//image.lceda.cn/pullimage/UZTlVGjHIwdTBM7U8a8MdYdS6STOC7WwmBpuVb6J.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1459, "like": 694, "watch": 0, "views": 146963}, "created_at": "2022-11-06T14:43:51.000Z", "uuid": "72312817efb6449ca520216c820c432c", "path": "logicworld/h6_board", "public": true, "updated_at": "2026-04-15T05:12:30.000Z", "members": ["0d18a61fce2a475c94847e0ea05339a5"], "grade": 4, "publish": true, "name": "全志H6开发板-从零入门ARM高速电路设计", "oshwhub_publish_at": "2023-12-11T05:43:19.000Z", "introduction": "本项目开源主要目的是帮助想学ARM高速电路的小伙伴们,学会自己做一个ARM开发板(eg. 全志H6开发板)。快来看看是否真从零入门,有手就行!", "comments_count": 166} +{"owner": {"nickname": "阿慕希", "avatar": "//image.lceda.cn/avatars/2024/6/cfdfLOu4ziNFDsbLngPDY0VKpWKP9zj23wWGJbgR.png", "team": false, "uuid": "5f08c597e56a41bab8e5ee2500cedc61", "username": "movecall"}, "thumb": "//image.lceda.cn/pullimage/wxmiS0dRdmrR71POPSkSyTfii6qWXkzHAj9lmicv.png", "origin": "pro", "count": {"fork": 0, "star": 1108, "like": 389, "watch": 0, "views": 174750}, "created_at": "2025-01-14T12:58:20.977Z", "uuid": "f2a2530d6e1848109aeda5fd5f9e38d9", "tags": [], "path": "movecall/moji-xiaozhi-ai-derivative-editi", "public": true, "updated_at": "2025-10-14T08:14:34.000Z", "members": ["5f08c597e56a41bab8e5ee2500cedc61"], "grade": 3, "publish": true, "name": "Moji 小智AI衍生版", "oshwhub_publish_at": "2025-03-22T07:15:23.000Z", "introduction": "Moji,基于 小智AI 的桌面摆件,兼具智能与温暖,既是助手也是伙伴,以智慧解决问题,用温柔陪伴生活,让每一天更美好。", "comments_count": 530} +{"owner": {"nickname": "海底撩", "avatar": "//image.lceda.cn/avatars/2022/4/rohgFIfiQiw8oJLnw73FNjBHqLkf6vxaWtsWga5l.png", "team": false, "uuid": "f2352062eb974a6abed1282c2764c3c7", "username": "eda_rgprdhwej"}, "thumb": "//image.lceda.cn/pullimage/SlO722DEICOgmKA2CqLCoWEJEgAZa9Ue92W7scYW.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1528, "like": 595, "watch": 0, "views": 114268}, "created_at": "2022-08-21T16:07:40.000Z", "uuid": "8624bf3d43ba4732bb256c08aafe186b", "path": "eda_rgprdhwej/chappie_oshw", "public": true, "updated_at": "2026-02-23T23:34:38.000Z", "members": ["f2352062eb974a6abed1282c2764c3c7"], "grade": 4, "publish": true, "name": "【ESP32-S3】1.69寸触摸屏迷你控制器~", "oshwhub_publish_at": "2022-12-02T01:17:24.000Z", "introduction": "基于ESP32-S3,板载1.69寸LCD总成接口、蜂鸣器、SD卡槽、AXP173电源管理,双排母引出大部分引脚供底板拓展功能。", "comments_count": 232} +{"owner": {"nickname": "DroneCYF", "avatar": "https://diy.szlcsc.com/images/avatar-default.png?id=f119c61e3d5ce714b4b8", "team": false, "uuid": "cf041e4192a545a4a2767f7cde799341", "username": "clz1"}, "thumb": "//image.lceda.cn/pullimage/rKZs6yrLjl0v060PRD6pKJvTSms8ezjeh4lIlcq4.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1271, "like": 776, "watch": 0, "views": 81317}, "created_at": "2022-09-13T02:38:49.000Z", "uuid": "0bc142e0f24e4b06ab6d555f935eca98", "tags": [], "path": "clz1/5.8Ghztu-zhuan", "public": true, "updated_at": "2026-01-31T08:24:49.000Z", "members": ["cf041e4192a545a4a2767f7cde799341", "48b1a4d1fc304f0196652ae2055ff568"], "grade": 4, "publish": true, "name": "飞行器设计之5.8Ghz图传", "oshwhub_publish_at": "2023-09-11T07:13:46.000Z", "introduction": "此工程主要是进行飞行器的5.8Ghz图传设计,实现飞行器上摄像头视频信号的发射。主要包括原理图设计、PCB设计和电路仿真。原理图和PCB设计最多占此工程工作量的30%,电路仿真是非常耗时且繁琐过程。", "comments_count": 184} +{"owner": {"nickname": "黑马小乌龟", "avatar": "//image.lceda.cn/avatars/2025/9/x4ppQaoWrzq5ZwDsGj1hgXmSrzcX7euCZsgz45hE.webp", "team": false, "uuid": "1eb895ea1970464ba4a8e4a1565b0830", "username": "bryan_he"}, "thumb": "//image.lceda.cn/oshwhub/02c786878782461daaea1f2679e947c3.jpg", "origin": "pro", "count": {"fork": 0, "star": 1314, "like": 521, "watch": 0, "views": 112947}, "created_at": "2024-06-25T12:38:31.001Z", "uuid": "03b939e5e6e544408e0879202ebc20ce", "award_uuid": "ccbd9d8bfa7c4579b974a34a88c22654", "tags": [], "path": "bryan_he/usb-ps-v30", "public": true, "updated_at": "2025-12-19T00:37:21.000Z", "members": ["1eb895ea1970464ba4a8e4a1565b0830"], "grade": 4, "publish": true, "name": "USB可调电源V3,硬件V4.7全面升级", "oshwhub_publish_at": "2025-03-17T01:45:41.000Z", "introduction": "USB可调电源,输入防倒灌防反接,输出防倒灌,支持USB PD3.0,BC1.2等,DC 5V~27V输入,输出电压2V ~ 34V连续可调,大于5A的带载能力,限流10mA~8A连续可调", "comments_count": 292, "award_info": {"name": "星火2024高阶鼓励奖", "image": "https://image.lceda.cn/easyedaResource/images/70856a22656a4ca0980c216cff62fb82.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "ccbd9d8bfa7c4579b974a34a88c22654"}} +{"owner": {"nickname": "_buerchen", "avatar": "//image.lceda.cn/avatars/2021/11/FIwXX4xWQ057hcqauUlWZM1ja4G8DwiD8TwhQGtT.png", "team": false, "uuid": "110e585640d34b5fb6cf40cad05cf172", "username": "buerchen"}, "thumb": "//image.lceda.cn/pullimage/ISDYxW65ecUhy445f7Zox1TZqXdNaLGWWTKuZMfG.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1049, "like": 570, "watch": 0, "views": 81684}, "created_at": "2022-05-02T11:59:59.000Z", "uuid": "c610a9bc18ac4a17a88ab6e427a25d6f", "path": "buerchen/t12-han-bi-v6-1", "public": true, "updated_at": "2026-03-16T03:41:16.000Z", "members": ["110e585640d34b5fb6cf40cad05cf172"], "grade": 4, "publish": true, "name": "T12焊笔v6.1", "oshwhub_publish_at": "2023-07-03T08:02:40.000Z", "introduction": "新版T12焊笔替换0.5寸OLED 88*48 CH1115驱动 IIC ,兼容ESP8266和ESP8285,新增3D打印外壳。", "comments_count": 485} +{"owner": {"nickname": "雷老师讲电子", "avatar": "//image.lceda.cn/avatars/2023/9/V7aSCjFByVCbbbG8pOAFUUywTGdBC5xEYMzM0xbV.png", "team": false, "uuid": "a481b71acdb44a3f8c8a15fe621c992f", "username": "leichaolin"}, "thumb": "//image.lceda.cn/pullimage/MRyi3ahztovD8GJ41WF45V4kDsBxmjORiGMJMfgG.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1102, "like": 536, "watch": 0, "views": 119662}, "created_at": "2023-02-26T06:48:02.000Z", "uuid": "d46ef2f68e334a72961d48ba0cfbcae2", "award_uuid": "a4afb270021b4ab0913ee4ada36cef8e", "path": "leichaolin/xing-huo-ji-hua-3.5KWda-gong-shu", "public": true, "updated_at": "2025-09-10T00:24:08.000Z", "members": ["a481b71acdb44a3f8c8a15fe621c992f", "acdc8201ac3f4aeea678af40bd97cb50"], "grade": 4, "publish": true, "name": "3.5KW大功率逆变器 【星火计划】", "oshwhub_publish_at": "2023-08-30T05:53:35.000Z", "introduction": "输入24-72V输出220V的3.5KW逆变器", "comments_count": 256, "award_info": {"name": "星火2023外包一等奖", "image": "https://image.lceda.cn/easyedaResource/images/d089a0fd5b4245a48ee80e0bdf97c1b8.png", "links": "https://oshwhub.com/recommend/activities%20II", "uuid": "a4afb270021b4ab0913ee4ada36cef8e"}} +{"owner": {"nickname": "上电冒烟", "avatar": "//image.lceda.cn/avatars/2021/12/HK3qoDozjgNONK1dVGVl16ir8AOmQNVC18DS0Tp5.png", "team": false, "uuid": "63725c4e64e5478099fa821cabcea5b5", "username": "z_star"}, "thumb": "//image.lceda.cn/pullimage/kIcEEUbe0wdv3WwOSfGTZD6PCBvrU3Zomxe6voan.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1139, "like": 599, "watch": 0, "views": 98534}, "created_at": "2024-01-13T04:25:36.000Z", "uuid": "2f01fdb9fbaf499f8b537081ce3e4a66", "award_uuid": "7030414529dd43ea868f63d1b18a7b4d", "path": "z_star/zynq7020-core-board-and-various-rf-modules", "public": true, "updated_at": "2025-12-19T01:07:08.000Z", "members": ["63725c4e64e5478099fa821cabcea5b5"], "grade": 4, "publish": true, "name": "ZYNQ7020核心板及各种射频模块", "oshwhub_publish_at": "2024-01-25T15:57:56.000Z", "introduction": "ZYNQ7020核心板(主体,最低成本仅需90元!)、170MSPSADC、210MSPSDAC、1.6GSPS 16bit DAC、9GHz PLL、500MSPS 12bit ADC等", "comments_count": 233, "award_info": {"name": "星火2024初级二等奖", "image": "https://image.lceda.cn/easyedaResource/images/a88c4eae9fda492d9e3ccc276394005d.png", "links": "https://oshwhub.com/recommend/activities%20III", "uuid": "7030414529dd43ea868f63d1b18a7b4d"}} +{"owner": {"nickname": "45coll", "avatar": "//image.lceda.cn/avatars/2023/11/rv1hIXrwubREIEYMmkQTe2kExL7JJo0KLrwFAhGr.png", "team": false, "uuid": "580e8f5f47ef40be8cf8b3b09b3a14f5", "username": "45coll"}, "thumb": "//image.lceda.cn/avatars/2022/9/uP30wGpCdSXnic6Kj0gvH8ZBxmTHzAzC5YTwZ9x8.png", "origin": "pro", "count": {"fork": 0, "star": 1174, "like": 554, "watch": 0, "views": 116513}, "created_at": "2022-07-17T02:00:14.000Z", "uuid": "7f7565ef11504863938c0de79622dd54", "tags": [], "path": "45coll/a2fff3c71f5d4de2b899c64b152d3da5", "public": true, "updated_at": "2026-04-15T07:54:56.000Z", "members": ["580e8f5f47ef40be8cf8b3b09b3a14f5", "df60acc759e0467cad6386fe5697ce5b"], "grade": 4, "publish": true, "name": "Super Dial 电机旋钮屏—esp32s3—v2", "oshwhub_publish_at": "2024-05-06T08:44:13.000Z", "introduction": "灵感来源与国外的smart konb,制作初衷为制作一个桌面力反馈旋钮,可实现与surface dial一样的功能。", "comments_count": 175} +{"owner": {"nickname": "甘草酸不酸", "avatar": "//image.lceda.cn/avatars/2020/11/YqeCBNguh8OldLPZKemF1j0iCSdnol81FkTf8Umj.jpeg", "team": false, "uuid": "2f4dba9caefc4ce2a56acccdb7d95846", "username": "jie326513988"}, "thumb": "//image.lceda.cn/pullimage/1kkoNNRel8HGTyfXE6rdvuyIrhsZIB9yjFK1ylZ7.jpeg", "origin": "pro", "count": {"fork": 0, "star": 1120, "like": 501, "watch": 0, "views": 108042}, "created_at": "2023-03-11T10:10:21.000Z", "uuid": "81e13f4b2c8942dca536bfe23e2bf1dc", "award_uuid": "1c2814c5676941fd9cebd835738de826", "path": "jie326513988/ESP32mi-ni-mo-shui-ping-MP3shou-", "public": true, "updated_at": "2026-04-16T10:23:34.000Z", "members": ["2f4dba9caefc4ce2a56acccdb7d95846", "fb99bbf7067e4d6a8f9b647c7400218b"], "grade": 4, "publish": true, "name": "ESP32墨水屏MP3收音机阅读器", "oshwhub_publish_at": "2024-05-28T01:15:46.000Z", "introduction": "天气 阅读 图片 时钟 MP3 收音机 配网 设置", "comments_count": 224, "award_info": {"name": "星火2023自由三等奖", "image": "https://image.lceda.cn/easyedaResource/images/4c3e439df9f74a44b3842b5595e82bf6.png", "links": "https://oshwhub.com/recommend/activities%20II", "uuid": "1c2814c5676941fd9cebd835738de826"}} +{"owner": {"nickname": "mondraker", "avatar": "//image.lceda.cn/avatars/2024/5/jOZFiDEFiFk0AGGq8kWJnWvA5YOWVCdk3wJj0v7W.png", "team": false, "uuid": "37d334fe908b4df9b508da7318220388", "username": "mondraker"}, "thumb": "//image.lceda.cn/pullimage/mwKKTEDJaNPWViwxYvr2tgWnnFKj7F5HxOervHOT.jpeg", "origin": "std", "count": {"fork": 4434, "star": 2324, "like": 1036, "watch": 0, "views": 297150}, "created_at": "2022-04-05T15:41:17.000Z", "uuid": "9158ea94e9654f6eb2cca93b5c2a9c32", "path": "mondraker/snow_light", "public": true, "updated_at": "2026-03-11T09:15:59.000Z", "members": ["37d334fe908b4df9b508da7318220388"], "grade": 3, "publish": true, "name": "触摸无极调光雪花灯(陶瓷灯丝)(新手小白也可以做!)", "oshwhub_publish_at": "2024-12-18T05:45:21.000Z", "introduction": "触摸无极调光,无频闪无需烧录程序,焊接简单有教程,送朋友,当挂件都可。Type-C接口,成本不算邮费五块左右。附带焊接教程与所有物料链接!配套亚克力外壳与充电底座都已开源,迭代完成放心食用。", "comments_count": 524} +{"owner": {"nickname": "xiangyang0926", "avatar": "//image.lceda.cn/avatars/2021/5/iNWPbW82SMJ9vJsCqCX82UHIwFnpKhGiTvHZTOkg.png", "team": false, "uuid": "c12b5ac758cb4e5e9a42a6505f9fa9f0", "username": "xiangyang0926"}, "thumb": "//image.lceda.cn/pullimage/Q9gETfMMCdjRKFeGzbtK1kqsl2o5vZ6CUQqBBLXg.jpeg", "origin": "std", "count": {"fork": 766, "star": 1918, "like": 857, "watch": 0, "views": 180839}, "created_at": "2021-09-03T06:18:08.000Z", "uuid": "0369a515056840798905fdb26359073f", "tags": [], "path": "xiangyang0926/ke-diao-dian-yuan_copy", "public": true, "updated_at": "2026-04-04T03:46:12.000Z", "members": ["c12b5ac758cb4e5e9a42a6505f9fa9f0"], "grade": 3, "publish": true, "name": "桌面可调电源(经济实惠款)", "oshwhub_publish_at": "2022-09-19T10:11:49.000Z", "introduction": "桌面电源(经济实惠款)\n我愿称之为芯龙之光\n芯龙全家桶", "comments_count": 314} +{"owner": {"nickname": "OSHWHub开源硬件", "avatar": "//image.lceda.cn/pullimage/zTpiQ71FSjeZjWpTBgJPQyAMhcmOldfuvsjM6mVQ.jpeg", "team": true, "uuid": "b891f6552c9941cf8931dfaefd81fca1", "username": "OSHWHubkai-yuan-ying-jian"}, "thumb": "//image.lceda.cn/avatars/2019/10/hHC7BjrPKr531ZhNUxlskERviQATlXmSTbjH2IM8.jpeg", "origin": "std", "count": {"fork": 1550, "star": 1233, "like": 663, "watch": 0, "views": 157579}, "created_at": "2019-10-28T08:21:21.000Z", "uuid": "29ff00b5fc83498681271320e8855bc7", "tags": ["立创EDA", "OSHWHub", "开源硬件", "PCB尺子"], "path": "OSHWHubkai-yuan-ying-jian/li-chuangeda-chi-zi", "public": true, "updated_at": "2026-03-03T01:53:42.000Z", "members": ["39ac5be00a2242bfab437482716a9ddd", "4251c6ae97414f38bb1d929da02c4173", "cbb9d417f71441f78575dff6d9732aae", "7bb15a0fdb7c4c20ac6e8cc87ae87d6a", "89b0974d1a8e4bb8b73215352164792b"], "grade": 3, "publish": true, "name": "立创EDA尺子(PCB直尺)", "oshwhub_publish_at": "2023-03-22T09:43:20.000Z", "introduction": "立创EDA官方使用立创EDA设计的PCB尺子,喜欢可以直接在嘉立创下单生产", "comments_count": 99} +{"owner": {"nickname": "45coll", "avatar": "//image.lceda.cn/avatars/2023/11/rv1hIXrwubREIEYMmkQTe2kExL7JJo0KLrwFAhGr.png", "team": false, "uuid": "580e8f5f47ef40be8cf8b3b09b3a14f5", "username": "45coll"}, "thumb": "//image.lceda.cn/avatars/2021/11/SkYmC62QJJtGJDvetpAcBmMfeBoVNrbMLB0I8Ocn.png", "origin": "std", "count": {"fork": 535, "star": 1351, "like": 653, "watch": 0, "views": 171592}, "created_at": "2021-09-28T01:21:48.000Z", "uuid": "201d355452dc48d988f0ddbd981a8a4d", "tags": [], "path": "45coll/zi-ping-heng-di-lai-luo-san-jiao_10-10-ban-ben", "public": true, "updated_at": "2026-03-11T09:15:59.000Z", "members": ["580e8f5f47ef40be8cf8b3b09b3a14f5", "f35d5586b85044ee8f068830892ff5b6"], "grade": 4, "publish": true, "name": "自平衡的莱洛三角_esp32_可充电_10*10版本", "oshwhub_publish_at": "2022-07-21T05:23:04.000Z", "introduction": "esp32作为主控,5V充3串锂电池,可实现摇摆自平衡。", "comments_count": 178} +{"owner": {"nickname": "LiiGuang", "avatar": "https://lceda.cn/images/avatar-default.png?id=f119c61e3d5ce714b4b8", "team": false, "uuid": "a029aa7cae0046668ef932291a5ca84a", "username": "LiiGuang"}, "thumb": "//image.lceda.cn/avatars/2022/7/lUdCAf1YwebqL2vP0R0y43NVBFXg8gGhnImrZg1e.png", "origin": "std", "count": {"fork": 611, "star": 1157, "like": 518, "watch": 0, "views": 86716}, "created_at": "2021-12-02T09:43:03.000Z", "uuid": "ec8a8499750b4e729d3e93e842edc68b", "tags": [], "path": "LiiGuang/pn532-bigant_copy_copy", "public": true, "updated_at": "2026-04-18T13:43:32.000Z", "members": ["a029aa7cae0046668ef932291a5ca84a"], "grade": 4, "publish": true, "name": "PN532读写卡器(支持NFC、RFID)", "oshwhub_publish_at": "2022-07-29T00:47:05.000Z", "introduction": "一个基于PN532的RFID读写器,可以读写M1、UID、CUID、FUID、带NFC功能的手环、手机等,门禁卡解决方案的不二之选。", "comments_count": 614} +{"owner": {"nickname": "MisakaBanBan", "avatar": "//image.lceda.cn/pullimage/Hxg8gwzBw2W0NAVnOB6xRqKYfrDK5BquxlQ3gtlJ.jpeg", "team": false, "uuid": "4e16abca3420482f972d0f52cfb55f60", "username": "MisakaBanBan"}, "thumb": "//image.lceda.cn/pullimage/0LC1VDEuA4FbpmzIHiFUESChNyIlnzC53NkgSSYf.jpeg", "origin": "std", "count": {"fork": 455, "star": 1409, "like": 518, "watch": 0, "views": 127732}, "created_at": "2021-11-15T12:16:55.000Z", "uuid": "7e052d660aeb40aa9d47a558dd26175b", "path": "MisakaBanBan/small_desktop_display", "public": true, "updated_at": "2026-03-30T12:21:54.000Z", "members": ["4e16abca3420482f972d0f52cfb55f60"], "grade": 3, "publish": true, "name": "【征集令】超漂亮的个人时钟天气站 SD²", "oshwhub_publish_at": "2022-07-28T08:41:38.000Z", "introduction": "esp12f模块是一个具有WiFi的微处理器,用他来打造一个超漂亮的个人时钟天气站吧!", "comments_count": 165} +{"owner": {"nickname": "mazhiliang", "avatar": "https://lceda.cn/images/avatar-default.png?id=f119c61e3d5ce714b4b8", "team": false, "uuid": "16e40f5e8057450ebcf365711ae72b64", "username": "mazhiliang"}, "thumb": "//image.lceda.cn/pullimage/XebSued0jf1SSfw4S0IaS83s1rhTo8pG3scKr3Qq.jpeg", "origin": "std", "count": {"fork": 719, "star": 1072, "like": 506, "watch": 0, "views": 102935}, "created_at": "2021-09-21T02:34:42.000Z", "uuid": "f643591fd411467db1e4efe3ce0970e8", "tags": [], "path": "mazhiliang/esp32-dev", "public": true, "updated_at": "2026-01-20T06:53:15.000Z", "members": ["16e40f5e8057450ebcf365711ae72b64"], "grade": 3, "publish": true, "name": "ESP32开发板 ESP32-IOT-KIT全开源物联网开发板", "oshwhub_publish_at": "2022-07-19T05:51:54.000Z", "introduction": "以ESP32模组为主控设计的开发板,支持WIFI、蓝牙、以太网、RS485、CAN等通信方式。软硬件全开源计划,配套Easyio驱动库、CSDN博文教程,方便大家从ESP-IDF入门物联网的学习与开发", "comments_count": 145} +{"owner": {"nickname": "甘草酸不酸", "avatar": "//image.lceda.cn/avatars/2020/11/YqeCBNguh8OldLPZKemF1j0iCSdnol81FkTf8Umj.jpeg", "team": false, "uuid": "2f4dba9caefc4ce2a56acccdb7d95846", "username": "jie326513988"}, "thumb": "//image.lceda.cn/pullimage/i3Ii5diadqRhKUS92NFiD50e3lLbRdylqXlg0ay3.jpeg", "origin": "std", "count": {"fork": 206, "star": 1107, "like": 547, "watch": 0, "views": 137931}, "created_at": "2022-02-22T14:18:32.000Z", "uuid": "b4a490405bbd43b8a7577a8faf4b35c2", "path": "jie326513988/SDka-mo-shui-ping-yue-du-qi", "public": true, "updated_at": "2025-06-16T11:45:05.000Z", "members": ["2f4dba9caefc4ce2a56acccdb7d95846"], "grade": 4, "publish": true, "name": "墨水屏阅读器-持续添加更多尺寸", "oshwhub_publish_at": "2022-10-13T01:24:32.000Z", "introduction": "添加二次元透明背壳,嘉立创面板打印YYDS!\n添加4.2寸固件\n在原有的多功能天气墨水屏的基础下加入SD卡,可从SD卡打开TXT文件阅读。无阉割,天气、温湿度芯片、时钟芯片、阅读、配网。", "comments_count": 225} +{"owner": {"nickname": "Kirito", "avatar": "//image.lceda.cn/avatars/2020/3/PuriJwVksBFdJoTZsYiAfSnm4HReUHqJJA7yzmqm.jpeg", "team": false, "uuid": "3dc72a434ae74b968d0478d4a9c8724f", "username": "kirito"}, "thumb": "//image.lceda.cn/pullimage/UoqTBBjftYyim6eEWgYwvOhyJBkGwJi3jt8xOu65.jpeg", "origin": "std", "count": {"fork": 367, "star": 880, "like": 477, "watch": 0, "views": 94333}, "created_at": "2023-03-12T09:00:26.000Z", "uuid": "e5dc20d57ef243b985ff86c12a46135c", "tags": [], "path": "kirito/rtl8367-4ge-2sfp_copy", "public": true, "updated_at": "2026-02-27T04:47:40.000Z", "members": ["3dc72a434ae74b968d0478d4a9c8724f"], "grade": 4, "publish": true, "name": "RTL8367S-4GE+SFP千兆光电交换机", "oshwhub_publish_at": "2023-03-31T01:25:06.000Z", "introduction": "这是基于RTL8367S的4电口+1光口的千兆交换机", "comments_count": 264} +{"owner": {"nickname": "1378dm", "avatar": "/image/avatar-default.png", "team": false, "uuid": "b2064b0a993b4f93aadc2893e1b656aa", "username": "1378dm"}, "thumb": "//image.lceda.cn/pullimage/O80U1HV9kRkbhYSQle5Bo8Ze76GnpWrpi6PXRYHY.jpeg", "origin": "std", "count": {"fork": 49, "star": 1330, "like": 743, "watch": 0, "views": 54307}, "created_at": "2022-01-16T06:52:32.000Z", "uuid": "f052d1b8ca4c48778b872b542c20d1c4", "tags": [], "path": "1378dm/better-pcb-picture", "public": true, "updated_at": "2025-08-15T03:27:32.000Z", "members": ["b2064b0a993b4f93aadc2893e1b656aa"], "grade": 4, "publish": true, "name": "更好的PCB照片 - 避免卡顿", "oshwhub_publish_at": "2022-08-29T02:15:17.000Z", "introduction": "将任意图片转化成LCEDA的LIB文件,大大减少卡顿", "comments_count": 142} +{"owner": {"nickname": "GoodYuHuang", "avatar": "//image.lceda.cn/avatars/2022/12/rdZmN4PyBQZ1p233a5YxpEfT31bAyHJ9Q3Zpu42u.png", "team": false, "uuid": "53adcecec2b840069aab2ceb81e52d0e", "username": "goodyuhuang"}, "thumb": "//image.lceda.cn/pullimage/dvsAxKbsoMGFjlggZHurDkTZy6M0ftamuxpKXW0H.jpeg", "origin": "std", "count": {"fork": 290, "star": 1113, "like": 462, "watch": 0, "views": 91780}, "created_at": "2022-11-20T09:13:05.000Z", "uuid": "ce949d32c86f448398bd5fdbeb026a77", "tags": [], "path": "goodyuhuang/ji-yu-VL813de-USB3.0-HUBshe-ji", "public": true, "updated_at": "2026-02-05T02:04:02.000Z", "members": ["53adcecec2b840069aab2ceb81e52d0e"], "grade": 4, "publish": true, "name": "【电路已验证】基于VL813的USB3.0-HUB设计", "oshwhub_publish_at": "2026-01-27T06:18:21.000Z", "introduction": "一个使用TYPE-C接口作为数据输入的USB3.0-HUB(立创EDA为直接导入,未作DRC检查,请不要直接打样,可使用附件资料打样)", "comments_count": 233} +{"owner": {"nickname": "小煜哥哥", "avatar": "//image.lceda.cn/avatars/2021/4/OciqdD9mfqz61bOfeKLNZqf44U4j5OcjtAIUzjvQ.png", "team": false, "uuid": "67f4ab719a2a4182934deee8cc979e93", "username": "wzw666"}, "thumb": "//image.lceda.cn/avatars/2022/4/5l2JFttpzbTZsYK4FCpOMpfNOJviSliQkmW9yfWW.png", "origin": "std", "count": {"fork": 476, "star": 749, "like": 355, "watch": 0, "views": 110577}, "created_at": "2022-03-31T07:05:30.000Z", "uuid": "f81e1c7f04774545a5c3d14212072a1e", "tags": [], "path": "wzw666/IP5389PRO", "public": true, "updated_at": "2026-04-25T12:24:08.000Z", "members": ["67f4ab719a2a4182934deee8cc979e93"], "grade": 3, "publish": true, "name": "重制版IP5389[100瓦双向快充移动电源]", "oshwhub_publish_at": "2022-10-12T01:19:17.000Z", "introduction": "基于英集芯IP5389-BZ芯片设计的双向PD100瓦移动电源方案", "comments_count": 279} +{"owner": {"nickname": "成真科技", "avatar": "//image.lceda.cn/avatars/2022/7/P7k8k6K5xqd4fdosJyfCmnN8quyUTHxQwZoJmRxC.png", "team": false, "uuid": "069b70d2bd1c419693106844aa9a89c3", "username": "zjsxzc217"}, "thumb": "//image.lceda.cn/pullimage/vIJaZGaQy2Mr6oSwTRgwMY3u9587uXIUrnOItBgi.jpeg", "origin": "std", "count": {"fork": 559, "star": 875, "like": 374, "watch": 0, "views": 95275}, "created_at": "2021-12-11T12:42:08.000Z", "uuid": "766b89cd189e4f6eb068ec10a97a85d9", "path": "zjsxzc217/simplefoc_-tai-gong-shuai-shuang-tong-dao", "public": true, "updated_at": "2026-01-20T04:26:51.000Z", "members": ["069b70d2bd1c419693106844aa9a89c3"], "grade": 4, "publish": true, "name": "SIMPLEFOC_无刷电机大功率双通道驱动(已验证)", "oshwhub_publish_at": "2022-07-28T12:48:19.000Z", "introduction": "应该是市面上最便宜的方案吧\n双路大功率无刷直流电机驱动\n支持arduino,esp32,esp8266,stm32等~\n支持simplefoc", "comments_count": 118} +{"owner": {"nickname": "小煜哥哥", "avatar": "//image.lceda.cn/avatars/2021/4/OciqdD9mfqz61bOfeKLNZqf44U4j5OcjtAIUzjvQ.png", "team": false, "uuid": "67f4ab719a2a4182934deee8cc979e93", "username": "wzw666"}, "thumb": "//image.lceda.cn/avatars/2021/10/GzDiNwDZSinZ1pfr44sY5cLLFIK0CGAKHSMmMJkK.png", "origin": "std", "count": {"fork": 341, "star": 778, "like": 368, "watch": 0, "views": 121491}, "created_at": "2021-09-09T10:36:14.000Z", "uuid": "48dd1b650d084739bef92ab8a651975a", "tags": [], "path": "wzw666/ip5389", "public": true, "updated_at": "2026-04-15T05:31:09.000Z", "members": ["67f4ab719a2a4182934deee8cc979e93"], "grade": 3, "publish": true, "name": "IP5389[100瓦双向快充移动电源方案]", "oshwhub_publish_at": "2022-09-13T01:15:55.000Z", "introduction": "100瓦双向快充移动电源方案", "comments_count": 205} +{"owner": {"nickname": "muyan2020", "avatar": "//image.lceda.cn/avatars/2021/12/OFgZ4jqmuWLnKxmLMmX6NQYVE4sEq8FAzbsslvMr.png", "team": false, "uuid": "804c0f147cb643f5924aa521873103a2", "username": "muyan2020"}, "thumb": "//image.lceda.cn/pullimage/sCcc8ioGwVkAUqcYR0XUhzEkkIiAcXkAP2Q7rMws.jpeg", "origin": "std", "count": {"fork": 481, "star": 639, "like": 316, "watch": 0, "views": 113514}, "created_at": "2022-09-01T02:07:50.000Z", "uuid": "13f634be49f647319760111c0f7474fa", "tags": [], "path": "muyan2020/wei-yan-zheng-esp32-guang-fu-pv-mppt-ina226_copy_copy_copy_copy_copy", "public": true, "updated_at": "2025-03-15T13:47:26.000Z", "members": ["804c0f147cb643f5924aa521873103a2"], "grade": 4, "publish": true, "name": "ESP32升降压光伏MPPT+数字可调电源", "oshwhub_publish_at": "2023-08-23T08:48:55.000Z", "introduction": "本方案从MPPT降压版本的基础上修改,支持降压或者升压,通过板载开关及使用专用的程序对升降压进行切换", "comments_count": 172} +{"owner": {"nickname": "酷电科技馆", "avatar": "//image.lceda.cn/pullimage/B9j4MGOeIoy2Z1raVLGY3zE33zuSN4rvpcKgAO0W.png", "team": true, "uuid": "1a209b6e71d9418b95d7ffe9e2e14b1f", "username": "eda_sbnvoqqej"}, "thumb": "//image.lceda.cn/oshwhub/332fcccb25b74f399d86a695f3334304.png", "origin": "std", "count": {"fork": 573, "star": 892, "like": 292, "watch": 0, "views": 71178}, "created_at": "2020-03-26T05:52:33.000Z", "uuid": "3bec6b84391a4004b115d7d4f1a2e193", "tags": [], "path": "eda_sbnvoqqej/kai-yuan-si-zhou-yao-kong-qi", "public": true, "updated_at": "2026-02-02T12:11:41.000Z", "members": ["4648a6dfffbf4ad1b60679516b836c88"], "grade": 3, "publish": true, "name": "【开源】STM32四轴遥控器", "oshwhub_publish_at": "2024-07-15T01:07:12.000Z", "introduction": "基于小马哥RoboFly开源四轴制作的四轴遥控器。", "comments_count": 188} +{"owner": {"nickname": "夏襄居士", "avatar": "//image.lceda.cn/avatars/2022/4/5Xuo1ohNLGqzl8Xht07I29r1BFqwmHYTufzLUa5l.png", "team": false, "uuid": "b3c7dee82f5b4c8cb0e631c4933af8b7", "username": "zhushengji"}, "thumb": "//image.lceda.cn/pullimage/cwNUVdKKMKru1Zm3GxRHOkVtJvPBbInHGOebLFTD.jpeg", "origin": "std", "count": {"fork": 197, "star": 944, "like": 485, "watch": 0, "views": 79332}, "created_at": "2022-10-10T08:54:32.000Z", "uuid": "929b16138f744f498c55840a87c141be", "path": "zhushengji/er-dai-dan-ci-ka", "public": true, "updated_at": "2026-01-21T05:43:36.000Z", "members": ["b3c7dee82f5b4c8cb0e631c4933af8b7"], "grade": 4, "publish": true, "name": "二代单词卡--萤囊", "oshwhub_publish_at": "2023-07-03T03:23:54.000Z", "introduction": "二代单词卡来啦!增加了许多新特性哦!", "comments_count": 182} +{"owner": {"nickname": "矛盾聚合体", "avatar": "//image.lceda.cn/avatars/2021/6/yI1FFeyY61T7hiUaI0pKxEU989MmpkefZAEvw8Np.png", "team": false, "uuid": "b2b6f77150214141b9e14701d6b5e346", "username": "Knight_Sin"}, "thumb": "//image.lceda.cn/pullimage/ZDwFwoCTQXaqPb9zWKAcMGQrrSHR23mnSBw2BOcX.jpeg", "origin": "std", "count": {"fork": 699, "star": 692, "like": 269, "watch": 0, "views": 90414}, "created_at": "2021-06-01T13:06:05.000Z", "uuid": "d9c172442b774ab9bd740f730d5458d9", "tags": [], "path": "Knight_Sin/abcd_copy_copy_copy_copy_copy", "public": true, "updated_at": "2024-11-21T16:23:11.000Z", "members": ["b2b6f77150214141b9e14701d6b5e346"], "grade": 4, "publish": true, "name": "【FOC】无刷电机驱动器ODrive AP1.0-DRV8303版", "oshwhub_publish_at": "2022-02-24T08:21:24.000Z", "introduction": "【ART-Pi】无刷电机驱动器ODrive AP0.3的分支", "comments_count": 73} +{"owner": {"nickname": "左手DIY", "avatar": "//image.lceda.cn/pullimage/2ymtzow60zko6wfIpxAU5EcIu2MYhBtrboncyegl.jpeg", "team": false, "uuid": "de62e47bf33f45158f4fc792835838eb", "username": "zl4430"}, "thumb": "//image.lceda.cn/pullimage/kVn5PSaVguqoyJHRLrVBiqmm9y9mohfjeUNv97so.jpeg", "origin": "std", "count": {"fork": 281, "star": 799, "like": 373, "watch": 0, "views": 103656}, "created_at": "2021-11-24T03:06:48.000Z", "uuid": "d53cd4f3355c45319a36b19cc9ff252e", "path": "zl4430/mpu-6500-280", "public": true, "updated_at": "2025-12-19T00:37:21.000Z", "members": ["de62e47bf33f45158f4fc792835838eb"], "grade": 4, "publish": true, "name": "STM F405飞控 bf inav 穿越机 固定翼飞控", "oshwhub_publish_at": "2023-11-13T08:19:05.000Z", "introduction": "F405飞控,MPU6500陀螺仪,低成本。20、30孔双版本。PCB文件在附件,bf、inav地面站接USB线刷固件。自动返航测试视频https://b23.tv/GcbdOsY", "comments_count": 173} +{"owner": {"nickname": "Kirito", "avatar": "//image.lceda.cn/avatars/2020/3/PuriJwVksBFdJoTZsYiAfSnm4HReUHqJJA7yzmqm.jpeg", "team": false, "uuid": "3dc72a434ae74b968d0478d4a9c8724f", "username": "Kirito"}, "thumb": "//image.lceda.cn/pullimage/WDKmS7oYUTlDqB4LJ1kZrmEsw8XL4ctqfN9ROn5q.jpeg", "origin": "std", "count": {"fork": 481, "star": 801, "like": 325, "watch": 0, "views": 94216}, "created_at": "2020-05-16T15:07:18.000Z", "uuid": "a76c7d50a6c345628eae36dfa7d40541", "tags": [], "path": "Kirito/dian-sai-shen-qi-FPGA-STM32kai-f", "public": true, "updated_at": "2026-02-04T15:02:47.000Z", "members": ["3dc72a434ae74b968d0478d4a9c8724f"], "grade": 4, "publish": true, "name": "电赛神器:FPGA+STM32开发板", "oshwhub_publish_at": "2022-07-18T14:13:46.000Z", "introduction": "本设计为FPGA+STM32开发板,可处理高速信号,带8bit并行高速AD/DA,满足电赛信号类题目设计需要。", "comments_count": 81} +{"owner": {"nickname": "Kirito", "avatar": "//image.lceda.cn/avatars/2020/3/PuriJwVksBFdJoTZsYiAfSnm4HReUHqJJA7yzmqm.jpeg", "team": false, "uuid": "3dc72a434ae74b968d0478d4a9c8724f", "username": "Kirito"}, "thumb": "//image.lceda.cn/pullimage/k50OonL2mnyuvO11hkTcXaehnWoD76WFjPljTOVi.jpeg", "origin": "std", "count": {"fork": 290, "star": 808, "like": 388, "watch": 0, "views": 80860}, "created_at": "2021-10-01T04:09:54.000Z", "uuid": "4f06b185aae542eb94497acef0a9144b", "tags": [], "path": "Kirito/usb3-0-wang-ka-rtl8153b", "public": true, "updated_at": "2025-12-19T01:09:08.000Z", "members": ["3dc72a434ae74b968d0478d4a9c8724f"], "grade": 3, "publish": true, "name": "USB3.0千兆网卡-RTL8153B", "oshwhub_publish_at": "2022-07-21T07:48:13.000Z", "introduction": "这是基于RTL8153B的千兆USB网卡。", "comments_count": 240} +{"owner": {"nickname": "酷电科技馆", "avatar": "//image.lceda.cn/pullimage/B9j4MGOeIoy2Z1raVLGY3zE33zuSN4rvpcKgAO0W.png", "team": true, "uuid": "1a209b6e71d9418b95d7ffe9e2e14b1f", "username": "eda_sbnvoqqej"}, "thumb": "//image.lceda.cn/oshwhub/4215592dcecf453aa7e6b38b3481687b.jpg", "origin": "std", "count": {"fork": 454, "star": 916, "like": 329, "watch": 0, "views": 60195}, "created_at": "2022-08-11T12:11:42.000Z", "uuid": "aa6f9628c70d4b208e10a6734cd0fc02", "tags": [], "path": "eda_sbnvoqqej/kai-yuan-stm32-si-zhou-fei-xing-qi-xin-ban", "public": true, "updated_at": "2026-02-02T12:11:41.000Z", "members": ["4648a6dfffbf4ad1b60679516b836c88"], "grade": 3, "publish": true, "name": "【开源】KODOFly四轴飞行器", "oshwhub_publish_at": "2024-07-15T01:07:34.000Z", "introduction": "沁恒微CH32V103 RISC-V芯片为主控,基于 RT-Thread 系统的四轴飞行器", "comments_count": 210} +{"owner": {"nickname": "Aeromodeller", "avatar": "", "team": false, "uuid": "e8a5c199c7c54f5989d704a8f8e7eaa6", "username": "aeromodeller"}, "thumb": "//image.lceda.cn/pullimage/DdYgeOd2X0egqLY0Jc4jCHe6Spyj4PfNrPEqmmHk.jpeg", "origin": "std", "count": {"fork": 198, "star": 1117, "like": 481, "watch": 0, "views": 57303}, "created_at": "2022-11-11T02:32:04.000Z", "uuid": "b38847543af34f64bd034e24c94c130e", "path": "aeromodeller/superuav", "public": true, "updated_at": "2026-03-11T09:15:59.000Z", "members": ["e8a5c199c7c54f5989d704a8f8e7eaa6"], "grade": 4, "publish": true, "name": "SuperUAV", "oshwhub_publish_at": "2022-12-05T01:04:40.000Z", "introduction": "SUAV开源四轴无人机。不止是开源,从点灯开始,一步步手搓飞控,最终完美飞行。授人以鱼,更授人予渔。", "comments_count": 78} +{"owner": {"nickname": "fh001", "avatar": "//image.lceda.cn/avatars/2022/3/mQtfQu1MijCKxzQsLCRLlAqrdGua7X3dQVnCCQjL.png", "team": false, "uuid": "a7ac3462734d4c1cb878b165f31e4bcf", "username": "fh001"}, "thumb": "//image.lceda.cn/pullimage/4XStvdZIf6el4fygj1sXF9ewYI9WA0ms1V8L5inC.jpeg", "origin": "std", "count": {"fork": 203, "star": 806, "like": 409, "watch": 0, "views": 55697}, "created_at": "2022-02-25T06:54:27.000Z", "uuid": "ae88c322aff74ad3b1e9d5c403dfc4d4", "path": "fh001/usb-gong-shuai-ce-shi-yi", "public": true, "updated_at": "2025-04-25T11:22:35.000Z", "members": ["a7ac3462734d4c1cb878b165f31e4bcf"], "grade": 3, "publish": true, "name": "【毕设】USB功率测试仪", "oshwhub_publish_at": "2022-07-24T09:15:16.000Z", "introduction": "USB功率测试器,可测试目前几乎所有协议的快充,短时最高功率160W,长时间最大功率120W", "comments_count": 342} +{"owner": {"nickname": "cnwans", "avatar": "//image.lceda.cn/pullimage/h2ULoTRNxhuJrNu0TR8oMRodr8fBeT77LdQMYNwT.jpeg", "team": false, "uuid": "3487f85b25e8466a98c86f32e6f9315d", "username": "youi"}, "thumb": "//image.lceda.cn/pullimage/DiPddiHrzbLYEMB3Twl5qM0szhEeGOvojkc1X79a.jpeg", "origin": "std", "count": {"fork": 476, "star": 644, "like": 246, "watch": 0, "views": 78354}, "created_at": "2023-03-20T13:28:17.000Z", "uuid": "c19a4fc2119f4a44860ccb55ed171e8e", "path": "youi/P150C-Pro-D-shu-kong-dian-zi-fu-zai", "public": true, "updated_at": "2026-04-01T16:37:22.000Z", "members": ["3487f85b25e8466a98c86f32e6f9315d"], "grade": 3, "publish": true, "name": "P150C Pro-D数控电子负载 电池容量测试仪", "oshwhub_publish_at": "2025-06-26T01:41:28.000Z", "introduction": "P150C Pro-D系列直流恒流型数控电子负载是基于STC8H系列单片机为主控芯片开发而成,该产品支持±150V电压测量/15A电流测量/150W功率耗散,测量精度高达0.5%,并且支持多种测量模式", "comments_count": 268} diff --git a/docs/plans/oshwhub_batch50.md b/docs/plans/oshwhub_batch50.md new file mode 100644 index 0000000..77690f3 --- /dev/null +++ b/docs/plans/oshwhub_batch50.md @@ -0,0 +1,196 @@ +# oshwhub 扩抓批 50:执行计划 + +**创建**:2026-04-29 +**目标**:在已落库的 15 项(5 Pro + 10 Std)基础上,再抓 50 个高质量项目 +**候选清单**:`data/state/oshwhub_batch50_candidates.jsonl`(50 行) +**承接**:`docs/sources/oshwhub_listing_full.md`(全量索引盘点) + +--- + +## 1. 目标 + +- 把 corpus 从 15 项扩到 65 项,覆盖 Pro + Std + Pro 3.x + Pro 2.x 各形态 +- 在 LFS 1 TB 红线内,先做 ~3-4 GB 量级的中等规模验证 +- 结束后用 license 白名单评估这 50 项里有多少能进 Forge 投影 +- 暴露 ≥ top-5 才会出现的 corner case(例如:超大 Pro 项目、私有附件、跨账号 fork) + +**显式不做**:详情页全量扫描(19h 工作量,留待后续按 A 档全池一次性做);下游 KiCad 转换(Phase 3 还在做)。 + +--- + +## 2. 候选池筛选标准 + +数据源:`data/state/oshwhub_listing_full.jsonl`(33,695 项全量 listing 索引) + +**硬过滤**: +- `grade >= 3 AND like >= 10`(A 档) +- `uuid` 不在已抓 15 项内 + +**排序**:复合质量打分 +``` +score = like*3 + star + fork*2 + views/100 + comments_count*2 + grade*50 +``` + +**多样性约束**: +- 单作者上限 2 个项目(避免 `course-examples` / `45coll` 等高产账号占满) +- Pro / Std 25:25 平衡(Pro 是新平台增长焦点,Std 是 7 年质量积累) + +--- + +## 3. 选出的 50 项概况 + +| 维度 | 值 | +|---|---| +| 总数 | 50(25 Pro + 25 Std)| +| 唯一作者 | 43 | +| Max 单作者 | 2 | +| like 区间 | min=246 / median=554 / max=2137 | +| view 区间 | min=54k / median=117k / max=362k | +| grade 分布 | 4: 33 项, 3: 17 项 | + +**Pro 头部**(前 5):HelloWord-Keyboard 2137 likes / STM32 桌面宠物 / OV-Watch 智能手表 / mini 加热台 / ESP-SparkBot + +**Std 头部**(前 5):触摸调光雪花灯 1036 likes / 桌面可调电源 / 立创 EDA PCB 直尺 / 自平衡莱洛三角 / PN532 NFC + +完整名单见 `data/state/oshwhub_batch50_candidates.jsonl`。 + +--- + +## 4. 执行步骤 + +### Step 0 — 候选池冻结 ✅ + +`data/state/oshwhub_batch50_candidates.jsonl` 已生成,作为本次批的"事实档案"。后续就算重排序也以这份为准。 + +### Step 1 — 详情页抓 license(~5 min,QPS=0.5) + +只对这 50 项扫详情页,提取 license / 完整 attachments 列表 / 原始描述。 +不在这一步下载附件、不下源工程,**只是获取每项的 metadata 全集**。 + +```bash +PYTHONUNBUFFERED=1 uv run python -u -m crawlers.oshwhub \ + --uuids "$(jq -r .uuid data/state/oshwhub_batch50_candidates.jsonl | paste -sd,)" \ + --no-files \ + --out data/raw/oshwhub +``` + +> 目前 `crawl_one` 已经会落 metadata.json + description.md + cover;`--no-files` 跳过附件。 + +**预期产出**:50 个 `data/raw/oshwhub//metadata.json`,含 license 字段。 + +### Step 2 — license 分布盘点 + +写个一次性脚本读 50 份 metadata.json,统计 license 分布。**这一步只做盘点不做过滤**——按 CLAUDE.md "研究用、不分发" 原则,所有 license 都入库。下游 Forge 投影时再用白名单过滤。 + +```bash +uv run python - <<'EOF' +import json, glob, collections +licenses = collections.Counter() +for p in glob.glob("data/raw/oshwhub/*/metadata.json"): + m = json.load(open(p)) + if m["uuid"] in batch_50_uuids: + licenses[m.get("license") or ""] += 1 +print(licenses) +EOF +``` + +预期会有大量 NC-SA / GPL(参考已抓 5 Pro:5/5 都是 GPL/NC-SA)。 + +### Step 3 — Pro 子集预检 + 抓源(~30-60 min) + +25 个 Pro 项目里要先判 3.x vs 2.x(`branch_uuid` 是否 null),然后对应走 modern / legacy 路径: + +```bash +PYTHONUNBUFFERED=1 uv run python -u -m crawlers.oshwhub \ + --backfill-pro-source \ + --uuids "$(jq -r 'select(.origin=="pro") | .uuid' \ + data/state/oshwhub_batch50_candidates.jsonl | paste -sd,)" \ + --pro-cookie ~/.secrets/pro-lceda-cookie-header.txt +``` + +**时间预算**(已应用 chain replay sleep 优化,commit `1e06ba6`): +- 小型项目(chain ~10):~30s 各 +- 中型(chain ~30-50):~1-2 min 各 +- 大型(chain ~100+):~3-5 min 各 +- 超大(X86 量级 chain ~700):~3-5 min 各(CDN 部分降到 0.2s/req) + +按已抓 5 项观察,预期 25 项里: +- ~22 个 Pro 3.x(chain replay) +- ~3 个 Pro 2.x(plaintext dataStr) + +### Step 4 — Std 子集抓源(~30 min) + +```bash +PYTHONUNBUFFERED=1 uv run python -u -m crawlers.oshwhub \ + --backfill-source \ + --uuids "$(jq -r 'select(.origin=="std") | .uuid' \ + data/state/oshwhub_batch50_candidates.jsonl | paste -sd,)" +``` + +每项 ~30s(QPS=0.2 / 5s sleep × 几个 API 调用),25 项 ≈ 12-15 min。 + +### Step 5 — 附件下载(按需,可选) + +附件(Gerber / STEP / PDF / 视频)默认存 LFS,但视频占大头(之前 Phase 1 实测 mp4+qt 占 54%)。 +**建议加 `--skip-ext mp4,qt,mov`** 节省 30-50% 体积。 + +```bash +PYTHONUNBUFFERED=1 uv run python -u -m crawlers.oshwhub \ + --uuids "$(jq -r .uuid data/state/oshwhub_batch50_candidates.jsonl | paste -sd,)" \ + --out data/raw/oshwhub + # 注:当前 crawler 没有 --skip-ext 选项;要加得改 crawl_one;如果偷懒就先全抓再人工删 +``` + +> 这一步没那么紧迫,可以挪到 Step 3/4 完成后单独跑。 + +### Step 6 — 验收 + 记录 + +跑 `scripts/build_index.py` 重建 `projects.md`,更新 `log.md`,把统计信息写到 `docs/plans/oshwhub_batch50.md` 末尾"实施结果"段。 + +--- + +## 5. 资源预算 + +| 项 | 估算 | 备注 | +|---|---:|---| +| API 调用 | ~600 次 | 50 详情 + 25×3 Pro meta + 25 Std API + chain blobs | +| 时间 | **~1.5-2 小时** | 远低于之前估算的 19h(因为只 50 项 + sleep 优化)| +| 存储(源工程)| ~1.5 GB | Pro 平均 30 MB、Std 平均 15 MB | +| 存储(附件,估)| 2-3 GB | 含视频;不含视频估 1 GB | +| **总 LFS 增量** | **~3-4 GB** | 远低于现有 LFS 余量 | +| 网络下行 | ~4 GB | 大部分走 LFS | + +距离 200 GB"对象存储迁移决策点"还很远。 + +--- + +## 6. 风险与预案 + +| 风险 | 概率 | 影响 | 预案 | +|---|---|---|---| +| Pro cookie 过期半路 | 中 | 卡住 Pro 抓取 | 重抓 cookie;爬虫已有 `oshwhub_pro_failed.jsonl` 重试机制(**未实现**,现在失败只 stderr)| +| 单个 Pro 项目超大(X86 量级 ~500 MB) | 中 | LFS 单项膨胀 | 设置 size cap,超过 200 MB 跳过 + 记 state | +| license 全是 NC-SA → 下游 Forge 投影门槛低 | 高 | Forge 阶段才发现 | 提前在 Step 2 盘点;**本批不做过滤**,只入库 | +| 某个项目附件含 mp4 视频 → 附件总量爆炸 | 中 | 多消耗 1-2 GB LFS | 加 `--skip-ext mp4,qt,mov` 选项(需小改 crawler)| +| 抓 50 项过程中触发反爬 / 限流 | 低 | 中途中断 | 已有 5s/req QPS;如果触发,加 jitter;从中断点续 | + +--- + +## 7. 验收标准 + +- [ ] `data/raw/oshwhub/` 下新增 ≥ 45 个项目目录(允许 ≤ 5 项失败) +- [ ] 每个新增项目的 `metadata.json` 含 `license`、`source_format`、`source_path` +- [ ] Pro 25 项里 3.x / 2.x 分类正确(看 `source_format` 字段) +- [ ] LFS 增量 ≤ 5 GB +- [ ] `projects.md` 自动重建后包含新 50 项 +- [ ] log.md 顶部一条总结性日志 + +--- + +## 8. 后续 + +成功结束后的下一步候选: +1. **license 详情扫描全 A 档** —— 把 license 信息覆盖到 2,806 项 A 档候选池,为下一次扩抓提供过滤条件 +2. **扩抓批 200**(按 license 白名单 + 同样多样性策略) +3. **Pro 工程二进制图(IMAGE/)补抓** —— 当前的真实数据 gap,要不要补取决于下游需求 +4. **风控压测** —— 在某一批做并发提速试验,找 oshwhub / pro.lceda.cn 的限流真上限