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

如何将9个DS18B20传感器连接到ESP32?编程及测温方法咨询

连接9个DS18B20到ESP32的实现方案

一、硬件连接说明

DS18B20采用单总线通信协议,所有传感器可共用同一GPIO引脚,接线规则如下:

  • 所有传感器的DQ引脚连接到ESP32的同一个GPIO(例:GPIO4)
  • 所有传感器的VCC引脚连接ESP32的3.3V输出(DS18B20兼容3.3V-5V,适配ESP32的3.3V逻辑)
  • 所有传感器的GND引脚连接ESP32的GND
  • 在DQ引脚与3.3V之间串联一个4.7kΩ上拉电阻(单总线通信必需)

二、编程实现步骤

1. 依赖库安装

在Arduino IDE中搜索并安装两个库:

  • OneWire:处理单总线通信
  • DallasTemperature:封装DS18B20的温度读取逻辑

2. 完整代码示例

#include <OneWire.h>
#include <DallasTemperature.h>

// 定义单总线使用的ESP32 GPIO引脚
#define ONE_WIRE_BUS 4

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// 存储9个传感器的唯一地址(每个地址8字节)
DeviceAddress sensorAddresses[9];

void setup() {
  Serial.begin(115200);
  sensors.begin();

  // 扫描总线上的传感器数量
  int deviceCount = sensors.getDeviceCount();
  Serial.print("检测到传感器数量:");
  Serial.println(deviceCount);

  // 校验传感器数量并存储地址
  if (deviceCount != 9) {
    Serial.println("警告:未找到9个传感器,请检查接线!");
  }
  for (int i = 0; i < deviceCount; i++) {
    if (sensors.getAddress(sensorAddresses[i], i)) {
      Serial.print("传感器");
      Serial.print(i);
      Serial.print(" 地址:");
      printSensorAddress(sensorAddresses[i]);
      Serial.println();
    } else {
      Serial.print("获取传感器");
      Serial.print(i);
      Serial.println(" 地址失败");
    }
  }
}

void loop() {
  // 触发所有传感器进行温度转换
  sensors.requestTemperatures();

  // 逐个读取并打印每个传感器的温度
  for (int i = 0; i < 9; i++) {
    if (sensors.validAddress(sensorAddresses[i])) {
      float tempC = sensors.getTempC(sensorAddresses[i]);
      float tempF = sensors.getTempF(sensorAddresses[i]);
      
      Serial.print("传感器");
      Serial.print(i);
      Serial.print(" 温度:");
      Serial.print(tempC);
      Serial.print("°C / ");
      Serial.print(tempF);
      Serial.println("°F");
    } else {
      Serial.print("传感器");
      Serial.print(i);
      Serial.println(" 地址无效,跳过读取");
    }
  }

  delay(2000); // 每2秒读取一次
}

// 辅助函数:打印传感器的十六进制地址
void printSensorAddress(DeviceAddress addr) {
  for (uint8_t i = 0; i < 8; i++) {
    if (addr[i] < 16) Serial.print("0");
    Serial.print(addr[i], HEX);
  }
}

3. 代码关键逻辑说明

  • 传感器地址存储:每个DS18B20有唯一的64位地址,通过sensors.getAddress()扫描并存储,后续通过地址区分不同传感器
  • 温度读取流程:先调用sensors.requestTemperatures()触发所有传感器转换温度,再通过sensors.getTempC(地址)读取指定传感器的温度值

三、与Arduino Uno的代码差异

核心逻辑完全通用,仅需修改两处:

  1. 引脚定义:Uno使用数字引脚编号(例:#define ONE_WIRE_BUS 2),ESP32使用GPIO编号(例:#define ONE_WIRE_BUS 4)
  2. 电压适配:Uno为5V系统,ESP32为3.3V系统,DS18B20兼容两种电压,无需调整传感器接线

库的兼容性完全一致,OneWire和DallasTemperature库同时支持ESP32与Arduino Uno。

注意事项

  • 必须添加4.7kΩ上拉电阻,否则单总线通信会出现不稳定或失败
  • 若传感器无法被扫描到,检查接线是否牢固、上拉电阻是否正确、传感器是否损坏
  • 9个传感器的总工作电流约9mA,ESP32的3.3V引脚可满足供电需求,若扩展更多传感器建议外接3.3V电源

内容的提问来源于stack exchange,提问作者ARTURO RODRIGUEZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 10:53:08