App Inventor 2 JDY-34双模蓝牙模块配置与通信教程

« 返回首页

概述

JDY-34是一款低成本双模蓝牙模块(支持经典蓝牙+BLE),广泛用于物联网项目。本文补充JDY-34在App Inventor中的具体配置。

已有文档:bluetooth_remote.md 介绍了蓝牙遥控通用方案。本文聚焦JDY-34模块。

JDY-34规格

参数 值
蓝牙版本 5.0双模(SPP + BLE)
工作电压 3.3V(IO口3.3V)
通信接口 UART串口
波特率 默认9600
传输距离 约30米(开放环境)
默认名称 JDY-34
BLE广播名 JDY-34-XXXX

引脚定义

引脚 说明
VCC 电源3.3V
GND 地
TX 串口发送 → 连接MCU RX
RX 串口接收 → 连接MCU TX
EN 使能(高电平有效)
STATE 连接状态指示

模式选择

JDY-34有两种工作模式:

SPP模式(经典蓝牙透传)

  • 使用 BluetoothClient 组件
  • 配对后像串口一样收发数据
  • 适合大数据量传输

BLE模式(低功耗蓝牙)

  • 使用 BluetoothLE 扩展
  • 通过Service/Characteristic读写
  • 适合低功耗场景

AT指令配置

通过串口发送AT指令配置模块(需要在未连接状态发送):

指令 功能 示例
AT 测试连接 返回 OK
AT+VERSION 查询版本 返回版本号
AT+NAME 设置BLE广播名 AT+NAME=MyDevice
AT+BAUD 设置波特率 AT+BAUD=4(9600)
AT+PIN 设置配对码 AT+PIN=1234
AT+ROLE 设置主从模式 AT+ROLE=0(从机)

波特率对照

值 波特率
1 1200
2 2400
3 4800
4 9600(默认)
5 19200
6 38400
7 57600
8 115200

SPP模式通信(经典蓝牙)

硬件接线

JDY-34 TX → Arduino/MCU RX (注意电平匹配,可能需要分压)
JDY-34 RX → Arduino/MCU TX
JDY-34 VCC → 3.3V
JDY-34 GND → GND

App Inventor积木块

global receiveBuffer = ""

when Button1.Click() {
  BluetoothClient1.Secure = True
  BluetoothClient1.Connect("00:11:22:33:44:55")
}

when Button2.Click() {
  var data = join(TextBox1.Text, "\n")
  BluetoothClient1.SendText(data)
}

when Clock1.Timer() {
  if BluetoothClient1.BytesAvailableToReceive() > 0 {
    var newData = BluetoothClient1.ReceiveText(BluetoothClient1.BytesAvailableToReceive())
    global_receiveBuffer = join(global_receiveBuffer, newData)
    if containsText(newData, "\n") {
      var fullLine = segmentText(global_receiveBuffer, 1, stringPosition("\n", global_receiveBuffer) - 1)
      Label1.Text = fullLine
      global_receiveBuffer = replaceAll(global_receiveBuffer, join(fullLine, "\n"), "")
    }
  }
}

BLE模式通信

JDY-34 BLE服务和特征

JDY-34在BLE模式下提供标准串口透传服务:

UUID 类型 说明
0000FFE0-0000-1000-8000-00805F9B34FB Service 串口透传服务
0000FFE1-0000-1000-8000-00805F9B34FB Characteristic 数据读写
0000FFE2-0000-1000-8000-00805F9B34FB Characteristic 数据通知

App Inventor积木块(BLE扩展)

global JDY34_SERVICE = "0000FFE0-0000-1000-8000-00805F9B34FB"
global JDY34_CHAR_WRITE = "0000FFE1-0000-1000-8000-00805F9B34FB"

when Button3.Click() {
  BluetoothLE1.StartScanning()
}

when BluetoothLE1.DeviceFound(name, deviceAddress, rssi) {
  if containsText(name, "JDY") {
    BluetoothLE1.StopScanning()
    BluetoothLE1.Connect(deviceAddress)
    Label1.Text = join("连接中:", name)
  }
}

when BluetoothLE1.Connected() {
  Label1.Text = "✅ BLE已连接"
  // 订阅通知
  BluetoothLE1.RegisterForStrings(global_JDY34_SERVICE, global_JDY34_CHAR_WRITE, True)
}

when Button4.Click() {
  BluetoothLE1.WriteStringValue(global_JDY34_SERVICE, global_JDY34_CHAR_WRITE, TextBox1.Text)
}

when BluetoothLE1.StringsReceived(serviceUuid, characteristicUuid, stringValues) {
  Label1.Text = joinItems(stringValues, "")
}

实战案例:JDY-34控制LED

Arduino端代码

// Arduino端接收JDY-34数据控制LED
#include <SoftwareSerial.h>
SoftwareSerial btSerial(10, 11); // RX, TX

void setup() {
  Serial.begin(9600);
  btSerial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  if (btSerial.available()) {
    char c = btSerial.read();
    if (c == '1') digitalWrite(13, HIGH);  // 开灯
    if (c == '0') digitalWrite(13, LOW);   // 关灯
    btSerial.print("LED:"); btSerial.println(c);
  }
}

App Inventon积木块

when Button5.Click() {
  BluetoothClient1.SendText("1")
  Label1.Text = "💡 灯已开"
}
when Button6.Click() {
  BluetoothClient1.SendText("0")
  Label1.Text = "⚫ 灯已关"
}

常见问题

Q1: 无法扫描到JDY-34?

  • 确认模块已上电(LED闪烁=未连接,常亮=已连接)
  • SPP模式需要在手机蓝牙设置中先配对
  • BLE模式直接在App中扫描

Q2: 连接后马上断开?

  • 检查供电是否稳定(3.3V,峰值电流需要足够)
  • 检查TX/RX是否接反
  • 尝试降低波特率

Q3: BLE写入数据无反应?

  • 确认使用了正确的Service和Characteristic UUID
  • 确认Characteristic支持Write操作
  • 尝试使用WriteWithResponse模式

总结

模式 组件 适合 数据量
SPP透传 BluetoothClient 大数据传输 大
BLE模式 BluetoothLE 低功耗场景 小
文档反馈