« 返回首页
概述
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 |
低功耗场景 |
小 |