新闻详情

新闻详情

首页 / 资讯中心 / 详情

手机App通过蓝牙控制Arduino LED开关:从零到联调完整教程

发布时间:2026/9/16 2:18:48来源:尧图网络
手机App通过蓝牙控制Arduino LED开关:从零到联调完整教程
先说明一件事这个项目我前前后后给好几拨学生带过从大一新生到工作后想转嵌入式的人都有。别看它只是“手机App控制一个LED亮灭”但它把硬件接线、串口通信、无线传输、手机端界面开发这条路完整跑通了一遍。做完它你后续做远程开关、智能小车、传感器数据回传都有底子。今天这篇就围绕App Inventor 2 通过蓝牙控制 Arduino Uno LED 开关来写用到的是 HC-05 蓝牙模块HC-06 也兼容后文会说区别。我会把硬件选型、接线、Arduino 代码、蓝牙模块 AT 指令配置、手机端界面加逻辑块、到最后联调排错全流程走一遍。这个项目适合谁零基础想接触物联网的爱好者、做电子课程设计的同学、想给实验室或宿舍搞点小自动化但又不想碰复杂嵌入式开发的人。你只要会简单的 Arduino 编程、会拖拽积木块就能做出来。1. 项目拆解从点灯到物联网的完整链路1.1 这个项目解决的核心问题是什么表面上看就是“手机远程控制一盏 LED”但仔细拆一遍你会发现它解决的核心问题是“设备之间怎么建立通信协议”。手机上按下一个按钮这个动作信号要变成什么格式的数据、通过什么通道传出去、另一端收到之后怎么解析和执行这三个问题在任何一个物联网项目里都存在。LED 在这里扮演的是“受控执行器”的角色。它是最便宜、最简单、最不容易出错的执行器——你不需要考虑电机堵转、舵机过流、继电器打火这些乱七八糟的问题。把 LED 跑通了你会很清楚“无线数据从手机到引脚”这条链路长什么样。后面把 LED 换成继电器再接上电灯、水泵、风扇原理完全一样只是负载变了。1.2 技术选型背后的三个理由市面上实现无线控制 LED 的方案一大堆ESP8266 走 WiFi、NRF24L01 走 2.4G、甚至红外遥控也行。为什么偏偏选 App Inventor 2 蓝牙 Arduino Uno 这个组合第一个理由开发门槛低。App Inventor 2 是 MIT 出的图形化安卓开发平台不用写 Java拖拖拽拽就能出 APK。Arduino 端也就二十行代码。对于没系统学过编程的人这是最快能出成果的路线。第二个理由交互反馈直观。蓝牙是点对点通信手机端能实时知道“连上了”还是“断开了”数据发出去有没有成功心里有数。相比之下红外要对着发射、WiFi 要配网讲解和调试成本都高一大截。第三个理由成本极低。Arduino Uno 山寨板二十来块HC-05 模块十来块LED 和电阻几毛钱总成本控制在五十元以内。这比买一套现成的智能家居开发套件要便宜得多。1.3 一次点击背后的完整数据流从手指按到 LED 亮中间发生了什么我给初学者画过很多次这个流程手指点击 App 上的“开灯”按钮App 调用蓝牙发送函数把字符 1 通过 Android 蓝牙协议栈发出HC-05 蓝牙模块收到无线数据从 TX 引脚把字符 1 通过串口UART发给 ArduinoArduino 的串口接收缓冲区存下这个字符程序在循环里读到它判断字符是 1调用 digitalWrite 给 LED 引脚输出高电平LED 点亮反过来关灯就是发 0输出低电平LED 熄灭。整个数据链路是“App → 蓝牙空中传输 → 蓝牙模块串口 → Arduino 代码逻辑 → 引脚电平”。理解了这条链路后面任何一个环节出问题都能顺着它定位。2. 硬件准备与接线细节决定成败2.1 物料清单和替代方案先列一份我常用的清单都是常见件电子市场或者网上都能买到。物料型号/规格数量备注主控板Arduino Uno R3 兼容板1用 Nano 也可以接线逻辑相同蓝牙模块HC-05带底板1HC-06 也兼容但配置方式有差别LED5mm 普通发光二极管1颜色随意红色绿色都行电阻220Ω 或 330Ω1限流用防止烧 LED面包板400孔或800孔1方便接线不用焊接杜邦线公对公母对母若干最好多备几根手机Android 手机1iPhone 不支持 App Inventor 蓝牙这是硬伤下面会说如果你想直接控制家里的照明灯可以把 LED 换成一路继电器模块但注意 Arduino 的引脚电流驱动不了继电器线圈一定要用带光耦隔离的继电器模块不能直接用引脚去推。这个项目先老老实实用 LED别一上来就上强电。2.2 HC-05 和 HC-06到底选哪个这个问题几乎每次做项目都会有人问。长话短说HC-05 支持主从模式切换也就是它可以主动去连接别的蓝牙设备也能被连接HC-06 是纯粹的从机只能被手机连接。做手机控制 Arduino 这种项目两者都能胜任。但我在教学里强烈建议用 HC-05原因不是它有多强而是它带一个实体按键进入 AT 指令配置模式非常直观。HC-06 上电默认就是 AT 模式没有明显的状态指示新手经常搞不清楚当前到底在什么模式容易在配置时卡住。再加上 HC-05 的资料、教程数量是 HC-06 的几倍遇到问题容易搜到答案。对比项HC-05HC-06主从模式可配置主从都行固定从机进入 AT 模式方式按住按键上电或 KEY 引脚拉高上电即 AT 模式默认 AT 波特率38400部分版本 96009600状态灯快慢闪有明确区分指示较弱价格略贵几块钱便宜至于 HC-05 和 HC-06 的常见工作电压虽然模块本身逻辑是 3.3V但带底板的模块一般可以直接从 Arduino 的 5V 引脚取电板子上有稳压电路。只要确保模块底板丝印上写了“5V 输入”或者“支持 5V”直接接 5V 就行。2.3 接线实操与电平匹配这里有一个很容易踩的坑我先说结论推荐用 Arduino 的软串口接蓝牙模块不要用硬串口 D0/D1。很多人照旧教程把蓝牙模块直接接 D0/D1结果上传程序的时候要么报错、要么上传到一半失败折腾半天才发现是蓝牙模块占用了串口。用软串口可以把蓝牙模块放到 D8/D9和 USB 上传程序用的硬串口错开调试时省很多事。接线表如下HC-05 模块引脚Arduino Uno 引脚VCC5VGNDGNDTXDD8软串口 RXRXDD9软串口 TXLED 部分LED 长脚正极通过 220Ω 电阻接到 D13短脚负极直接接 GND。之所以选 D13是因为 Arduino Uno 板载也有一颗 LED 连在 D13代码写完之后即使外接 LED 没弄好也能通过板载 LED 确认程序逻辑是否正确。关于电平匹配很多人担心 HC-05 的 RXD 能不能直接接 Arduino 的 5V TX 引脚因为蓝牙模块核心逻辑是 3.3V。带底板的模块大多数已经把分压电路做进去了直接接就行。如果你用的是不带底板的裸模块稳妥起见在 Arduino D9 和模块 RXD 之间加一个 1kΩ 与 2kΩ 的分压把 5V 降到 3.3V 左右。2.4 供电要注意什么Arduino 用 USB 线接电脑供电时5V 引脚能提供的电流大约 500mA。一个 HC-05、一个 LED加起来不超过 100mA完全没有压力。但如果你后面想在这个基础上加舵机、加电机驱动、加 WIFI 模块就不要从 Arduino 的 5V 引脚硬取电了老老实实给负载单独供电共地即可。共地的意思是所有模块的 GND负极要接在一起这是电子系统里最容易忽略又最致命的问题。3. Arduino端固件让LED先学会听指令3.1 最简 LED 驱动电路初学者常纠结电阻怎么算。LED 正常工作时压降约 2VArduino 数字引脚输出高电平是 5V如果直接把 LED 接到引脚上电流会过大LED 很快就会烧掉。串一个电阻限流目标电流取 10mA 到 20mA 都安全。根据欧姆定律电阻 (5V - 2V) / 0.015A ≈ 200Ω。所以 220Ω 是最常见的取值330Ω 也完全没问题只是稍微暗一点。手边没有合适的180Ω、270Ω 也行不用太较真。3.2 串口控制代码Arduino 端用 SoftwareSerial 库来驱动软串口代码非常短。先把引脚定义好然后在 setup 里初始化串口最后在 loop 里不停检查有没有收到字符。#include SoftwareSerial.h SoftwareSerial btSerial(8, 9); // RX, TX接 HC-05 int ledPin 13; void setup() { pinMode(ledPin, OUTPUT); // 硬件串口接 USB用来输出调试信息 Serial.begin(9600); // 软串口接蓝牙模块 btSerial.begin(9600); } void loop() { if (btSerial.available()) { char cmd btSerial.read(); // 过滤掉换行回车避免干扰判断 if (cmd \n || cmd \r) { return; } if (cmd 1) { digitalWrite(ledPin, HIGH); Serial.println(LED ON); } else if (cmd 0) { digitalWrite(ledPin, LOW); Serial.println(LED OFF); } } }注意两个细节。第一btSerial 的 RX 是 D8TX 是 D9所以 HC-05 的 TX 接 D8、RX 接 D9。第二我在代码里过滤了 \n 和 \r因为不同蓝牙调试工具发送数据时可能自动追加换行符不过滤的话后续扩展解析协议时容易出怪问题。上传完代码打开 Arduino IDE 的串口监视器波特率选 9600手动发送 1 和 0如果外接 LED 和板载 LED 都能跟着亮灭说明 Arduino 端程序没问题可以继续下一步。3.3 上传固件的几个坑我自己带学生时上传失败是最常见的第一个坎。报错信息五花八门最常见的是avrdude: stk500_recv(): programmer is not responding。出现这个错误优先检查三件事工具菜单里的板卡型号是不是 Arduino Uno有些兼容板会被识别成其他型号要手动改端口选的是不是 Arduino 实际占用的那个 COM 口插拔一次 USB 看看端口有没有变化如果蓝牙模块接在 D0/D1 上立刻拆掉这两根线再试一次。蓝牙模块会把 16U2 芯片和主控芯片之间的通信链路干扰掉这在前面已经强调过我这里用的是 D8/D9 软串口正常不会影响上传。但为了保险上传固件时我还是会习惯性把蓝牙模块的供电线拔掉——少一个变量就少一份排查成本。4. 给蓝牙模块做“出厂配置”AT指令详解4.1 进入 AT 模式的两条路线HC-05 买来默认是自动连接波特率 38400而我们 Arduino 代码里用的是 9600所以必须进 AT 模式改参数。另外官方模块默认名字叫 HC-05配对密码是 1234你也可以在 AT 模式里改成自己喜欢的。进 AT 模式的方法按住模块上那个小按键不放然后给模块上电VCC 接 5V等两秒再松开按键。此时模块状态灯由快闪变为 2 秒一次的慢闪就说明已经进入 AT 指令模式了。AT 模式下模块和电脑通信有两条路线。第一条是买一个 USB 转 TTL 模块比如 CH340 的几块钱的小板接上模块的 VCC、GND、RXD、TXD在电脑上打开串口助手发送 AT。第二条是把 Arduino 当成 USB 转 TTL 用把 Arduino 的 RESET 引脚和 GND 短接让主控芯片“睡觉”USB 芯片直接和蓝牙模块通信。这个方法省得买额外模块但新人容易接错线我还是建议买一个 USB 转 TTL几块钱以后调试别的东西也用得上。接好之后打开串口助手波特率先设成 38400发送 AT如果返回 OK就说明通信正常。4.2 常用 AT 指令和参数指令功能示例AT测试通信AT → OKATNAMEBluetoothCar修改设备名改成你想要的名字ATPSWD1234修改配对密码默认 1234ATUART9600,0,0设置波特率96001 位停止位无校验ATROLE0设置从机模式0 从机1 主机ATRESET软复位配置完执行生效这里重点说波特率。HC-05 默认 AT 模式是 38400通信模式也是 38400但我们 Arduino 端想用 9600所以发送ATUART9600,0,0成功后模块会自动以新波特率运行。注意指令里的格式要严格保持ATUART波特率,停止位,校验位停止位 0 表示 1 位校验位 0 表示无校验这是最常用的组合。如果你配置完发现模块没反应先检查串口助手的波特率设置。有些模块出厂 AT 波特率就是 9600你拿 38400 发 AT 永远没反应可以先试 9600双管齐下。4.3 配置完怎么验证配置完成之后重新给模块上电进入正常通信模式。用手机打开蓝牙设置搜索新设备如果能看到你设置的名字并且能配对成功输入正确密码之后显示“已连接”那模块基本就是好用的。注意手机系统设置里“已连接”这个状态和你的 App 里是否建立串口通道是两码事。手机蓝牙与 HC-05 配对成功后App 还要再主动发起一次 SPP 连接才能真正收发数据。所以如果你在系统设置里看到连上了但 App 里连接失败不要慌这很常见后面排查部分会讲。5. 手机端开发App Inventor 2从零开始5.1 新建项目和界面布局浏览器打开 MIT App Inventor 2 官网用账号登录后点右上角“新建项目”名字可以叫 BluetoothLED。进去之后默认是“设计”页左侧是一堆组件面板。先从“用户界面”里拖一个 ListPicker 到屏幕用来显示和选择蓝牙设备再拖两个按钮一个叫“开灯”一个叫“关灯”拖一个标签 Label 用来显示连接状态最后从“连接”分类里把 BluetoothClient 拖到画布上它会出现在下方“非可见组件”区域。布局上我把 ListPicker 放最上面下面是两个按钮再下面是状态标签。简单垂直排列就行不用做太花哨。5.2 关键组件怎么配BluetoothClient是这个项目的核心。它负责扫描、连接、发送、接收数据App 里其他组件都要和它配合。属性里有几个值得注意勾选“显示确认对话框”连接时会弹窗询问用户体验更好保持“断线后自动重连”关闭方便调试时观察真正的连接状态发送方式选“文本”因为 Arduino 端接收的就是字符ListPicker的属性里把文本改成“选择蓝牙设备”背景颜色可以随意。Button 开灯和Button 关灯可以设置不同的背景色便于操作时区分开灯用绿色关灯用灰色视觉反馈更清晰。Notifier是非必需但强烈建议加的组件它用来弹提示框。扫描不到设备、连接失败这些都要有反馈不然用户会觉得 App 卡住了。5.3 逻辑块设计连接和发送左侧切换到“逻辑设计”页开始拖积木块。这个项目的逻辑块核心是三个事件。第一个是 ListPicker 的 BeforePicking 事件也就是用户点击下拉列表之前App 去扫描蓝牙设备如果 BluetoothClient1.IsEnabled蓝牙是否开启 那么 ListPicker1.Elements ← BluetoothClient1.GetEnabledBluetoothDevices 否则 Notifier1.ShowAlert请先打开手机蓝牙GetEnabledBluetoothDevices 返回的是一组蓝牙设备地址ListPicker 会把它们显示成列表项。这里有个体验问题列表显示的是 MAC 地址比如98:D3:31:F5:6E:BE对用户不友好后面小节我会给优化方案。第二个是 ListPicker 的 AfterPicking 事件也就是用户选中了某个设备之后调用 BluetoothClient1.ConnectListPicker1.Selection 如果 BluetoothClient1.IsConnected连接成功 那么 Label1.Text ← 已连接 ListPicker1.Selection 否则 Notifier1.ShowAlert连接失败请确认模块已上电第三个是按钮点击事件这个最简单Button开灯.Click: 调用 BluetoothClient1.SendText1 Button关灯.Click: 调用 BluetoothClient1.SendText0整个逻辑块就是这么几块。新手最容易漏掉的是把 SendText 的输入内容写成了数字 1 而不是文本 1。Arduino 端判断的是字符 1如果你发出去的是数字 1蓝牙底层会把它转成不可见字符LED 当然不会亮。调试时如果状态显示已连接、但灯没反应优先检查这里。5.4 显示设备名称的进阶小技巧前面提到 ListPicker 显示 MAC 地址不友好。优化方法是扫描出地址之后再用 BluetoothClient 的 GetDeviceName 方法去查每个地址对应的设备名然后把“名字”和“地址”拼接起来显示。具体做法是先在 Blocks 页新建一个全局变量 deviceNames类型为列表。在 AfterPicking 里遍历 GetEnabledBluetoothDevices 得到的地址列表对每个地址调用 BluetoothClient1.GetDeviceName把结果拼成“设备名 地址分隔符 地址”加入 deviceNames最后把 deviceNames 赋给 ListPicker1.Elements。连接时截取地址部分发给 Connect 函数。这个操作对新手来说有点绕但它能让你初步体会“数据清洗”和“显示层与逻辑层分离”的概念。以后做更复杂的数据上传、协议解析项目这两个概念会一直出现。如果一次性做不出来先用简单的地址列表方案也没问题功能上完全够用。6. 联调流程与问题排查6.1 分段调试验证我调试这类项目从来不会一上来就把整个系统连起来测而是拆成四段每段单独验证再拼接。这个习惯帮我省了无数时间。第一段验证 Arduino 点灯。不接蓝牙只接 LED上传代码确认程序本身没问题。第二段验证串口指令。打开 IDE 串口监视器手动发送 1 和 0确认 Arduino 能正确解析字符并控制 LED。第三段验证蓝牙配置。AT 模式下确认波特率是 9600、名字正确、模块能正常被手机搜到并配对。第四段验证 App。安装 APK打开 App扫描设备连接发送指令。每一步都确认通过才说明整条链路是通的。如果你在第二段发现串口发 1 没用先把代码移到 LED 是不是接错引脚了是不是共地了相比直接从 App 端开始排查这种分段方式能迅速缩小问题范围。6.2 常见问题速查表下面这张表覆盖了我这段时间带新手做这个项目会遇到的高频问题。问题现象可能原因排查方向App 扫描不到任何蓝牙设备手机蓝牙未开 / 未授权定位权限打开蓝牙给 App 定位权限重新扫描HC-05 手机搜不到模块没进入可发现状态 / 之前配对过残留记录重新上电手机蓝牙设置里忽略旧设备再搜配对提示输入 PIN 码模块默认密码未修改默认密码是 1234也可能 0000App 显示已连接但发指令无反应发送内容类型错误 / 波特率不匹配检查 SendText 传的是不是文本 1检查 Arduino 波特率上传 Arduino 程序一直失败蓝牙模块占用了串口接 D0/D1 的话拆掉或者改用软串口 D8/D9HC-05 进入 AT 模式无响应AT 波特率不对 / 没有按住按键上电分别试 38400 和 9600确认状态灯为慢闪连接成功后几分钟断开供电不稳定换独立电源避免从电脑 USB 加电华为/部分手机蓝牙传文件正常但连不上 HC-05协议兼容性问题换一台手机交叉测试排除手机蓝牙栈问题6.3 新手容易忽略的几个细节第一个细节Android 手机扫描蓝牙设备需要位置权限即使你根本不用定位。这是因为 Android 系统要求蓝牙扫描必须伴随定位权限。很多新手在 App 里点“选择蓝牙设备”时发现列表是空的一脸懵其实去手机设置里把“位置信息”打开、给 App 授权再回来就好了。第二个细节蓝牙模块的供电质量直接决定稳定性。HC-05 要求供电在 3.6V 到 6V 之间电流要求不高但如果电脑 USB 口供电很弱或者你用了劣质杜邦线接触电阻太大了模块会出现能配对但传输数据丢包的情况。建议用质量好一点的杜邦线接触不良是硬件调试里最难查的一种故障。第三个细节HC-05 模块上有个 STATE 引脚它输出的电平能反映模块连接状态。连接成功时 STATE 输出高电平没连接时输出低电平。如果你手头有万用表可以接一个 LED 到这个引脚做指示灯方便远距离观察模块是否处于连接状态。没有万用表也没关系看模块上的状态灯闪烁频率也能判断慢闪是未连接快闪或常亮是已连接。第四个细节App Inventor 2 生成的 APK 默认没有图标装到手机上是一坨绿色机器人找个好看的图标换上去项目提交或者给朋友演示时体验会好很多。设计器里有“图标”属性放一张 512x512 的 PNG 就行。这套流程走完你手机点一点灯就能亮能灭整个项目就算闭环了。我个人在实际动手中的经验和体会是凡是牵扯到无线通信的调试最忌讳的就是“失眠式排障”这个也不行、那个也不行最后发现是线没插紧。养成每改一个变量就单独验证的习惯比任何技巧都管用。后面你可以再往这个项目上加东西把 LED 换成一路继电器控制灯座给 Arduino 加个温湿度传感器把数据回传到手机显示或者干脆把 HC-05 换掉用 ESP32 走 WiFi 远程控制。路已经通了剩下的就是往里面加内容。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

动态支撑人体工学椅怎么选?西昊C300二十天深度实测 2026/9/16 2:57:51

动态支撑人体工学椅怎么选?西昊C300二十天深度实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Python实战:手写M3U8下载器,从HLS解析到AES-128解密全指南 2026/9/16 2:57:51

Python实战:手写M3U8下载器,从HLS解析到AES-128解密全指南

简介:基于 Python 的 m3u8 下载器是一款面向视频下载需求者的轻量开源工具,用于解析 m3u8 播放列表并批量下载其中链接的 ts 视频片段,最终合并为完整视频。它适合需要离线观看、备份在线视频或研究流媒体协议的学习者与开发者使用&#xff0…

阅读更多 →
深度拆解开源C++ RPG游戏项目:从架构设计到实战调试全指南 2026/9/16 2:57:51

深度拆解开源C++ RPG游戏项目:从架构设计到实战调试全指南

最近把 GitHub 上一个完全开源的 C 实现的 RPG 游戏项目从头到尾过了一遍,边读边改边跑,整个过程非常有收获。如果你和我一样,学 C 学到语法都会、但一提到“怎么用 C 写一个完整的游戏”就发怵,那这类开源项目就是最值得啃的资料…

阅读更多 →
云原生时代Tomcat实战指南:从核心部署到容器化调优 2026/9/16 2:57:51

云原生时代Tomcat实战指南:从核心部署到容器化调优

云原生时代,一说到企业级 WEB 应用服务器,很多人第一反应是“这不就是 Tomcat 嘛”,但真往深了问,Tomcat 在企业级场景里到底承担什么角色、为什么它能活二十年还没被淘汰、云原生架构下它又该怎么调整,能讲清楚的人并…

阅读更多 →
双语言网络仿真:Python+MATLAB协同建模与拓扑驱动验证 2026/9/16 2:57:51

双语言网络仿真:Python+MATLAB协同建模与拓扑驱动验证

简介:本资源是一份面向高校计算机、通信与自动化专业本科生的课程设计级仿真项目,聚焦网络拓扑建模与动态行为分析,适用于《计算机网络》《通信系统仿真》等课程的大作业与综合实践环节。压缩包共33个文件(234KB)&…

阅读更多 →
从噪声到信号:CSF与BOLD时间耦合分析全解析 2026/9/16 2:54:51

从噪声到信号:CSF与BOLD时间耦合分析全解析

如果你做过静息态fMRI处理,大概对脑脊液(CSF)信号一点都不陌生。几乎所有预处理流水线都会把CSF当成噪声回归掉,生怕它的波动污染BOLD信号;可在近五六年里,这个被“请出局”的信号突然成了研究热点。越来越…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞