基于Arduino的ESP32-S3 +DS18B20(3pin)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

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传感器的驱动》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈乾智

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值