You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过蓝牙将DHT11传感器数据从树莓派3发送至安卓手机

刚好折腾过树莓派3+DHT11+蓝牙传温湿度到安卓的方案,给你整理了一套亲测可行的步骤,跟着做就行:

一、先搞定硬件接线(树莓派3 + DHT11)

DHT11的接线超简单,对应树莓派引脚接好就行:

  • VCC:接树莓派的5V引脚(DHT11兼容3.3V,但5V供电更稳定)
  • DATA:接树莓派的GPIO4(物理引脚7)(你也可以选其他GPIO,后面代码里改对应编号就行)
  • GND:接树莓派的任意GND引脚
二、树莓派端环境配置

1. 安装DHT11的Python驱动

打开终端,依次输入命令:

sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install python3-pip -y
pip3 install Adafruit-DHT

2. 配置蓝牙串口服务(SPP协议)

树莓派3自带蓝牙,我们需要把它设置成串口模式,让安卓能通过蓝牙串口接收数据:

  1. 打开蓝牙控制台:
sudo bluetoothctl
  1. 在控制台里依次输入以下命令(每输完一条按回车):
power on
discoverable on
pairable on
exit
  1. 绑定蓝牙串口设备到/dev/rfcomm0(代码里可以直接访问这个串口):
sudo rfcomm bind hci0 1

提示:如果想开机自动绑定,把这条命令加到/etc/rc.local文件的exit 0之前就行。

三、树莓派端Python代码

先装串口操作库:

pip3 install pyserial

创建一个dht_bluetooth.py文件,复制下面的代码:

import Adafruit_DHT
import serial
import time

# 配置参数
DHT_SENSOR = Adafruit_DHT.DHT11
DHT_PIN = 4  # 对应刚才接线的GPIO4
BLUETOOTH_SERIAL_PORT = '/dev/rfcomm0'
BAUD_RATE = 9600

# 初始化蓝牙串口
try:
    ser = serial.Serial(BLUETOOTH_SERIAL_PORT, BAUD_RATE, timeout=1)
    print("蓝牙串口连接成功")
except Exception as e:
    print(f"蓝牙串口连接失败: {e}")
    exit(1)

# 循环读取温湿度并发送
while True:
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
    if humidity is not None and temperature is not None:
        # 格式化数据,方便安卓端解析
        data = f"温度: {temperature:.1f}°C, 湿度: {humidity:.1f}%\n"
        print(f"发送数据: {data.strip()}")
        ser.write(data.encode('utf-8'))
    else:
        print("读取温湿度失败,重试中...")
    time.sleep(2)  # 每2秒发送一次

运行代码:

sudo python3 dht_bluetooth.py
四、安卓端接收数据

两种方案,选适合你的:

方案1:用现成的蓝牙串口APP(快速上手)

去应用商店搜「Serial Bluetooth Terminal」,步骤如下:

  1. 打开APP,点击右上角搜索按钮,找到树莓派的蓝牙设备(默认名称是raspberrypi)
  2. 点击配对,输入默认密码0000或1234(没改过的话)
  3. 配对成功后点击连接,选择「Serial Port Profile (SPP)」服务
  4. 连接成功后,就能看到树莓派发来的温湿度数据了

方案2:自己写简单的安卓APP(自定义界面)

如果想做专属APP,核心是用蓝牙SPP协议连接,这里给个核心代码片段:
首先在AndroidManifest.xml里加权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 6.0+ 必需 -->

然后在Activity里的核心逻辑:

// 初始化蓝牙适配器
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
    Toast.makeText(this, "设备不支持蓝牙", Toast.LENGTH_SHORT).show();
    return;
}

// 开启蓝牙(如果未开启)
if (!bluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, 1);
}

// 连接树莓派蓝牙设备(替换成你的树莓派蓝牙MAC地址)
BluetoothDevice device = bluetoothAdapter.getRemoteDevice("你的树莓派蓝牙MAC地址");

// 连接SPP服务(固定UUID)
UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(uuid);
socket.connect();

// 读取并显示数据
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int bytes;
while (true) {
    bytes = inputStream.read(buffer);
    String data = new String(buffer, 0, bytes);
    // 在主线程更新UI显示数据
    runOnUiThread(() -> {
        tempHumidityTextView.setText(data);
    });
}

提示:实际开发要处理线程、异常、动态权限申请等问题,这只是核心逻辑示例。

五、常见问题排查
  • 蓝牙连接不上:检查树莓派蓝牙是否开启可发现模式,rfcomm是否绑定成功;安卓端是否完成配对
  • 温湿度读取失败:检查接线是否正确,GPIO编号是否和代码一致,DHT11是否损坏
  • 数据乱码:确保树莓派代码和安卓端的波特率一致(都是9600),编码都是UTF-8
  • 重启后蓝牙串口失效:把sudo rfcomm bind hci0 1加到/etc/rc.local的exit 0之前

内容的提问来源于stack exchange,提问作者Fahad Bin Alam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:39:00