提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
DS18B20作为经典的单总线数字温度传感器,凭借其独特的单线通信、多点组网能力,在物联网领域广泛应用。本文将以ESP32-S3-DevKitC-1开发板为核心,详解从硬件连接到代码实现的完整测温方案,并提供OLED屏显扩展方案。相比传统模拟传感器,DS18B20可直接输出数字信号,抗干扰能力提升50%
一、硬件准备
1.1 器件对比
1.2 接线方案
接线示意:
VCC------------- 3.3V / 5V
DQ ------------- 6(需4.7K上拉电阻) 若串口显示-127,可能是4.7k不够,那就接更大的电阻
GND------------ GND
注:也可以直接去淘宝买DS18B20的驱动器,其实也就是接了一个4.7K的电阻,没必要浪费钱,驱动器也不适合打PCB板
DQ口接上拉电阻是为保证传感器一直带正电,处于工作状态,不掉线。
二、驱动实现
2.1 开发环境配置
添加库文件
OneWire库(单总线协议支持)
DallasTemperature库(高级温度控制)
2.2核心代码解析
代码如下(示例):
#include <OneWire.h>
#include <DallasTemperature.h>
#define DSB_PIN 6 // 推荐使用GPIO6(避开SPI/I2C冲突)
OneWire oneWire(DSB_PIN);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
sensors.begin(); // 初始化总线
sensors.setResolution(12); // 9-12 该功能将DS18B20的内部模数转换器的分辨率设置为9位,10位,11位或12位,分别对应于0.5°C,0.25°C,0.125°C和0.0625°C的增量
}
void loop() {
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0); // 获取第一个设备温度
// 数据有效性校验(防止读取失败)
if(temp != DEVICE_DISCONNECTED_C) {
Serial.print("温度:");
Serial.print(temp);
Serial.println("℃");
}
delay(1000);
}
关键函数说明:
sensors.begin():初始化单总线设备,自动检测连接数量
setResolution(9~12):调节测量精度(12位时转换需750ms4)
getTempCByIndex(n):获取第n个传感器的摄氏温度
三、拓展应用
3.1 OLED屏显集成
结合之前发的那篇文章《ESP32-S3+1.3寸OLED》
#include <Arduino.h>
#include <SH1106Wire.h>
#define SDA 47
#define SCL 21
float temp;
SH1106Wire display(0x3c,SDA,SCL);
void oledbegin();
void displaysensor() ;
void displayTemp();
void setup() {
Serial.begin(9600);
oledbegin();
}
void loop() {
// put your main code here, to run repeatedly:
displaysensor() ;
displayTemp();
}
void oledbegin() {
// OLED显示屏初始化检测
if(!display.init()) { // 尝试初始化OLED显示屏[1,5](@ref)
Serial.println("OLED init failed"); // 初始化失败时通过串口输出错误信息
while (1) delay(100); // 进入死循环阻止程序继续执行[1](@ref)
}
// 初始化成功后执行以下设置
display.flipScreenVertically(); // 将屏幕显示内容垂直翻转(0→180度)[5](@ref)
display.clear(); // 清空屏幕显示内容和显存缓冲区[4,7](@ref)
display.setFont(ArialMT_Plain_10); // 设置显示字体为Arial 10号等宽字体[7](@ref)
}
void displaysensor() {
display.drawString(0, 0, "Hello World");
display.drawString(0, 10, "oled");
display.drawString(0, 20, "电磁阀");
display.display();
}
void displayTemp() {
temp = 0.0 ;
display.drawString(0, 20, String(temp)+"℃");
display.display();
}
3.2 多点测温方案
// 检测总线设备数量
void checkDevices() {
int count = sensors.getDeviceCount();
Serial.print("发现");
Serial.print(count);
Serial.println("个传感器");
// 遍历读取所有设备
for(int i=0; i<count; i++){
float t = sensors.getTempCByIndex(i);
Serial.print("传感器"); Serial.print(i);
Serial.print(": "); Serial.println(t);
}
}
四、常见问题排查
总结
本文是为验证《基于Arduino的ESP32-S3-DevKitC-1对DS18B20传感器的驱动》