基于Arduino与蓝牙的无线电压测量系统设计与实现

发布时间:2026/6/3 22:03:10

基于Arduino与蓝牙的无线电压测量系统设计与实现 1. 项目概述与核心价值搞电子的朋友手边最离不开的工具可能就是万用表了。无论是调试一个简单的LED电路还是排查复杂的嵌入式系统电源问题电压测量都是第一步。但不知道你有没有遇到过这样的尴尬设备装进了外壳或者被塞进了某个狭小的空间想测个电压表笔死活伸不进去又或者你想长时间监测一个电池的放电曲线总不能一直守在旁边盯着万用表屏幕看吧传统的有线测量方式在这种需要远程、非接触、集成化监控的场景下就显得有些力不从心了。这正是我动手做这个“基于Arduino与蓝牙模块的无线电压测量系统”的初衷。说白了它就是给你的万用表加了一双“无线翅膀”。核心思路非常直接用Arduino的模拟输入引脚ADC来读取电压但这个读数不再局限于本地串口监视器而是通过一个成本仅十几元的蓝牙模块实时地、无线地发送到你的手机上。你可以在几米甚至十几米外视蓝牙模块功率和环境而定用手机App轻松查看电压值甚至记录数据。这个方案特别适合嵌入式系统开发、物联网设备状态监控、电池管理系统BMS原型验证、以及教育演示等场景。它成本低廉核心部件百元内搞定易于复现并且为你打开了一扇窗将任何模拟量传感器温度、光照、压力等的数据无线化其底层逻辑都是相通的。2. 系统整体设计与核心思路拆解2.1 为什么选择“Arduino 蓝牙”这个组合在决定技术路线时我主要权衡了成本、复杂度、通用性和开发速度。市面上实现无线数据传输的方案很多比如Wi-FiESP8266/ESP32、LoRa、Zigbee甚至简单的433MHz射频模块。成本与易用性HC-05/06蓝牙模块价格极具优势且作为串口透传模块其用法与有线串口几乎无异对初学者极其友好。Arduino平台更是以丰富的库和庞大的社区著称能让你快速搭建原型避免在底层驱动上耗费过多时间。功耗与场景对于本项目描述的电压测量场景通常设备是就近供电如USB或被测电路本身对功耗不敏感。蓝牙的功耗虽然比LoRa高但远低于Wi-Fi且在手机直连的短距离监控场景下其连接稳定性和速率完全足够。开发效率整个系统的软件核心其实就是“ADC采样 - 数据处理 - 串口发送”。Arduino的analogRead()函数和Serial库已经帮我们完成了最复杂的工作。我们需要编写的逻辑非常简洁可以把精力集中在测量精度优化和用户体验上。因此“Arduino 蓝牙”组合在快速原型开发、教育学习、以及中短距离、低速率、点对点数据监控的需求中是一个平衡性绝佳的选择。2.2 系统架构与信号流整个系统的信号流可以清晰地分为三个环节信号调理环节前端被测的0-25V直流电压首先进入电压分压电路。这是一个由两个精密电阻构成的分压器其作用是将高电压按比例缩小到Arduino ADC可以安全读取的0-5V范围。这是保证系统安全和测量准确性的基石。数据采集与处理环节核心缩小后的电压信号送入Arduino的某个模拟输入引脚如A0。Arduino内部的10位ADC模数转换器将这个模拟电压值转换为一个0-1023之间的数字量。然后通过一个简单的换算公式实际电压 (ADC读数 / 1023.0) * 参考电压 * 分压比倒数将这个数字量还原为原始的被测电压值。无线传输与显示环节后端计算出的电压值通过Arduino的硬件串口或软件串口发送给连接的蓝牙模块。蓝牙模块将其转换为无线信号发射出去。手机端安装一个通用的“蓝牙串口”App如Serial Bluetooth Terminal搜索并配对蓝牙模块后就能建立一个虚拟的串口连接实时接收并显示Arduino发来的电压数据字符串。这个架构的妙处在于解耦测量、计算、传输、显示各司其职。你可以轻易地替换其中任何一个模块。比如把蓝牙模块换成Wi-Fi模块数据就能上传到云端把手机App换成自己编写的PC端程序就能实现数据记录和图表绘制。3. 核心硬件选型与电路设计详解3.1 Arduino控制器选型Nano的性价比之选原文提到了使用Arduino Nano这是一个非常务实的选择。相比UnoNano体积更小更适合集成到最终的作品中相比Mini等型号它又保留了标准的USB接口和CH340等常用USB转串口芯片烧录程序极其方便。其核心的ATmega328P芯片提供6路模拟输入A0-A5和10位ADC精度对于电压测量来说完全够用。注意如果你需要测量多路电压或者对采样速率有更高要求可以考虑Arduino Due12位ADC或ESP32高达18位ADC且自带蓝牙。但对于本入门项目Nano是成本和功能的最佳平衡点。3.2 蓝牙模块HC-05 vs HC-06这是最容易混淆的地方。市面上常见的廉价蓝牙串口模块主要是HC-05和HC-06。HC-05功能更全既可以作为从机Slave等待连接也可以作为主机Master主动搜索并连接其他设备。它支持AT命令模式方便你通过串口修改其名称、配对码、波特率等参数。引脚上通常有一个KEY引脚用于切换AT命令模式。HC-06只能作为从机。它更简单通常只有四个引脚VCC, GND, TXD, RXD。其参数如波特率一般在出厂时固定或需要通过特定的上电时序进入AT模式修改不如HC-05方便。对于本项目两者皆可因为我们的手机App是作为主机去连接模块的。但我强烈推荐使用HC-05理由是其可配置性强。你可能会遇到手机连接不稳定、数据传输乱码等问题这些问题很多时候可以通过调整蓝牙模块的通信波特率来解决而HC-05可以很方便地用AT命令修改。3.3 电压分压电路安全与精度的关键这是整个硬件设计的核心也是容易出错的地方。绝对不能将被测电压直接接到Arduino的模拟引脚Arduino的工作电压是5V某些型号3.3V模拟输入引脚能承受的电压上限就是VCC5V。超过此电压轻则读数不准重则永久损坏单片机。分压原理与计算 分压电路由两个电阻R1和R2串联组成。被测电压Vin加在R1和R2的两端而我们从R2两端取电压Vout送给Arduino。公式是Vout Vin * (R2 / (R1 R2))。我们的设计目标是当最大输入电压Vin_max 25V时Vout刚好等于5VArduino的ADC参考电压。同时为了减少对被测电路的影响流过分压电阻的电流不宜过大通常选择在毫安级别。计算示例 假设我们希望分压电路的输入阻抗R1R2大约在100kΩ左右这是一个对大多数电路影响都很小的值。 设定 Vout_max 5V, Vin_max 25V。 分压比 K Vout / Vin 5 / 25 0.2。 根据公式 K R2 / (R1 R2) 0.2。 令 R1 R2 100kΩ则可解得 R2 0.2 * 100kΩ 20kΩ R1 100kΩ - 20kΩ 80kΩ因此我们可以选择R180kΩR220kΩ的标准电阻。为了获得更好的精度和温度稳定性应选用1%精度的金属膜电阻。关于“电压传感器模块” 原文中提到的“voltage divider module”或“电压传感器模块”在电商平台上通常是一个蓝色的小板子上面集成了分压电阻常见比例是5:1即量程25V和滤波电容并引出了VCC、GND、S信号三个引脚。它本质就是一个封装好的分压电路使用起来非常方便避免了手工焊接和计算错误的麻烦。如果你追求快速搭建直接购买此类模块是明智之举。3.4 完整接线图与实操要点根据以上分析完整的接线方式如下电压分压模块/自制分压电路连接Arduino模块的VCC- Arduino的5V引脚为模块供电如果模块无源则此线不接。模块的GND- Arduino的GND引脚。模块的S或SIG信号输出 - Arduino的A0模拟输入引脚。HC-05蓝牙模块连接Arduino关键电平匹配与交叉连接。HC-05的VCC- Arduino的3.3V或5V引脚。请注意虽然很多HC-05模块标称支持3.3V-5V但为稳定起见接3.3V通常更安全能避免模块发热。接5V时务必确认模块支持5V逻辑电平。HC-05的GND- Arduino的GND。HC-05的RXD- Arduino的TX(Digital Pin 1)。模块要接收数据。HC-05的TXD- Arduino的RX(Digital Pin 0)。模块要发送数据。HC-05的KEY或EN引脚悬空或接高电平3.3V为正常工作模式如需进入AT命令模式则需要在模块上电前将此引脚接高电平。重要实操心得在连接蓝牙模块的TX/RX线时务必先断开Arduino与电脑的USB连接或者先将蓝牙模块的TX/RX线拔掉。因为Arduino的TX/RX引脚也用于与电脑的USB转串口通信同时连接蓝牙模块和USB线可能会导致串口信号冲突使Arduino无法正常上传程序。一个稳妥的做法是烧录程序时断开蓝牙模块的TX/RX线程序烧录完成后再接上进行无线测试。4. 软件实现与代码深度解析代码不仅仅是让系统跑起来的指令更是精度和稳定性的体现。下面我将逐段解析一个增强版的代码它比简单的analogRead和Serial.print包含了更多实用技巧。// 定义引脚和参数 const int voltageSensorPin A0; // 电压信号接入的模拟引脚 const float referenceVoltage 5.0; // Arduino ADC的参考电压通常是5V测量板载3.3V可提高精度 const int r1 80000; // 分压电阻R1阻值单位欧姆 const int r2 20000; // 分压电阻R2阻值单位欧姆 const float voltageDividerRatio r2 / (r1 r2); // 计算分压比 const int numSamples 10; // 滑动平均滤波的采样次数 void setup() { // 初始化串口通信用于调试和蓝牙传输 // 注意蓝牙模块的默认波特率通常是9600或115200需要匹配 Serial.begin(9600); // 如果你使用HC-05并修改了波特率这里需要相应更改例如 Serial.begin(38400); // 可选设置ADC参考电压为内部1.1V基准用于提高低电压测量精度高级用法 // analogReference(INTERNAL); // 此时 referenceVoltage 需改为 1.1 } void loop() { // 1. 采集多个样本进行滤波减少噪声 long sensorSum 0; for (int i 0; i numSamples; i) { sensorSum analogRead(voltageSensorPin); delay(1); // 短暂延时让ADC有足够时间稳定 } int sensorAverage sensorSum / numSamples; // 2. 将ADC读数转换为电压值分压前 // 公式Vin (ADC读数 / 1023) * 参考电压 / 分压比 float voltageAtPin (sensorAverage / 1023.0) * referenceVoltage; // 分压后的电压 float inputVoltage voltageAtPin / voltageDividerRatio; // 还原为被测电压 // 3. 可选软件校准。如果已知一个精确的输入电压如12V标准电源 // 可以计算出一个校准系数乘在结果上。例如 // float calibrationFactor 12.0 / measuredVoltage; // measuredVoltage是实际测量值 // inputVoltage * calibrationFactor; // 本示例中暂不启用。 // 4. 格式化和输出数据 // 通过硬件串口发送给蓝牙模块 Serial.print(Voltage: ); Serial.print(inputVoltage, 2); // 保留两位小数 Serial.println( V); // 5. 控制数据发送频率避免手机端数据刷新过快 delay(500); // 每500毫秒发送一次数据 }代码关键点解析滑动平均滤波直接读取一次ADC值 (analogRead) 很容易受到电源噪声或环境干扰的影响导致读数跳动。通过连续读取numSamples次这里设为10次然后取平均值可以有效地平滑数据使显示更稳定。这是提升用户体验最简单有效的方法。浮点数运算与精度在计算sensorAverage / 1023.0时使用1023.0浮点数而非1023整数至关重要。在C/C中整数相除会截断小数部分导致精度完全丢失。写成1023.0会强制进行浮点数除法。分压比计算在setup()函数外我们预先计算好了voltageDividerRatio。这是一个优化避免在每次loop()循环中都进行(float)r2 / (r1 r2)的浮点运算虽然对于Arduino来说这点开销微乎其微但体现了良好的编程习惯。输出格式化Serial.print(inputVoltage, 2)中的, 2指定了输出浮点数时保留两位小数。这对于电压测量来说通常是足够的精度。清晰的数据格式如Voltage: 12.34 V便于手机端App解析和显示。延时控制delay(500)控制了数据发送频率。太快如delay(10)会导致手机端数据刷屏看不清太慢则失去实时性。500ms是一个折中的选择适用于大多数监控场景。你也可以用millis()函数实现非阻塞的定时让系统能同时处理其他任务。5. 手机端配置与系统联调硬件连接好代码上传成功后就来到了最后一步让手机和你的设备“对话”。5.1 手机App的选择与配置在手机应用商店搜索“蓝牙串口”或“Serial Bluetooth Terminal”会有很多选择如Serial Bluetooth Terminal、Bluetooth Terminal等功能大同小异。选择一个评价好的即可。关键操作步骤如下给Arduino系统上电通过USB或外部电源。打开手机蓝牙设置搜索新设备。你应该能找到一个名为HC-05或HC-06的设备也可能是其他默认名。点击配对通常默认配对码是1234或0000。打开蓝牙串口App在App内选择“连接设备” - 选择你刚才配对的HC-05。连接成功后App的界面通常会从一个输入框和发送按钮变成一个持续滚动的数据接收区域。如果一切正常你应该会看到屏幕上每隔约0.5秒出现一行Voltage: xx.xx V的数据。5.2 系统校准与精度提升实践一个未经校准的系统其测量值可能和真实值存在偏差。这主要来源于Arduino的ADC参考电压误差标称5V实际可能是4.8V或5.1V。分压电阻的精度误差即使用1%的电阻也有±1%的偏差。ADC本身的非线性误差。校准方法强烈建议进行准备一个已知精确电压的源最好是用一台校准过的数字万用表测量过的稳压电源。例如输出一个精确的12.00V。将这个电压接入你的无线电压测量系统。观察手机App上显示的读数例如显示为12.35 V。计算校准系数校准系数 真实电压 / 测量显示电压 12.00 / 12.35 ≈ 0.97166。修改代码在计算最终inputVoltage后乘以这个系数float calibratedVoltage inputVoltage * 0.97166; Serial.print(Voltage: ); Serial.print(calibratedVoltage, 2); Serial.println( V);你可以在多个电压点如5V 10V 20V进行测量取一个平均的校准系数或者更高级地实现一个线性拟合。5.3 常见问题排查速查表在实际制作中你几乎一定会遇到一两个问题。下表整理了常见症状、原因和解决方法问题现象可能原因排查与解决方法手机搜索不到蓝牙设备1. 蓝牙模块未供电或损坏。2. 模块处于AT命令模式仅HC-05KEY引脚接高电平。3. 模块已与其他设备配对并连接。1. 检查VCC和GND连接用万用表测量模块电压。2. 确保KEY引脚悬空或接低电平正常工作模式。3. 尝试给模块断电再上电或使用AT命令恢复出厂设置。手机能配对但App无法连接1. 蓝牙模块与Arduino的串口波特率不匹配。2. App选择错误的服务或协议。1.最常见原因。尝试修改代码中Serial.begin()的波特率依次尝试9600, 19200, 38400, 57600, 115200。同时需要用AT命令将HC-05的波特率设置为相同值。2. 在App的设备列表里选择配对后的设备而不是重新搜索。App连接后收到乱码串口波特率严重不匹配。同上确保Arduino代码、蓝牙模块、手机App三者的波特率完全一致。9600和115200是最常用的。电压读数始终为0或接近01. 电压分压模块信号线S未接或接错。2. 分压模块损坏或输入电压为0。3. 代码中模拟引脚号定义错误。1. 检查A0引脚的连接。2. 用万用表直接测量分压模块的信号输出端对GND电压应在0-5V之间。3. 检查代码voltageSensorPin的定义。电压读数固定为一个很高的值如4.9V或跳动剧烈1. 模拟输入引脚悬空未接任何信号拾取到了噪声。2. 分压电路电阻值错误或开路导致信号线实际上等于接到了VCC。3. 电源噪声大。1. 确保信号线可靠连接。2. 检查分压电阻焊接或连接。3. 在分压电路的输出端接Arduino A0处到GND之间并联一个0.1uF的瓷片电容可以很好地滤除高频噪声。测量值比实际值偏大或偏小一个固定比例分压电阻的实际阻值与理论值有偏差。进行系统校准计算并应用校准系数见5.2节。上传代码时报错蓝牙模块的TX/RX线与Arduino的TX/RX0,1引脚冲突。烧录程序时务必拔掉蓝牙模块的TX和RX线这是新手最常踩的坑。6. 项目扩展与进阶思路这个无线电压表是一个完美的起点你可以基于它扩展出更多有趣和实用的功能多通道电压监测Arduino Nano有多个模拟输入引脚A0-A5。你可以接入多个分压电路同时监测不同点的电压如电池总电压、单节电压、负载电压等在代码中循环读取并发送数据格式可以改为V1:12.3, V2:3.7, V3:5.0。增加电流测量功能串联一个分流电阻Shunt Resistor测量电阻两端的微小压降根据欧姆定律I V_shunt / R_shunt计算电流。配合电压值甚至可以计算功率和估算电池容量。注意需要用到运放如INA219模块来放大微小电压信号。数据记录与可视化手机端简单的串口终端只能查看瞬时值。你可以编写一个简单的Android App使用MIT App Inventor或Android Studio将接收到的数据解析后实时绘制成电压-时间曲线图。让Arduino将数据通过蓝牙发送到手机手机App再通过Wi-Fi上传到云端数据库如ThingsBoard、Blynk或自建服务器实现远程网页监控和历史数据查询。低功耗优化如果用于电池供电的长期监测需要优化功耗。将Arduino的ADC参考电压设置为内部1.1V基准可以降低ADC模块功耗。使用sleep模式让Arduino大部分时间休眠定时唤醒进行测量和发送。考虑使用BLE低功耗蓝牙模块如HM-10替代经典的HC-05功耗可以降低一个数量级。外壳与集成使用3D打印或现成的塑料盒为你的系统制作一个外壳将Arduino、分压电路、蓝牙模块集成在一起引出标准的香蕉插孔或探针接口它就从一个实验原型变成了一个可以随手使用的工具。这个项目的真正价值在于它清晰地演示了“物理信号 - 模拟电信号 - 数字信号 - 无线数据 - 可视化信息”的完整物联网数据链。掌握了这个流程你就能举一反三将温度、湿度、光照、压力等任何传感器数据都“无线化”、“可视化”这才是嵌入式开发和物联网应用的魅力所在。

相关新闻