基于CircuitPython与BLE的智能振动腕带:从硬件选型到代码实现

news2026/5/15 18:36:29
1. 项目概述打造你的智能触觉腕上伴侣如果你和我一样经常被淹没在手机通知的海洋里或者在专注工作时完全忘记了时间那么这个项目可能就是为你量身定做的。今天我们来动手制作一个基于CircuitPython和蓝牙低功耗BLE的智能振动腕带。它不仅仅是一个简单的通知提醒器更是一个集成了视觉与触觉反馈的个性化可穿戴设备。这个腕带的核心功能非常直观当你的 iOS 设备iPhone 或 iPad收到新的通知时它会通过腕带上的微型振动电机给你一个私密的触觉提醒同时腕带上的一个 RGB LEDNeoPixel会亮起特定颜色让你一眼就能分辨出是哪个应用发来的消息——比如绿色代表短信橙色代表 YouTube。更妙的是它还能扮演一个“数字正念钟”的角色在每个整点通过独特的振动和灯光模式提醒你该休息一下站起来走走或者只是简单地意识到时间的流逝了。整个项目的硬件核心是Adafruit Feather nRF52840 Sense或其简化版 Express这是一块集成了强大 BLE 功能、多种传感器和 CircuitPython 原生支持的开发板。我们通过DRV2605L这颗专业的触觉电机驱动芯片来精准控制振动电机确保震感细腻可调而不是简单的“嗡嗡”乱震。外壳则通过 3D 打印实现使用柔性的 TPU 材料确保佩戴舒适。在接下来的内容里我不会只给你一堆代码和接线图。我会带你深入每个环节的背后逻辑为什么选择这些硬件代码中的状态机是如何优雅地管理通知和定时任务的如何根据你自己的需求定制功能以及我在实际制作和调试过程中踩过的那些坑和总结出的技巧。无论你是刚接触 CircuitPython 的爱好者还是想为下一个智能硬件项目寻找灵感的开发者这篇文章都将提供一条清晰的路径。2. 核心硬件选型与设计思路解析2.1 主控板为什么是 Adafruit Feather nRF52840这个项目的灵魂在于无线通信和易用性主控板的选择至关重要。我们选用Adafruit Feather nRF52840 Sense或Express版本主要基于以下几点考量原生 BLE 支持与 CircuitPython 亲和性nRF52840 是 Nordic 半导体推出的一款集成了 ARM Cortex-M4 内核和强大 BLE 5.0 射频的芯片。Adafruit 为其提供了深度优化的 CircuitPython 固件这意味着像adafruit_ble这样的蓝牙库可以开箱即用无需复杂的底层配置。对于快速原型开发来说这节省了大量时间。“Feather”生态系统的优势Feather 是 Adafruit 定义的一种硬件外形标准包含了标准的引脚排列、板载锂电池充电管理和 JST-PH 电池接口。这带来了两个巨大好处一是项目供电变得极其简单一块常见的 3.7V LiPo 电池即可二是其引脚布局是固定的我们的接线图具有很高的可复用性未来更换其他 Feather 主板也几乎无需修改硬件设计。Sense 版的额外馈赠如果你选择 Sense 版本那么板上还集成了加速度计、陀螺仪、磁力计、温湿度、气压、光线和手势传感器。虽然本项目核心代码未使用它们但这为功能扩展留下了巨大空间。例如你可以很容易地加入“拾腕亮屏”或基于动作的勿扰模式。USB-C 与 UF2 引导程序USB-C 接口提供了可靠的物理连接和供电/通信能力。更重要的是其搭载的 UF2 引导程序使得刷写 CircuitPython 固件如同拖放文件一样简单极大降低了入门门槛。实操心得在采购时如果仅为了实现基础的通知和正念功能Feather nRF52840 Express是更具性价比的选择。Sense 版多出的传感器在初期可能用不上。但如果你计划未来增加动作识别或环境感知功能一步到位选择 Sense 版会更省事。2.2 触觉反馈DRV2605L 驱动芯片的价值所在你可能会问为什么不直接用开发板的 GPIO 口驱动振动电机答案是体验和控制精度。普通的 GPIO 口只能输出“开”或“关”驱动电机产生的只能是单调、生硬的振动。DRV2605L是一颗专为触觉反馈设计的驱动芯片它的价值体现在内置效果库芯片内部固化了超过 100 种预定义的振动效果从“咔哒”、“砰砰”到“嗡嗡”、“脉冲”效果丰富。在代码中我们只需指定一个效果编号如vibration 16芯片就会自动复现出标准、一致的触感无需我们通过 PWM 去微调波形。自动谐振跟踪与超驱动微型振动电机ERM有其固有的谐振频率在此频率下振动最强、最省电。DRV2605L 可以自动检测并锁定这个最佳频率。同时它支持“超驱动”技术用短时高压快速启动电机达到更快的响应速度。更低的系统功耗与直接用 MCU 的 PWM 驱动相比DRV2605L 的驱动效率更高并且可以通过 I2C 接口完全关闭输出实现真正的零功耗待机这对于电池供电的可穿戴设备至关重要。在我们的项目中通过简单的 I2C 连接SDA, SCL我们就能用几行 CircuitPython 代码调用这些复杂的振动效果这是提升产品质感的“捷径”。2.3 整体系统架构与供电设计整个系统的数据流和电力流非常清晰数据流iOS 设备通过 BLE 将通知信息发送给 Feather nRF52840。Feather 上的 CircuitPython 程序解析通知提取应用 ID然后通过 I2C 总线命令 DRV2605L 播放特定振动效果同时直接控制板载 NeoPixel 显示对应颜色。电力流一块 3.7V、420mAh 的 LiPo 电池为整个系统供电。电池通过 JST 接口连接到 Feather 主板主板上的充电管理芯片可通过 USB 口为电池充电。Feather 主板上的 3.3V 稳压输出为 DRV2605L 和振动电机供电。滑动开关串联在电池和主板的EN使能引脚之间用于物理切断系统电源实现彻底关机避免电池在闲置时跑电。注意事项在选择电池时除了容量更要关注其最大放电速率C数。虽然本项目整体功耗不高但振动电机启动瞬间电流较大。一块标称 420mAh、放电能力在 1C 以上的电池就完全足够。切勿使用那些为蓝牙耳机设计的、放电能力极弱的“瘦长”型电池。3. 电路连接详解与焊接实操要点3.1 接线图与信号定义根据提供的资料我们需要进行以下连接。理解每一根线的作用能帮助你在调试时快速定位问题起点终点线色建议功能说明DRV2605LVINFeather3.3V红色为驱动芯片提供 3.3V 工作电压。务必接 3.3V而非 VUSB 或 BAT以防损坏芯片。DRV2605LGNDFeatherGND黑色共地为电路提供共同的参考零电位。DRV2605LSCLFeatherSCL黄色/绿色I2C 时钟信号线。DRV2605LSDAFeatherSDA蓝色/白色I2C 数据信号线。滑动开关引脚1FeatherGND黑色开关的一端接地。滑动开关引脚2FeatherEN橙色开关的另一端接使能引脚。开关闭合时EN脚接地主板断电。振动电机红线DRV2605LVCC红色电机正极接驱动芯片的输出正极。振动电机黑线DRV2605LGND黑色电机负极接驱动芯片的输出地。3.2 关键焊接与组装技巧使用硅胶排线资料中推荐的 10 芯硅胶排线是个好选择。它柔软、耐弯折非常适合可穿戴设备内部的紧凑布线。焊接前先用剥线钳或刀片小心地剥开一小段外皮再将内部每一根细导线的绝缘层烫开上锡。DRV2605L 的焊接这是一个 STEMMA QT / Qwiic 接口的模块本身带有防呆接口。但我们这里需要焊接排线。建议使用尖头烙铁温度设置在 320°C-350°C 之间使用细焊锡丝。焊点要小而圆润避免与旁边引脚发生桥接。焊接完成后用万用表通断档检查相邻引脚间是否短路。振动电机的处理微型振动电机的引线非常细极易扯断。焊接后建议在焊点处点一滴热熔胶或使用一小段热缩管进行加固以抵抗长期弯折的应力。开关的安装滑动开关需要精确地压入 3D 打印外壳的卡槽。在焊接开关引线之前最好先将开关试装到外壳上确认方向无误。开关的引脚间距通常为 2.54mm可以直接插在面包板上进行预焊接和测试。踩坑记录我第一次组装时将 DRV2605L 的VIN错误地接到了 Feather 的VUSB5V上。上电后芯片迅速发热幸好及时断电没有烧毁。牢记绝大多数 Adafruit 的传感器和驱动板其VIN引脚的工作电压范围是 3.3V接 5V 极易损坏。在焊接任何电源线之前用万用表确认一下电压总是个好习惯。4. 3D 打印外壳的制作与优化4.1 材料选择与打印参数外壳由三部分组成主体Case、上盖Cover和腕带Band/Strap。主体和上盖建议使用PLA 或 PETG材料。PLA 易于打印表面光滑PETG 强度更高有一定韧性。上盖最好使用白色或半透明的 PLA这样 NeoPixel 的光线可以柔和地透出形成均匀的灯效而不是一个刺眼的光点。腕带必须使用 TPU 等柔性材料。NinjaFlex 是很好的选择但其他品牌的 TPU 也可以。柔性材料保证了佩戴的舒适度和适应性能够贴合不同尺寸的手腕。关键打印设置对于 TPU 腕带打印速度务必放慢建议 20-30 mm/s。高速打印极易导致挤出不均或材料堆积。回抽Retraction必须关闭。TPU 材料弹性大回抽容易导致断料或喉管内堵塞。冷却风扇可以开启 50% 左右有助于桥接和悬垂部分成型但风力不宜过强以免影响层间粘合。热床温度40-60°C并涂抹胶棒或使用 PEI 钢板以增强附着力。对于 PLA/PETG 主体按照常规参数打印即可。建议使用 0.2mm 层高2-3 层壁厚10%-15% 的 Gyroid 或蜂窝状填充以在强度和重量间取得平衡。无需支撑模型设计时已考虑了打印友好性所有悬空角度都在可打印范围内。4.2 组装顺序与技巧先内后外首先将所有电子部件安装到主体外壳内。将 Feather 主板以一定角度放入利用外壳上的卡扣和凸起将其固定稳。将 DRV2605L 模块压入对应的立柱中。电机固定将振动电机放入其专属槽位确保其平整。可以使用电机自带的背胶或一点点双面胶将其粘牢防止其在振动时移位产生噪音。开关安装将滑动开关从外壳内侧向外推直到它“咔哒”一声卡入位。从外部拨动开关感觉其行程清晰、手感明确。布线管理在合盖之前仔细整理内部的连线。用扎带或一点点胶水将过长的线材固定在外壳的空隙处避免其干扰上盖的安装或未来与腕带发生摩擦。最后合盖将上盖对准主体四周均匀用力按压使其完全卡入。你应该听到一圈轻微的“咔嗒”声。如果某一边无法扣合不要强行按压检查是否有线材被夹住或卡扣未对齐。安装腕带将腕带和调节带穿过外壳上的环扣利用其自身的卡扣结构进行固定和长度调节。TPU 材料的弹性使得安装过程可能需要一些巧劲。5. CircuitPython 环境配置与核心代码深度解析5.1 固件烧录与库文件部署烧录 CircuitPython访问 circuitpython.org找到 Adafruit Feather nRF52840 Sense 的页面下载最新的.uf2固件文件。用 USB 数据线连接 Feather 和电脑。确保是数据线而非充电线。快速双击主板上的RESET按钮。板载 NeoPixel 会变绿电脑上会出现一个名为FTHRSNSBOOT或类似的U盘。将下载的.uf2文件拖入该U盘。U盘会自动弹出随后出现一个名为CIRCUITPY的新U盘表示刷写成功。安装必要的库文件在CIRCUITPY盘符下如果还没有lib文件夹就新建一个。从 CircuitPython 官网下载与固件版本匹配的“库文件包”Library Bundle。将以下.mpy文件或文件夹从压缩包中的lib文件夹复制到你的CIRCUITPY盘的lib文件夹里adafruit_bleadafruit_bluefruit_connectadafruit_led_animationadafruit_ble_apple_notification_center.mpyadafruit_ble_broadcastnet.mpyadafruit_drv2605.mpyadafruit_bus_device(文件夹)adafruit_register(文件夹)注意事项库文件必须与 CircuitPython 固件版本匹配否则可能导致无法导入模块的错误。如果遇到ImportError首先检查库文件版本。5.2 核心代码逻辑逐行解读让我们深入项目的主代码code.py理解其精妙之处。你可以用任何文本编辑器打开CIRCUITPY盘根目录下的code.py文件进行编辑。5.2.1 初始化与设置import time import board import busio import neopixel import adafruit_drv2605 import adafruit_led_animation.color as color import adafruit_ble from adafruit_ble.advertising.standard import SolicitServicesAdvertisement from adafruit_ble.services.standard import CurrentTimeService from adafruit_ble_apple_notification_center import AppleNotificationCenterService from digitalio import DigitalInOut, Direction这部分导入了所有必需的库。adafruit_ble_apple_notification_center是实现 iOS 通知转发的关键。# 状态机变量初始化 current_notification None # 当前正在处理的通知 current_notifications {} # 从 ANCS 获取的所有活动通知字典 cleared False # 标记通知是否已被全部清除 notification_service None # ANCS 服务连接对象 all_ids [] # 所有活动通知的 ID 列表 hour 0 # 用于触发正念提醒的小时数0代表每小时的0分 mindful False # 标记是否正处于“正念提醒”时段 vibration 16 # DRV2605L 使用的振动效果编号这里初始化了一系列状态变量。状态机是嵌入式程序处理复杂逻辑的常用模式它使程序逻辑清晰易于维护和扩展。例如mindful这个布尔变量就优雅地控制了整点提醒的触发与复位避免了重复触发。APP_COLORS { com.apple.MobileSMS: color.GREEN, # 短信 com.apple.mobilephone: color.GREEN, # 电话 com.apple.mobilemail: color.CYAN, # 邮件 com.burbn.instagram: color.MAGENTA, # Instagram # ... 可以继续添加 }APP_COLORS字典是项目的“个性化心脏”。键Key是 iOS 应用的Bundle Identifier值Value是对应的 NeoPixel 颜色。你可以通过查阅资料或使用一些工具来获取你常用应用的 Bundle ID并在这里添加和修改。5.2.2 BLE 连接与通知获取ble.start_advertising(advertisement)程序启动后立即开始广播 BLE 信号告知周围的 iOS 设备“我支持 ANCS 和 CurrentTimeService”。while not ble.connected: blue_led.value False pixel.fill(color.RED) pixel.show()这是一个等待连接的循环。未连接时蓝色 LED 熄灭NeoPixel 显示红色直观地提示用户设备处于待连接状态。连接建立后代码会执行connection.pair()进行配对这是访问 ANCS 服务所必需的。随后通过notification_service.active_notifications获取当前所有的活动通知列表。5.2.3 通知处理与反馈触发这是整个代码最核心的循环部分。它持续检查current_notifications字典。通知索引与更新代码通过比较current_notification.id和最新通知列表all_ids中的 ID来判断是否有新通知到达。这确保了只有真正的新通知才会触发振动和灯光。应用识别与颜色映射当新通知到达代码检查current_notification.app_id是否存在于APP_COLORS字典中。如果存在则notif_color被赋值为预设颜色如果不存在即未定义的应用则使用白色 (color.WHITE)。触发反馈vibe(2, vibration, 0.5)调用振动函数振动 2 次使用预设的vibration效果编号16每次振动间隔 0.5 秒。blink_pixel(2, 0.5, notif_color, color.BLACK)调用灯光闪烁函数闪烁 2 次间隔 0.5 秒在设定颜色和黑色熄灭之间切换。闪烁结束后NeoPixel 会常亮该颜色直到通知被清除。信息输出通知的详细信息ID、类别、应用、标题、消息等被打印到串行 REPL。这在调试时非常有用你可以通过 Mu 编辑器或screen/putty等终端工具查看具体是哪个应用发来了什么内容。5.2.4 整点正念提醒实现if cts.current_time[4] hour and not mindful:这行代码是正念提醒的触发器。cts.current_time是一个通过 BLE 从 iPhone 同步获取的时间元组其索引[4]对应的是“分钟”数。hour变量初始为 0。所以当 iPhone 的时间分钟数为 0即整点且mindful状态为False时条件触发。触发后它会调用vibe(5, vibration, 1)振动 5 次间隔 1 秒形成一种区别于通知提醒的、更舒缓的节奏。调用blink_pixel(5, 1, color.BLUE, color.BLACK)让 NeoPixel 闪烁蓝色光 5 次。将mindful状态设为True并让 NeoPixel 常亮蓝色持续一分钟。一分钟后当cts.current_time[4]变为 1即hour 1条件cts.current_time[4] (hour 1) and mindful满足系统将mindful重置为False并熄灭灯光等待下一个整点。代码优化建议如果你想将正念提醒改为每 30 分钟一次可以将条件改为cts.current_time[4] hour or cts.current_time[4] 30并相应调整状态管理逻辑防止在 30 分到 31 分之间重复触发。6. 调试、配对与高级使用技巧6.1 首次配对与常见问题排查确保 iPhone 蓝牙已打开并在系统设置 - 蓝牙中寻找名为 “CIRCUITPYxxxx” 或类似的可连接设备。点击进行配对。iPhone 可能会弹出配对码确认框点击“配对”即可。关键一步配对成功后务必进入 iPhone 的“设置”-“通知”找到“CircuitPython Bluetooth”或设备名确保“允许通知”开关是打开的。如果未开启腕带将无法收到任何通知。查看 REPL 输出使用 Mu 编辑器推荐或串口终端工具连接 Feather 的串口波特率 115200。你将看到“Waiting for connection”、“Connected”、“paired”等状态信息以及收到的通知详情。这是最重要的调试手段。常见问题速查表现象可能原因排查步骤手机搜不到设备1. 腕带未供电或开关关闭。2. 代码未运行或报错。3. 手机蓝牙未开或距离过远。1. 检查开关确认 NeoPixel 是否亮红灯等待连接。2. 查看 REPL 是否有错误信息。3. 重启手机蓝牙靠近设备。能连接但无振动/灯光1. 手机未允许通知权限。2.APP_COLORS中无对应应用。3. 电机或 LED 接线松动。1. 检查 iPhone 设置中该设备的通知权限。2. 发送一个已定义应用如短信的通知测试。3. 检查硬件连接在 REPL 中手动测试电机和 LED。振动/灯光一直触发1. 通知未被手机清除。2. BLE 连接不稳定反复重连。1. 清除手机通知中心。2. 查看 REPL确认连接状态是否频繁变化。正念提醒不工作1. 未成功获取手机时间服务。2. 时间同步有延迟。1. 确认代码中CurrentTimeService已正确导入和声明。2. 连接后等待一分钟查看 REPL 打印的cts.current_time是否正确。6.2 功能扩展与个性化定制增加更多应用识别如前所述扩充APP_COLORS字典是关键。你可以通过一些第三方工具或越狱设备查找应用的 Bundle ID也可以先在 REPL 中打印出notification.app_id直接获取你手机通知对应的 ID。自定义振动模式DRV2605L 库支持多种效果。查阅其库文档或数据手册可以找到效果编号列表。例如将vibration 16改为vibration 75你可能会得到一个完全不同的震感。你甚至可以编写复杂的振动序列。利用板载传感器仅 Sense 版你可以轻松导入adafruit_apds9960手势或adafruit_lsm6ds运动库。例如在循环中加入一个判断如果检测到快速挥手动作通过加速度计则主动清除当前通知将pixel.fill(color.BLACK)并重置状态。修改正念逻辑不仅仅是整点。你可以修改代码实现基于专注时间的提醒例如每 25 分钟振动一次模拟番茄钟或者根据气压传感器数据在天气变化时提醒你。6.3 功耗优化与续航提升本项目在连接状态下功耗主要由 BLE 射频、nRF52840 芯片和 NeoPixel 构成。为了延长电池续航降低 NeoPixel 亮度代码中brightness0.3已经做了降低。你可以尝试进一步调低如0.1在室内环境下通常足够。优化提醒频率在代码中可以添加一个“勿扰模式”逻辑。例如通过双击开关需接额外按键或特定手势设置一个变量在一段时间内屏蔽所有非重要应用如只允许电话的通知提醒。使用 Light SleepCircuitPython 的alarm模块支持轻睡眠。你可以改造代码在没有通知和未到整点时让主板进入轻睡眠仅由 BLE 射频部分监听连接这可以大幅降低平均功耗。但这需要更深入的编程和对 BLE 连接维护机制的理解。制作这个腕带的过程是一次将想法通过代码和硬件变为触手可及实物的完美体验。从最初的电路连接到 3D 打印件在手中成型再到最后手机与腕带成功配对、第一次感受到自定义的振动提醒——这种成就感是纯粹的。它不仅仅是一个工具更是一个可无限扩展的平台。当你戴着它每一次振动和色彩闪烁都是你与你自己创造的数字世界之间一次独特的、私密的交互。希望这个详细的指南能帮你顺利搭建起属于自己的智能腕上伴侣并激发你更多的创意。如果在制作中遇到任何问题回顾一下调试章节或者去相关的开发者社区分享你的进展那里总有热心人愿意和你一起解决难题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2615724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…