#c

Arduino与HC-05蓝牙模块

无线通信与远程控制的实现

#c
@魅客科创中心

CONTENTS

目录

第一部分:蓝牙通信简介与历史趣闻

蓝牙技术的起源与命名

  • 蓝牙(Bluetooth)名称来源于10世纪丹麦国王Harald Bluetooth
  • Harald Bluetooth以统一丹麦和挪威而闻名
  • 1996年,爱立信、诺基亚、英特尔等公司合作开发短距离无线技术
  • Jim Kardach提议以Harald Bluetooth命名,象征连接不同设备
  • 蓝牙标志结合了Harald名字的北欧古文字符(Hagall和Blatand)

蓝牙技术的发展历程

版本 年份 数据传输速率 特点
1.0 1999 1 Mbps 初始版本,连接问题多
2.0+EDR 2004 3 Mbps 增强数据速率
3.0+HS 2009 24 Mbps 高速传输
4.0/BLE 2010 1 Mbps 低功耗蓝牙
5.0 2016 2 Mbps 更长距离,更高速度
5.1/5.2 2019/2020 2 Mbps 方向感知,LE Audio

蓝牙在物联网时代的应用

消费电子

  • 无线耳机和音箱
  • 智能手表和健康追踪器
  • 游戏控制器
  • 智能家居设备

医疗保健

  • 患者监护系统
  • 医疗数据采集
  • 可穿戴医疗设备

工业应用

  • 资产追踪
  • 设备监控
  • 预测性维护

智能家居

  • 照明控制
  • 温度调节
  • 安全系统
  • 家电控制

蓝牙与其他无线通信技术的比较

技术 范围 数据速率 功耗 应用场景
蓝牙经典 10-100m 1-3 Mbps 中等 音频传输,数据交换
蓝牙低功耗(BLE) 10-100m 1-2 Mbps 极低 物联网,传感器
Wi-Fi 50-100m 150-1300+ Mbps 网络访问,视频流
ZigBee 10-100m 250 Kbps 传感器网络,家庭自动化
NFC <10cm 424 Kbps 极低 支付,门禁
LoRa 2-15km 0.3-50 Kbps 极低 远距离物联网

第二部分: HC-05蓝牙模块介绍

HC-05系列模块概述

  • HC-05是一款基于蓝牙2.0+EDR标准的串行通信模块
  • 使用蓝牙SPP(Serial Port Profile)协议
  • 可作为主设备(Master)或从设备(Slave)
  • 工作在2.4GHz ISM频段
  • 通过串口(UART)与Arduino等微控制器通信
  • 常用于DIY项目、机器人、远程控制等应用

技术规格与特点

技术规格

  • 蓝牙版本:2.0+EDR
  • 频率范围:2.4GHz ISM频段
  • 调制方式:GFSK(高斯频移键控)
  • 发射功率:≤4dBm,Class 2
  • 灵敏度:≤-84dBm,0.1% BER
  • 速率:2.1Mbps(最大)/160kbps(异步)
  • 工作电压:3.3V(模块)/5V(开发板)
  • 工作电流:<40mA
  • 待机电流:<1mA

特点

  • 默认串口参数:9600,N,8,1
  • 默认配对密码:1234或0000
  • 通信距离:约10米
  • 支持AT命令配置
  • 内置天线
  • 支持多设备配对
  • 自动重连最后配对设备
  • 内置LED指示灯
  • 小尺寸,易于集成

HC-05与HC-06的区别

特性 HC-05 HC-06
工作模式 主/从模式(可切换) 仅从模式
AT命令 完整AT命令集 有限AT命令集
配置方式 按键进入AT模式 自动进入AT模式(未配对时)
LED指示 闪烁(未配对),常亮(已配对) 闪烁(未配对),常亮(已配对)
默认名称 "HC-05" "HC-06"
默认密码 "1234" "1234"
默认波特率 9600 9600
价格 略高 略低
适用场景 复杂项目,需要主从切换 简单项目,仅需从模式

AT命令模式与通信模式

AT命令模式

  • 用于配置模块参数
  • 进入方式:
    • HC-05:按住EN/KEY按钮上电,或在通电状态下按住按钮
    • 波特率:38400(AT模式)
  • 常用AT命令:
    • AT - 测试通信
    • AT+NAME=<name> - 设置名称
    • AT+PSWD=<pwd> - 设置密码
    • AT+UART=<baud>,<stop>,<parity> - 设置串口
    • AT+ROLE=<role> - 设置角色(0=从,1=主)
    • AT+RESET - 重启模块

通信模式

  • 用于与其他蓝牙设备通信
  • 自动进入:
    • 未按EN/KEY按钮上电
    • 波特率:根据配置(默认9600)
  • 通信特点:
    • 透明传输
    • 数据自动转发
    • 无需特殊协议
    • 类似于无线串口线
  • 状态指示:
    • LED闪烁:等待连接
    • LED常亮:已连接

常见引脚与功能说明

引脚 标识 功能描述
1 STATE 状态指示,连接时为高电平
2 RXD 接收数据,连接到Arduino的TX
3 TXD 发送数据,连接到Arduino的RX
4 GND 接地
5 VCC 电源输入(3.3V-6V)
6 EN/KEY 使能/按键,用于进入AT命令模式

注意:某些HC-05模块可能有额外的引脚或不同的排列方式

第三部分: 硬件连接与基本设置

Arduino与HC-05的接线方法

基本连接(通信模式)

HC-05    Arduino
VCC  -->  5V/3.3V
GND  -->  GND
TXD  -->  RX(D0)*
RXD  -->  TX(D1)*

*注意:使用软件串口时,可连接到其他数字引脚

AT命令模式连接

HC-05    Arduino
VCC  -->  5V/3.3V
GND  -->  GND
TXD  -->  RX(D0)*
RXD  -->  TX(D1)*
EN   -->  3.3V/5V(或通过按钮控制)

注意事项:

  • 确保Arduino与电脑连接时不要连接RX/TX引脚
  • 上传代码后再连接RX/TX引脚
  • 考虑使用软件串口避免冲突
  • 某些Arduino板可能需要电平转换电路

电平转换考虑(3.3V与5V)

为什么需要电平转换?

  • HC-05模块工作在3.3V逻辑电平
  • Arduino UNO等使用5V逻辑电平
  • 直接连接可能导致HC-05损坏

简单的电平转换方法

  1. 电阻分压器
    Arduino 5V TX --[1K电阻]-- HC-05 RX
                      |
                     [2K电阻]
                      |
                     GND
    
  2. HC-05 TX到Arduino RX可直接连接(Arduino输入引脚可接受3.3V)

其他电平转换方案

  • 专用电平转换模块
  • 双向逻辑电平转换器
  • 使用3.3V Arduino(如Arduino Pro Mini 3.3V版)
  • 某些HC-05模块带有板载电平转换电路

进入AT命令模式的方法

HC-05 AT命令模式

  1. 断开HC-05电源
  2. 按住EN/KEY按钮
  3. 保持按住状态下,接通电源
  4. LED灯将缓慢闪烁(约2秒一次)
  5. 此时已进入AT命令模式

通过Arduino进入AT命令模式

// 使用Arduino控制HC-05进入AT模式
// 将HC-05的KEY引脚连接到Arduino的D4
void setup() {
  Serial.begin(38400); // AT模式波特率
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH); // 拉高KEY引脚
}

注意事项

  • AT命令模式波特率为38400
  • 命令需以回车换行(CR+LF)结束
  • 响应通常为"OK"或具体数据
  • 某些命令需要重启模块生效
  • 可使用串口监视器测试AT命令
  • 确保串口监视器设置为"Both NL & CR"

基本AT命令配置

常用AT命令

命令 功能 示例
AT 测试连接 AT → OK
AT+NAME 查询/设置名称 AT+NAME=MyBT
AT+PSWD 查询/设置密码 AT+PSWD=1234
AT+UART 查询/设置串口 AT+UART=9600,0,0
AT+ROLE 查询/设置角色 AT+ROLE=0
AT+ADDR 查询地址 AT+ADDR?
AT+VERSION 查询版本 AT+VERSION?
AT+RESET 重启模块 AT+RESET
AT+ORGL 恢复出厂设置 AT+ORGL

Arduino配置示例

void setup() {
  Serial.begin(38400);
  delay(1000);
  
  // 测试连接
  Serial.println("AT");
  delay(1000);
  
  // 设置名称
  Serial.println("AT+NAME=ArduinoBT");
  delay(1000);
  
  // 设置密码
  Serial.println("AT+PSWD=5678");
  delay(1000);
  
  // 设置波特率
  Serial.println("AT+UART=9600,0,0");
  delay(1000);
  
  // 重启模块使设置生效
  Serial.println("AT+RESET");
}

蓝牙配对与连接流程

配对流程

  1. 打开手机蓝牙设置
  2. 搜索可用设备
  3. 选择HC-05设备(默认名称或已修改名称)
  4. 输入配对密码(默认1234或已修改密码)
  5. 等待配对完成
  6. LED指示灯从闪烁变为常亮

连接特点

  • 一旦配对,设备信息会被保存
  • HC-05可记住最后连接的设备
  • 可设置自动重连功能
  • 同一时间只能与一个设备连接

常见连接应用

  • 蓝牙串口终端APP
    • Android: Bluetooth Terminal HC-05
    • iOS: BLE Terminal
  • 自定义手机应用
    • MIT App Inventor
    • Blynk
    • Arduino Bluetooth Control
  • 电脑连接
    • 通过蓝牙COM端口
    • 使用串口助手软件

第四部分

基础项目:蓝牙控制LED灯

项目概述与所需材料

项目概述

本项目将实现通过手机蓝牙控制Arduino上连接的LED灯,包括:

  • 开关控制(打开/关闭LED)
  • PWM调光(调节LED亮度)
  • 多LED控制(控制多个不同颜色的LED)

学习目标

  • 掌握HC-05与Arduino的基本通信
  • 了解串口数据的接收与解析
  • 学习如何通过蓝牙发送控制命令
  • 实现简单的交互式控制系统

所需材料

  • Arduino UNO或兼容板 × 1
  • HC-05蓝牙模块 × 1
  • LED灯(红、绿、蓝各一个)× 3
  • 220Ω电阻 × 3
  • 面包板 × 1
  • 跳线若干
  • 电源(USB线或外部电源)
  • 安装有蓝牙串口APP的手机

硬件连接图

接线说明

  1. HC-05与Arduino连接:

    • VCC → 5V
    • GND → GND
    • TXD → D10 (软件串口RX)
    • RXD → D11 (软件串口TX)
  2. LED与Arduino连接:

    • 红LED正极 → D3(通过220Ω电阻)
    • 绿LED正极 → D5(通过220Ω电阻)
    • 蓝LED正极 → D6(通过220Ω电阻)
    • 所有LED负极 → GND

注意:使用软件串口可避免与Arduino IDE上传冲突

电路特点

  • 使用PWM引脚(3,5,6)实现LED调光
  • 软件串口避免与硬件串口冲突
  • 简单的面包板布局易于实现
  • 可扩展性强,可添加更多组件

Arduino代码讲解(1)

#include <SoftwareSerial.h>

// 定义软件串口引脚
#define BT_RX 10  // 连接到HC-05的TXD
#define BT_TX 11  // 连接到HC-05的RXD

// 定义LED引脚
#define RED_LED 3
#define GREEN_LED 5
#define BLUE_LED 6

// 创建软件串口对象
SoftwareSerial btSerial(BT_RX, BT_TX);

char command;  // 存储接收到的命令

void setup() {
  // 初始化串口通信
  Serial.begin(9600);
  btSerial.begin(9600);
  
  // 设置LED引脚为输出模式
  pinMode(RED_LED, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
  pinMode(BLUE_LED, OUTPUT);
  
  // 初始状态:所有LED关闭
  digitalWrite(RED_LED, LOW);
  digitalWrite(GREEN_LED, LOW);
  digitalWrite(BLUE_LED, LOW);
  
  Serial.println("蓝牙LED控制系统已启动");
}

Arduino代码讲解(2)

void loop() {
  // 检查是否有蓝牙数据可读
  if (btSerial.available() > 0) {
    command = btSerial.read();  // 读取一个字节的数据
    Serial.print("收到命令: ");
    Serial.println(command);
    
    // 根据接收到的命令执行相应操作
    switch (command) {
      // 基本开关控制
      case 'R': digitalWrite(RED_LED, HIGH); break;    // 打开红色LED
      case 'r': digitalWrite(RED_LED, LOW); break;     // 关闭红色LED
      case 'G': digitalWrite(GREEN_LED, HIGH); break;  // 打开绿色LED
      case 'g': digitalWrite(GREEN_LED, LOW); break;   // 关闭绿色LED
      case 'B': digitalWrite(BLUE_LED, HIGH); break;   // 打开蓝色LED
      case 'b': digitalWrite(BLUE_LED, LOW); break;    // 关闭蓝色LED
      case 'A': allLEDsOn(); break;                    // 打开所有LED
      case 'a': allLEDsOff(); break;                   // 关闭所有LED
      
      // PWM调光控制(在下一页继续)
    }
  }
}

// 打开所有LED
void allLEDsOn() {
  digitalWrite(RED_LED, HIGH);
  digitalWrite(GREEN_LED, HIGH);
  digitalWrite(BLUE_LED, HIGH);
}

// 关闭所有LED
void allLEDsOff() {
  digitalWrite(RED_LED, LOW);
  digitalWrite(GREEN_LED, LOW);
  digitalWrite(BLUE_LED, LOW);
}

Arduino代码讲解(3)

void loop() {
  // 前面的代码与上一页相同...
  
  if (btSerial.available() > 0) {
    command = btSerial.read();
    
    switch (command) {
      // 基本开关控制(与上一页相同)...
      
      // PWM调光控制
      case '1': analogWrite(RED_LED, 50); break;    // 红色LED低亮度
      case '2': analogWrite(RED_LED, 150); break;   // 红色LED中亮度
      case '3': analogWrite(RED_LED, 255); break;   // 红色LED最大亮度
      
      case '4': analogWrite(GREEN_LED, 50); break;  // 绿色LED低亮度
      case '5': analogWrite(GREEN_LED, 150); break; // 绿色LED中亮度
      case '6': analogWrite(GREEN_LED, 255); break; // 绿色LED最大亮度
      
      case '7': analogWrite(BLUE_LED, 50); break;   // 蓝色LED低亮度
      case '8': analogWrite(BLUE_LED, 150); break;  // 蓝色LED中亮度
      case '9': analogWrite(BLUE_LED, 255); break;  // 蓝色LED最大亮度
      
      // 特效
      case 'F': fadeEffect(); break;                // 渐变特效
      case 'S': strobeEffect(); break;              // 闪烁特效
    }
  }
}

// 特效函数将在下一页继续...

Arduino代码讲解(4)

// LED渐变特效
void fadeEffect() {
  // 所有LED同时渐变
  for (int i = 0; i <= 255; i++) {
    analogWrite(RED_LED, i);
    analogWrite(GREEN_LED, i);
    analogWrite(BLUE_LED, i);
    delay(10);
  }
  for (int i = 255; i >= 0; i--) {
    analogWrite(RED_LED, i);
    analogWrite(GREEN_LED, i);
    analogWrite(BLUE_LED, i);
    delay(10);
  }
}

// LED闪烁特效
void strobeEffect() {
  for (int i = 0; i < 10; i++) {
    digitalWrite(RED_LED, HIGH);
    digitalWrite(GREEN_LED, HIGH);
    digitalWrite(BLUE_LED, HIGH);
    delay(50);
    digitalWrite(RED_LED, LOW);
    digitalWrite(GREEN_LED, LOW);
    digitalWrite(BLUE_LED, LOW);
    delay(50);
  }
}

手机APP选择与使用

推荐APP

  • Android
    • Bluetooth Terminal HC-05
    • Arduino Bluetooth Controller
    • Serial Bluetooth Terminal
  • iOS
    • BLE Terminal
    • Bluetooth Terminal

基本使用步骤

  1. 安装蓝牙串口APP
  2. 打开手机蓝牙并配对HC-05
  3. 打开APP并连接到HC-05
  4. 使用按钮或发送字符控制LED

自定义控制界面

  • 某些APP允许创建自定义按钮
  • 每个按钮可绑定特定命令
  • 可设计直观的用户界面
  • 例如:
    • "红灯开"按钮 → 发送"R"
    • "红灯关"按钮 → 发送"r"
    • "全开"按钮 → 发送"A"
    • "渐变"按钮 → 发送"F"

实现简单的开关控制

命令系统设计

  • 使用单个字符作为命令
  • 大写字母表示"开"操作
  • 小写字母表示"关"操作
  • 数字表示亮度级别
  • 字母对应LED颜色首字母

控制逻辑

// 基本开关控制示例
case 'R': digitalWrite(RED_LED, HIGH); break;
case 'r': digitalWrite(RED_LED, LOW); break;
case 'G': digitalWrite(GREEN_LED, HIGH); break;
case 'g': digitalWrite(GREEN_LED, LOW); break;

扩展功能

  • 可添加更多命令和功能
  • 组合命令(如"RGB"同时控制三个LED)
  • 序列命令(如"RGBRGB"创建特定模式)
  • 状态反馈(Arduino向手机发送当前状态)

调试技巧

  • 使用Serial.print()监控接收到的命令
  • 在每个命令执行后发送确认信息
  • 添加错误处理机制
  • 使用超时机制处理不完整的命令

实现PWM调光功能

PWM基础

  • PWM = 脉冲宽度调制
  • Arduino UNO上的PWM引脚:3,5,6,9,10,11
  • 亮度范围:0(关闭)到255(最亮)
  • 使用analogWrite()函数控制

代码实现

// PWM调光示例
case '1': analogWrite(RED_LED, 50); break;
case '2': analogWrite(RED_LED, 150); break;
case '3': analogWrite(RED_LED, 255); break;

高级调光方法

  • 使用连续值而非离散级别
  • 接收格式:"R128"表示红色LED亮度为128
  • 解析字符串命令:
// 高级调光示例(伪代码)
if (command[0] == 'R' && isDigit(command[1])) {
  int brightness = atoi(&command[1]);
  analogWrite(RED_LED, brightness);
}
  • 使用滑块控制(需要支持滑块的APP)
  • 使用颜色选择器(RGB控制)

实现多LED控制

多LED控制策略

  • 独立控制每个LED
  • 组合控制(如同时控制RGB)
  • 预设场景(如"派对模式"、"阅读模式")
  • 序列控制(按特定顺序控制)

代码示例

// 预设场景示例
case 'P': // 派对模式
  partyMode();
  break;
case 'C': // 循环模式
  cycleMode();
  break;

高级功能

  • 颜色混合(RGB混合创建不同颜色)
  • 渐变过渡(平滑过渡到新颜色)
  • 音乐响应(根据音频输入改变灯光)
  • 定时模式(定时改变灯光状态)

扩展项目思路

  • 添加更多LED
  • 使用RGB LED条带
  • 添加光敏电阻自动调节亮度
  • 结合其他传感器(如声音、运动)
  • 创建灯光与音乐同步的系统

第五部分

进阶项目:蓝牙传输DHT11温湿度数据

DHT11传感器简介

DHT11基本信息

  • 低成本数字温湿度传感器
  • 测量范围:
    • 温度:0-50°C(±2°C精度)
    • 湿度:20-90% RH(±5% RH精度)
  • 供电电压:3.3V-5.5V
  • 采样率:1Hz(最快每秒一次)
  • 单总线数据传输
  • 4针脚版本和3针脚版本

工作原理

  • 内部包含湿敏电容和NTC温度传感器
  • 集成了模数转换器和校准数据
  • 使用单总线协议进行通信
  • 数据格式:40位(8位湿度整数+8位湿度小数+8位温度整数+8位温度小数+8位校验和)

引脚定义(4针版本)

  1. VCC(3.3V-5.5V电源)
  2. DATA(数据输入/输出)
  3. NC(不连接)
  4. GND(接地)

库支持

  • DHT库(Adafruit)
  • SimpleDHT库
  • DHTlib

硬件连接图

接线说明

  1. HC-05与Arduino连接:

    • VCC → 5V
    • GND → GND
    • TXD → D10 (软件串口RX)
    • RXD → D11 (软件串口TX)
  2. DHT11与Arduino连接:

    • VCC → 5V
    • DATA → D2
    • GND → GND
  3. LED指示灯(可选):

    • 数据传输指示灯 → D13(通过220Ω电阻)

电路特点

  • 简单的面包板布局
  • DHT11需要上拉电阻(4.7kΩ-10kΩ)
    (某些DHT11模块已内置)
  • 使用软件串口避免与硬件串口冲突
  • 可选的LED指示灯用于调试
  • 可扩展性强,可添加显示屏等组件

Arduino代码讲解(1)

#include <SoftwareSerial.h>
#include <DHT.h>

// 定义引脚
#define BT_RX 10       // 连接到HC-05的TXD
#define BT_TX 11       // 连接到HC-05的RXD
#define DHT_PIN 2      // DHT11数据引脚
#define LED_PIN 13     // 数据传输指示灯

// 定义DHT类型
#define DHT_TYPE DHT11 // DHT11传感器

// 创建对象
SoftwareSerial btSerial(BT_RX, BT_TX);
DHT dht(DHT_PIN, DHT_TYPE);

// 定义变量
unsigned long previousMillis = 0;
const long interval = 2000;  // 数据发送间隔(毫秒)
char command;

void setup() {
  // 初始化串口通信
  Serial.begin(9600);
  btSerial.begin(9600);
  
  // 初始化DHT传感器
  dht.begin();
  
  // 设置LED引脚为输出
  pinMode(LED_PIN, OUTPUT);
  
  Serial.println("蓝牙DHT11温湿度监测系统已启动");
}

Arduino代码讲解(2)

void loop() {
  // 检查是否有蓝牙数据可读
  if (btSerial.available() > 0) {
    command = btSerial.read();
    
    // 处理接收到的命令
    switch (command) {
      case 'T': // 请求单次温度数据
        sendTemperatureData();
        break;
      case 'H': // 请求单次湿度数据
        sendHumidityData();
        break;
      case 'B': // 请求单次温湿度数据
        sendTempHumData();
        break;
      case 'A': // 开始自动发送数据
        startAutoSend();
        break;
      case 'S': // 停止自动发送数据
        stopAutoSend();
        break;
    }
  }
  
  // 自动发送数据(如果启用)
  autoSendData();
}

// 发送温度数据
void sendTemperatureData() {
  float temp = dht.readTemperature();
  if (!isnan(temp)) {
    btSerial.print("T:");
    btSerial.println(temp);
    blinkLED();
  } else {
    btSerial.println("T:Error");
  }
}

// 发送湿度数据
void sendHumidityData() {
  float hum = dht.readHumidity();
  if (!isnan(hum)) {
    btSerial.print("H:");
    btSerial.println(hum);
    blinkLED();
  } else {
    btSerial.println("H:Error");
  }
}

Arduino代码讲解(3)

// 发送温湿度数据
void sendTempHumData() {
  float temp = dht.readTemperature();
  float hum = dht.readHumidity();
  
  if (!isnan(temp) && !isnan(hum)) {
    // 发送JSON格式数据
    btSerial.print("{\"temp\":");
    btSerial.print(temp);
    btSerial.print(",\"hum\":");
    btSerial.print(hum);
    btSerial.println("}");
    blinkLED();
  } else {
    btSerial.println("{\"error\":\"Failed to read sensor\"}");
  }
}

// 自动发送数据变量
boolean autoSendEnabled = false;

// 开始自动发送
void startAutoSend() {
  autoSendEnabled = true;
  btSerial.println("Auto send enabled");
}

// 停止自动发送
void stopAutoSend() {
  autoSendEnabled = false;
  btSerial.println("Auto send disabled");
}

// 自动发送数据函数
void autoSendData() {
  if (autoSendEnabled) {
    unsigned long currentMillis = millis();
    if (currentMillis - previousMillis >= interval) {
      previousMillis = currentMillis;
      sendTempHumData();
    }
  }
}

// LED闪烁函数(数据发送指示)
void blinkLED() {
  digitalWrite(LED_PIN, HIGH);
  delay(100);
  digitalWrite(LED_PIN, LOW);
}

数据格式设计与解析

数据格式选项

  1. 简单文本格式

    T:25.40
    H:65.20
    
  2. CSV格式

    25.40,65.20,1620123456
    
  3. JSON格式

    {"temp":25.40,"hum":65.20,"time":1620123456}
    
  4. 自定义格式

    #TH|25.40|65.20|1620123456;
    

选择考虑因素

  • 可读性
  • 解析难度
  • 数据大小
  • 扩展性
  • 错误检测能力

Arduino端数据生成

// JSON格式示例
void sendDataAsJSON() {
  float temp = dht.readTemperature();
  float hum = dht.readHumidity();
  
  btSerial.print("{\"temp\":");
  btSerial.print(temp);
  btSerial.print(",\"hum\":");
  btSerial.print(hum);
  btSerial.print(",\"time\":");
  btSerial.print(millis()/1000);
  btSerial.println("}");
}

手机端数据解析(伪代码)

// JSON解析示例
function parseData(dataString) {
  try {
    const data = JSON.parse(dataString);
    updateUI(data.temp, data.hum, data.time);
  } catch (e) {
    console.error("解析错误:", e);
  }
}

手机APP开发与使用

现成APP选项

  1. 蓝牙串口终端

    • 接收并显示原始数据
    • 可保存数据日志
    • 简单易用,无需编程
  2. Blynk

    • 可视化仪表盘
    • 图表和历史数据
    • 需要简单配置
  3. Arduino蓝牙控制器

    • 自定义按钮和显示
    • 支持多种数据格式
    • 部分支持图表显示

自定义APP开发

  1. MIT App Inventor

    • 图形化编程
    • 简单易学
    • 适合快速原型开发
  2. Android Studio / Kotlin

    • 完全自定义界面
    • 高级数据处理
    • 专业开发工具
  3. React Native / Flutter

    • 跨平台开发
    • 丰富的UI组件
    • 支持iOS和Android

MIT App Inventor示例

界面设计

  • 连接/断开按钮
  • 温度和湿度显示标签
  • 数据请求按钮
  • 自动更新开关
  • 历史数据图表
  • 数据记录列表

蓝牙连接块

数据处理块

关键功能

  • 蓝牙设备选择和连接
  • 数据接收和解析
  • 用户界面更新
  • 数据可视化
  • 错误处理
  • 数据记录和导出

项目扩展思路

硬件扩展

  • 添加OLED/LCD显示屏
  • 增加更多传感器:
    • 气压传感器
    • 光线传感器
    • 空气质量传感器
  • 添加SD卡数据记录
  • 使用更高精度的DHT22/AM2302
  • 添加继电器控制风扇/加湿器

软件扩展

  • 数据记录和导出功能
  • 历史数据分析
  • 阈值报警系统
  • 多设备数据汇总
  • 云端数据同步

应用场景

  • 家庭环境监测
  • 温室/花园自动化
  • 仓库环境监控
  • 实验室数据采集
  • 气象站
  • 智能家居集成

进阶技术

  • 低功耗设计(电池供电)
  • 深度睡眠模式
  • 网关模式(蓝牙转WiFi)
  • 多点传感器网络
  • 机器学习预测
  • 3D打印外壳设计

常见问题与故障排除

连接问题

  1. 无法发现HC-05设备

    • 检查电源连接
    • 确认模块指示灯是否闪烁
    • 尝试重置模块
  2. 配对成功但无法连接

    • 检查波特率设置
    • 确认RX/TX连接是否正确
    • 检查Arduino代码中的串口初始化
  3. 连接不稳定/频繁断开

    • 检查电源稳定性
    • 减少传输频率
    • 缩短连接距离
    • 避免金属屏蔽和干扰源

数据传输问题

  1. 接收数据乱码

    • 检查波特率是否匹配
    • 确认数据格式一致性
    • 检查Arduino和APP的字符编码
  2. DHT11读数错误

    • 检查连接和上拉电阻
    • 增加读取间隔(至少2秒)
    • 检查电源电压是否稳定
    • 尝试更换传感器
  3. 数据丢失

    • 减少传输频率
    • 添加数据校验机制
    • 实现确认应答机制
    • 增加缓冲区大小

调试技巧

  • 使用LED指示关键状态
  • 通过硬件串口监视通信
  • 逐步排除问题(隔离测试)
  • 使用逻辑分析仪观察信号

总结与参考资源

教程总结

  • 了解了HC-05蓝牙模块的基本工作原理
  • 掌握了AT命令配置方法
  • 实现了基础的LED控制项目
  • 开发了进阶的温湿度监测系统
  • 学习了蓝牙数据传输的关键技术
  • 探索了项目扩展的多种可能性

核心技能收获

  • Arduino与蓝牙模块的接口技术
  • 串口通信和数据解析
  • 传感器数据采集与处理
  • 移动应用与硬件交互
  • 嵌入式系统设计思想

参考资源

  1. 官方文档

  2. 教程与社区

  3. 开源库

  4. 进阶学习

感谢使用本教程

祝您项目开发顺利!

演讲者备注: - 欢迎学生,介绍HC-05蓝牙模块及其在Arduino项目中的应用。 - 强调本讲义将介绍HC-05的工作原理、连接方式和编程方法。

目录页: - 蓝牙通信简介 - HC-05模块介绍 - 硬件连接与基本设置 - 基础项目:蓝牙控制LED灯 - 进阶项目:蓝牙传输DHT11温湿度数据 - 常见问题与故障排除 - 总结与参考资源