news 2026/8/19 6:10:21

ESP32多模态智能控制器:红外、蓝牙与电位器融合开发实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ESP32多模态智能控制器:红外、蓝牙与电位器融合开发实践

1. 项目概述:IR_bt_pot 是什么?

看到“IR_bt_pot”这个项目标题,很多硬件玩家和嵌入式开发者可能会心一笑。这看起来像是一个典型的“缝合怪”项目,把几个看似不相关的模块——红外(IR)、蓝牙(BT)和电位器(Potentiometer,简称Pot)——硬生生地组合在了一起。但恰恰是这种组合,揭示了一个非常经典且实用的嵌入式应用场景:通过多种输入方式(本地旋钮与远程遥控)来控制同一个输出设备(如LED灯)

简单来说,IR_bt_pot 项目的核心思想是构建一个多模态、混合输入的智能控制器。它允许用户:

  • 本地精细调节:通过旋转一个物理电位器(Pot),实时、线性地调整输出(比如LED的亮度或电机的速度)。
  • 远程无线控制:通过红外遥控器(IR)或手机蓝牙(BT)发送指令,进行开关、模式切换或预设值调节。

这个项目麻雀虽小,五脏俱全。它几乎涵盖了入门到进阶嵌入式开发的所有关键知识点:模拟信号采集(ADC)、数字通信协议(UART/SPI/I2C用于连接传感器模块)、红外编解码、蓝牙串口通信、PWM信号生成,以及最核心的多任务调度与状态机管理逻辑。无论你是想学习如何整合不同通信协议,还是想解决实际生活中“既想随手拧旋钮,又想躺床上用手机控制灯光”的需求,这个项目都是一个绝佳的练手模板。

从网络热词如“esp32-bt主从间如何设置”、“Serial Bluetooth Terminal”、“led闪灯驱动芯片”等可以看出,社区对如何使用ESP32等流行MCU实现蓝牙控制、串口调试以及PWM调光有着极高的关注度。IR_bt_pot项目正是对这些关注点的直接回应和综合实践。

2. 核心需求与方案选型解析

2.1 需求拆解:为什么是IR、BT和Pot?

一个优秀的项目始于清晰的需求分析。IR_bt_pot并非简单堆砌技术,其背后有明确的用户体验和功能考量:

  1. 电位器(Pot) - 提供直觉与精准的本地控制

    • 需求:在设备旁边进行快速、无延迟、线性且连续的调节。调节灯光亮度、音箱音量时,旋钮带来的物理反馈和精确度是无可替代的。
    • 优势:零学习成本,操作直接,反馈即时。它代表了模拟、连续的输入方式。
  2. 蓝牙(BT) - 实现智能与远程交互

    • 需求:在数米到数十米范围内,通过智能手机(一个人人拥有的强大终端)进行控制。可以实现复杂功能,如模式切换(阅读模式、影院模式)、色彩选择(如果是RGB LED)、定时开关等。
    • 优势:连接稳定,带宽足够,可开发功能丰富的自定义App或使用通用串口调试助手快速原型开发。它代表了数字、远程、可编程的输入方式。
  3. 红外(IR) - 保留传统与备用通道

    • 需求:提供一种标准化、低成本的备用遥控方式。家里旧的遥控器、万能遥控器都可以复用。在蓝牙连接不稳定或手机没电时,红外是一个可靠的备份。
    • 优势:技术成熟,成本极低,方向性强(有一定私密性),功耗低。它代表了数字、点对点、标准化的输入方式。

将三者融合的核心逻辑在于“冗余”和“场景覆盖”。不同场景下用户偏好不同的交互方式,一个好的产品应该提供选择,而不是强迫用户适应单一交互。

2.2 主控芯片选型:为什么是ESP32?

网络热词中“esp32”、“8266”频繁出现,这已经指明了社区的选择方向。对于IR_bt_pot项目,ESP32几乎是目前的最优解:

  • 集成蓝牙与Wi-Fi:原生支持蓝牙4.2(BR/EDR和BLE),省去了外接蓝牙模块的麻烦和成本。Wi-Fi虽本项目未使用,但为未来升级(如接入物联网平台)预留了可能。
  • 强大的处理能力与丰富外设:双核处理器足以流畅处理多任务;内置ADC用于读取电位器电压;多个硬件PWM通道可用于无抖动调光;丰富的GPIO和UART、I2C等接口方便连接红外接收头等传感器。
  • 完善的生态与社区支持:无论是Arduino Core for ESP32,还是乐鑫官方的ESP-IDF,都有海量的库和示例,特别是对于蓝牙串口(Serial Bluetooth)和红外遥控(如IRremoteESP8266库也支持ESP32)的支持非常成熟。
  • 成本与易用性平衡:价格低廉,开发板(如ESP32-DevKitC)易于获取,引脚布局友好。

备选方案对比

  • STM32系列:性能强大,外设精准,但在蓝牙功能上通常需要外接模块(如HC-05/06),增加了复杂性和成本。更适合对蓝牙性能要求不高或已有蓝牙模块存货的情况。
  • Arduino Uno + 蓝牙/红外模块:最经典的入门组合,但性能有限,难以处理复杂的多任务协调,PWM精度和通道数也可能不足。

实操心得:对于初学者,强烈建议从ESP32开发板 + Arduino框架开始。它极大地降低了开发门槛,让你能快速聚焦于业务逻辑(如何整合三种输入),而非底层驱动调试。当你对系统有更深理解后,可以迁移到ESP-IDF以追求更优的性能和功耗控制。

2.3 其他关键组件选型

  1. 电位器:选用一个10kΩ线性电位器即可。这是最通用的阻值,与ESP32的ADC输入阻抗匹配良好,能提供足够的电压变化范围。注意引脚顺序:两端接3.3V和GND,中间脚(滑片)接ESP32的ADC引脚(如GPIO34)。
  2. 红外接收头VS1838BHS0038是常见型号。它们工作在38kHz,兼容绝大多数民用红外协议(NEC、Sony、RC5等)。只需连接VCC(3.3V)、GND和数据线(接ESP32的任意GPIO,如GPIO35)。
  3. LED及其驱动:根据LED功率选择驱动方案。
    • 小功率LED(如5mm草帽灯):直接通过一个限流电阻(如220Ω)连接到ESP32的PWM引脚(如GPIO2)。ESP32的PWM分辨率可设置得很高(如16位),实现65536级调光,非常平滑。
    • 大功率LED或灯带必须使用MOSFET或恒流驱动芯片。例如,用一个IRF520 MOSFET模块,ESP32的PWM引脚连接模块信号输入,模块输出控制LED的负极。这是网络热词中“led闪灯驱动芯片”的典型应用场景。
  4. 蓝牙交互端:无需专门开发App。使用手机上的Serial Bluetooth Terminal(热词中提及)这类通用App,即可通过蓝牙串口协议(SPP)向ESP32发送自定义指令(如“ON”、“OFF”、“BRIGHT 50”),快速实现原型验证。

3. 系统架构与核心逻辑设计

3.1 硬件系统框图与连接

一个清晰的硬件连接是成功的基石。以下是基于ESP32的核心连接示意图(文字描述):

[ESP32 DevKitC V4] | |-- GPIO34 (ADC1_CH6) --> 电位器滑片 (中间引脚) | 电位器一端 --> 3.3V | 电位器另一端 --> GND | |-- GPIO35 (任意输入GPIO) --> 红外接收头数据脚 | 红外接收头VCC --> 3.3V | 红外接收头GND --> GND | |-- GPIO2 (PWM输出) --> LED限流电阻 -> LED阳极 | LED阴极 --> GND | (若驱动大功率LED,则 GPIO2 -> MOSFET模块信号IN -> LED- -> GND) | |-- 蓝牙:内置,无需外接。使用SerialBT库进行通信。 | |-- USB:供电与程序烧写。

电源注意事项:当驱动多个LED或使用电机时,切勿完全依赖USB供电。USB端口通常只能提供500mA电流。务必为驱动部分(如LED灯带)准备独立的外部电源(如5V/2A适配器),并将外部电源地与ESP32的GND相连。

3.2 软件状态机与优先级设计

这是项目的软件核心。三种输入源可能同时产生信号,系统必须决定“听谁的”以及“如何无冲突地执行”。

1. 输入解析层

  • 电位器:通过analogRead()周期性地(如每50ms)读取ADC值,映射到目标输出范围(如0-255的PWM占空比)。需要加入软件滤波(如滑动平均滤波)以消除旋钮抖动和ADC噪声。
  • 红外遥控:使用中断驱动。当红外接收头引脚产生下降沿中断时,在中断服务程序(ISR)中标记“有红外信号到达”,然后在主循环中调用红外库进行解码,获取具体的按键命令。
  • 蓝牙串口:使用SerialBT.available()轮询接收数据。解析接收到的字符串指令,如SET 128MODE 1等。

2. 指令融合与冲突解决策略(核心逻辑): 不能简单地让最后接收到的指令覆盖一切。我们需要一个更智能的策略:

  • 设定“权威源”:可以定义蓝牙指令具有最高优先级,因为它可能来自一个复杂的自动化场景(如手机App定时开关)。当收到有效的蓝牙指令时,系统锁定当前输出状态,并暂时忽略电位器的变化(例如10秒内),直到锁定超时。这可以防止你正在用手机设置温馨灯光时,别人不小心碰到旋钮破坏了氛围。
  • 红外作为快捷键:红外指令可以设置为触发特定场景(如“一键最大亮度”、“一键关闭”),这些指令会立即生效,并可能覆盖当前电位器设置的值。
  • 电位器作为基础调节:当没有高优先级指令锁定时,电位器实时控制输出。一旦电位器被转动,系统退出“蓝牙锁定”状态,恢复本地控制。

3. 输出执行层

  • 根据最终确定的亮度值,通过ledcWrite()函数输出对应占空比的PWM信号。
  • 可以设计多种输出模式:单色调光、RGB色彩混合、呼吸灯效果等,由蓝牙或红外指令切换。

注意事项中断服务程序(ISR)内必须快速返回,绝对禁止进行复杂解码、调用delay()或执行Serial.print()。红外解码这类稍耗时的操作,应在ISR中仅设置标志位,在主循环中处理。这是嵌入式开发中常见的坑。

3.3 关键代码结构示例

以下是基于Arduino框架的核心逻辑伪代码/结构,展示了如何组织多输入处理:

#include <Arduino.h> #include <BluetoothSerial.h> #include <IRremoteESP8266.h> #include <IRrecv.h> BluetoothSerial SerialBT; IRrecv irrecv(IR_RECV_PIN); decode_results irResults; // 状态变量 uint16_t currentBrightness = 0; // 当前亮度 uint32_t btLockUntil = 0; // 蓝牙指令锁定截止时间 uint8_t outputMode = 0; // 输出模式 // 滤波用 const int potSamples = 10; int potReadings[potSamples]; int potIndex = 0; long potTotal = 0; void setup() { Serial.begin(115200); SerialBT.begin("IR_BT_POT_Controller"); // 蓝牙设备名称 irrecv.enableIRIn(); // 启动红外接收 // 初始化PWM通道 ledcSetup(LEDC_CHANNEL, LEDC_BASE_FREQ, LEDC_RESOLUTION_BITS); ledcAttachPin(LED_PIN, LEDC_CHANNEL); // 初始化ADC引脚和滤波数组 for (int i = 0; i < potSamples; i++) { potReadings[i] = analogRead(POT_PIN); potTotal += potReadings[i]; } } void loop() { // 1. 处理蓝牙指令 (最高优先级) handleBluetooth(); // 2. 处理红外指令 handleIR(); // 3. 处理电位器输入 (条件性) handlePotentiometer(); // 4. 更新输出 updateLEDOutput(); delay(20); // 主循环延迟,控制采样率 } void handleBluetooth() { if (SerialBT.available()) { String command = SerialBT.readStringUntil('\n'); command.trim(); if (command.startsWith("BRIGHT")) { int val = command.substring(7).toInt(); val = constrain(val, 0, 255); currentBrightness = val; btLockUntil = millis() + 10000; // 锁定10秒内忽略电位器 SerialBT.println("OK: Brightness set to " + String(val)); } else if (command.equals("OFF")) { currentBrightness = 0; btLockUntil = millis() + 10000; } // ... 解析其他命令 } } void handleIR() { if (irrecv.decode(&irResults)) { uint32_t irCode = irResults.value; switch (irCode) { case 0xFFA25D: // 假设是CH-键的NEC码 currentBrightness = max(0, currentBrightness - 20); break; case 0xFF629D: // CH键 currentBrightness = min(255, currentBrightness + 20); break; case 0xFFE21D: // 播放/暂停键,一键开关 currentBrightness = (currentBrightness > 0) ? 0 : 150; break; } irrecv.resume(); // 准备接收下一个红外信号 } } void handlePotentiometer() { // 如果被蓝牙指令锁定,则忽略电位器 if (millis() < btLockUntil) { return; } // 滑动平均滤波读取电位器 potTotal = potTotal - potReadings[potIndex]; int rawReading = analogRead(POT_PIN); potReadings[potIndex] = rawReading; potTotal = potTotal + rawReading; potIndex = (potIndex + 1) % potSamples; int filteredValue = potTotal / potSamples; // 将ADC值(如0-4095)映射到亮度值(0-255) currentBrightness = map(filteredValue, 0, 4095, 0, 255); } void updateLEDOutput() { // 根据currentBrightness和outputMode,计算最终的PWM值 uint32_t pwmDuty = calculatePWM(currentBrightness, outputMode); ledcWrite(LEDC_CHANNEL, pwmDuty); }

4. 分步实现与调试细节

4.1 第一步:搭建基础硬件与测试

目标:确保每个硬件模块都能独立工作。

  1. 电位器与ADC

    • 按前述方法连接电位器。
    • 上传一个简单的ADC读取程序,在串口监视器中观察旋转电位器时数值的变化(0-4095)。检查数值变化是否平滑,有无跳变。
    • 常见问题:数值跳动剧烈。解决:在VCC和GND引脚靠近电位器处并联一个0.1uF的陶瓷电容,并在代码中加入软件滤波(如上面示例的滑动平均滤波)。
  2. 红外接收

    • 连接红外接收头。
    • 使用IRremoteESP8266库中的示例代码IRrecvDumpV2。上传后,打开串口监视器,用任意红外遥控器对准接收头按键,查看是否能正确解码出协议类型(如NEC)和按键码(如0xFFA25D)。记录下你常用按键的十六进制码,后续代码中会用到。
  3. 蓝牙串口

    • 无需硬件连接。在代码中初始化SerialBT
    • 手机下载“Serial Bluetooth Terminal”App,搜索并配对名为“IR_BT_POT_Controller”的设备。
    • 在Arduino代码中,添加SerialBT.println("Hello BT");,在手机App中查看是否收到消息。同时,在Arduino的串口监视器中,也应能看到手机App发送过来的内容。
  4. PWM驱动LED

    • 连接LED电路。
    • 使用ledcWrite()函数,写一个循环让亮度从0渐变到255再渐变回来,观察LED是否平滑调光,有无闪烁。
    • 驱动大功率LED:务必先断开LED与电源的连接,用万用表测量MOSFET模块的信号输入电压是否随PWM变化,确认逻辑正确后再接上LED,避免烧毁。

4.2 第二步:集成与多任务逻辑开发

目标:将三个输入模块的代码整合到同一个工程中,并实现优先级逻辑。

  1. 创建综合工程:将上述测试代码的关键部分合并。特别注意全局变量的定义库的头文件包含
  2. 实现状态机:按照“3.2 软件状态机”的设计,编写handleBluetooth(),handleIR(),handlePotentiometer()等函数。先从简单的“最后生效”策略开始,即无论哪个输入,都直接修改currentBrightness。让整个系统先跑起来。
  3. 添加冲突策略:在基础功能正常后,引入btLockUntil等变量,实现蓝牙指令锁定期间忽略电位器的功能。调试时,可以通过串口打印当前状态(如BT Locked: Yes/No)来验证逻辑。

4.3 第三步:功能优化与扩展

目标:提升用户体验和系统鲁棒性。

  1. 蓝牙协议设计:定义一套简洁的指令集,方便手机App(或通用串口终端)控制。
    • SET 200:设置亮度为200。
    • GET:返回当前亮度和模式。
    • MODE 1:切换到呼吸灯模式。
    • SAVE:保存当前设置到EEPROM(实现断电记忆)。
    • LOAD:从EEPROM加载设置。
  2. 红外协议兼容IRremoteESP8266库支持数十种协议。可以在代码中判断协议类型,使你的控制器能兼容更多遥控器。
  3. PWM频率与分辨率优化
    • 频率:对于LED调光,通常选择1kHz左右即可。频率太低(如100Hz)可能被人眼察觉闪烁;频率太高(如20kHz)可能超出某些驱动电路的响应能力,且增加ESP32的功耗。
    • 分辨率:ESP32的LEDC PWM分辨率最高可达16位(0-65535)。对于精细调光,可以设置为12位(0-4095)或更高。注意:分辨率越高,达到同一亮度所需的计数值也越大。
    // 示例:设置1kHz频率,12位分辨率 const int LEDC_FREQ = 1000; const int LEDC_RESOLUTION_BITS = 12; const int LEDC_MAX_DUTY = (1 << LEDC_RESOLUTION_BITS) - 1; // 4095 ledcSetup(LEDC_CHANNEL, LEDC_FREQ, LEDC_RESOLUTION_BITS);
  4. 引入EEPROM存储:使用Preferences库(ESP32专用,更可靠)或EEPROM库,保存用户最后设置的亮度、模式等。在setup()函数中读取并恢复。

5. 深度调试与故障排查实录

即使按照步骤操作,也难免会遇到问题。以下是基于真实项目经验的排查清单:

5.1 红外遥控完全无反应

  • 检查供电:红外接收头VCC是否接3.3V?GND是否共地?用万用表测量电压。
  • 检查数据线连接:确认连接到了正确的GPIO,并且在代码中使用了相同的引脚号。
  • 检查库与代码:是否安装了正确的IRremoteESP8266库?IRrecv对象初始化引脚是否正确?irrecv.enableIRIn()是否在setup()中被调用?
  • 环境干扰:强烈的日光、荧光灯都可能发出红外线干扰。尝试在较暗环境下测试,或给接收头套上一小段黑色热缩管以减少干扰。
  • 遥控器问题:用手机的摄像头(普通相机模式)对准遥控器发射管,按按键,看是否有白光闪烁。无闪烁则遥控器可能没电或损坏。

5.2 蓝牙无法连接或连接不稳定

  • 设备名冲突:确保在同一环境中没有其他同名的蓝牙设备。修改SerialBT.begin()中的设备名称。
  • 配对列表已满:手机或其他主机的蓝牙配对列表可能有数量限制,尝试删除旧的不再使用的设备。
  • 电源干扰:如果使用电机等大电流设备,可能对蓝牙射频造成干扰。确保电源部分有足够的滤波电容,或尝试用电池为ESP32单独供电测试。
  • 代码阻塞:如果主循环中有长时间的delay(),可能导致蓝牙栈无法及时响应,造成连接断开。将长延时改为非阻塞的定时方式(使用millis())。
  • 日志干扰:避免在loop()中频繁使用SerialBT.println()发送大量调试信息,这可能会堵塞蓝牙串口缓冲区。

5.3 LED闪烁、亮度不均或无法完全关闭

  • PWM频率问题:频率过低导致闪烁。尝试将PWM频率提高到500Hz或1kHz以上。
  • 共地问题:这是最容易被忽视的问题!确保ESP32的GND、LED驱动电源的GND、以及电位器的GND全部连接在一起,形成一个统一的参考地。任何地线间的电压差都会导致控制信号紊乱。
  • MOSFET驱动不足:如果使用MOSFET驱动大功率LED,确保ESP32的GPIO(3.3V)能完全打开MOSFET。有些MOSFET需要更高的栅极电压(Vgs)。选择逻辑电平MOSFET(Logic-Level MOSFET),如IRLZ44N,其在3.3V Vgs时就能有很低的导通电阻。
  • PWM信号毛刺:在ESP32的PWM输出引脚和MOSFET栅极之间串联一个100Ω左右的小电阻,可以减缓信号边沿,减少振铃和电磁干扰。

5.4 电位器控制不线性或有跳变

  • ADC参考电压噪声:ESP32的内部ADC参考电压有一定噪声。除了软件滤波,可以尝试:
    • 在代码中调用analogRead()多次取平均值(已实现)。
    • setup()中使用adcAttachPin()analogSetWidth()等函数进行配置(ESP32 Arduino Core提供)。
    • 如果要求极高,可以考虑使用外部ADC芯片,如ADS1115。
  • 电位器质量:劣质电位器阻值变化不线性,中间有跳动。更换一个质量好的多圈精密电位器体验会提升很多。
  • 供电电压不稳:如果给电位器供电的3.3V本身有波动,ADC读数自然不准。检查3.3V LDO的输出是否稳定,或在3.3V和GND之间加一个更大的滤波电容(如10uF电解电容并联0.1uF陶瓷电容)。

6. 项目进阶与扩展思路

当基础功能实现后,你可以将这个项目作为平台,进行更多有趣的扩展:

  1. Wi-Fi与物联网接入:ESP32自带Wi-Fi,可以轻松接入Home Assistant、MQTT服务器或自定义的Web服务器。这样,你就能通过网页、语音助手(集成到HomeKit/Google Home)来控制灯光了。
  2. 多路输出与RGB控制:将单路PWM扩展为三路(R, G, B),分别控制RGB LED灯带。电位器可以改为编码器,用来切换调节的对象(H色相、S饱和度、V亮度),蓝牙指令集也相应扩展。
  3. 添加传感器反馈:集成一个光照传感器(如BH1750),实现自动调光功能。当环境光变暗时,自动缓慢提升LED亮度,达到护眼目的。此时,电位器设置的目标亮度可能变为“最大允许亮度”。
  4. OTA无线升级:通过蓝牙或Wi-Fi实现固件的无线更新(OTA),以后修复bug或增加新功能,再也不用找USB线了。
  5. 低功耗优化:如果使用电池供电,可以设计休眠逻辑。当长时间没有蓝牙、红外或电位器操作时,系统进入深度睡眠,仅由电位器的旋转(通过外部中断唤醒)或红外信号唤醒。

这个项目从简单的模块拼装开始,但其内涵涉及了嵌入式系统设计的精髓:输入处理、决策逻辑、输出驱动、多协议兼容以及用户体验考量。完成它,你收获的不仅仅是一个能用的遥控灯,更是一套解决复杂问题的嵌入式开发方法论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 6:08:54

TLE9869电机控制开发全攻略:从官方文档到实战避坑指南

1. 项目缘起&#xff1a;从一块“网红”板卡说起最近在电子爱好者和嵌入式开发者的圈子里&#xff0c;TLE9869这块板子有点火。我申请到手后&#xff0c;第一反应和大多数人一样&#xff1a;赶紧找资料。但翻了一圈&#xff0c;发现相关资料虽然不少&#xff0c;却散落在数据手…

作者头像 李华
网站建设 2026/8/19 6:08:29

基于HC-SR04超声波传感器的低成本水位监测系统设计与实现

1. 项目概述&#xff1a;用SR04传感器打造一个靠谱的水位指示器如果你正在为家里的水塔、鱼缸或者花园的蓄水池的水位发愁&#xff0c;想随时知道还剩多少水&#xff0c;又不想花大价钱买成品&#xff0c;那这个项目就是为你准备的。今天要聊的&#xff0c;就是如何用一块常见的…

作者头像 李华
网站建设 2026/8/19 6:07:57

从手工到智能:万圣节骷髅装饰的创意设计与技术实现全攻略

1. 项目概述&#xff1a;从“万圣节骷髅”到创意表达的跨越每年十月末&#xff0c;当南瓜灯亮起&#xff0c;空气中弥漫着糖果和神秘的气息&#xff0c;一个经典的符号便会占据视觉的中心——骷髅。这个“Halloween Skull”项目&#xff0c;远不止是节日里的一次性装饰。它代表…

作者头像 李华
网站建设 2026/8/19 6:06:47

基于Arduino与MOSFET的DIY真空贴片镊子设计与实现

1. 项目概述&#xff1a;为什么我们需要一台DIY的真空贴片镊子&#xff1f;如果你和我一样&#xff0c;经常在工作室里摆弄那些芝麻大小的贴片元件&#xff0c;比如0402甚至0201封装的电阻电容&#xff0c;或者那些引脚密得让人眼花的QFN芯片&#xff0c;那你一定对传统镊子又爱…

作者头像 李华
网站建设 2026/8/19 6:05:53

基于Arduino与蓝牙模块DIY智能开关:从硬件选型到代码实现

1. 项目概述&#xff1a;从零构建一个蓝牙智能开关如果你对智能家居感兴趣&#xff0c;但又觉得市面上的成品要么太贵、要么功能不灵活&#xff0c;那自己动手做一个绝对是性价比最高的选择。这个项目&#xff0c;就是用一块Arduino开发板、一个继电器模块和一个蓝牙模块&#…

作者头像 李华
网站建设 2026/8/19 6:05:35

运动物体检测:从帧差法到深度学习的实战演进

1. 从“会动的东西”到“运动物体检测”&#xff1a;一个被低估的计算机视觉基石 “Moving object”&#xff0c;翻译过来就是“运动物体”。这个词听起来简单得甚至有些幼稚&#xff0c;就像小孩子指着窗外说“看&#xff0c;那个东西在动”。但在计算机视觉和人工智能领域&am…

作者头像 李华