如何通过蓝牙将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自带蓝牙,我们需要把它设置成串口模式,让安卓能通过蓝牙串口接收数据:
- 打开蓝牙控制台:
sudo bluetoothctl
- 在控制台里依次输入以下命令(每输完一条按回车):
power on discoverable on pairable on exit
- 绑定蓝牙串口设备到
/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」,步骤如下:
- 打开APP,点击右上角搜索按钮,找到树莓派的蓝牙设备(默认名称是
raspberrypi) - 点击配对,输入默认密码
0000或1234(没改过的话) - 配对成功后点击连接,选择「Serial Port Profile (SPP)」服务
- 连接成功后,就能看到树莓派发来的温湿度数据了
方案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
相关产品推荐
相关产品推荐

