如何将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的代码差异
核心逻辑完全通用,仅需修改两处:
- 引脚定义:Uno使用数字引脚编号(例:
#define ONE_WIRE_BUS 2),ESP32使用GPIO编号(例:#define ONE_WIRE_BUS 4) - 电压适配:Uno为5V系统,ESP32为3.3V系统,DS18B20兼容两种电压,无需调整传感器接线
库的兼容性完全一致,OneWire和DallasTemperature库同时支持ESP32与Arduino Uno。
注意事项
- 必须添加4.7kΩ上拉电阻,否则单总线通信会出现不稳定或失败
- 若传感器无法被扫描到,检查接线是否牢固、上拉电阻是否正确、传感器是否损坏
- 9个传感器的总工作电流约9mA,ESP32的3.3V引脚可满足供电需求,若扩展更多传感器建议外接3.3V电源
内容的提问来源于stack exchange,提问作者ARTURO RODRIGUEZ
相关产品推荐
相关产品推荐

