Skip to content

概述

DS18B20 是一颗经典的数字温度传感器,测量范围 -55°C ~ +125°C(-10~+85°C 范围内精度 ±0.5°C),12 位分辨率下最小能分辨 0.0625°C。它同样使用单总线通信(一根线既传数据又传时钟),而且每一颗 DS18B20 出厂时都烧录了唯一 64 位序列号,所以一根数据线上可以并联挂多颗分别测温(本教程先测一颗)。本教程用 Ai-WB2 开发板读取 DS18B20 的温度,串口实时打印,并走完 接线 → 代码编写 → 编译 → 烧录(把编译好的程序写进开发板芯片)→ 运行验证 的完整流程。

用大白话讲:DS18B20 就像一颗有唯一"身份证号"(64 位序列号)的数字温度计。主控通过一根线发一串特定长短的脉冲跟它"对话":先发"复位"脉冲唤醒它,再发"读温度"指令,它就把 12 位温度数据通过这根线逐位传回来。注意它像开漏输出一样需要上拉电阻(把线路默认拉到高电平的小电阻),没有上拉就读不到数据。

本教程基于安信可官方 SDKAi-Thinker-Open/Ai-Thinker-WB2,版本 release_bl_iot_sdk_1.6.40)的官方示例 applications/iot-solution/demo_ds18b20 编写,代码可在本地 SDK 中直接找到。

🎯本页目标通过单总线读取 DS18B20 温度,串口每 500ms 打印一次温度,理解单总线时序与多文件驱动工程结构。
🧰前置条件① Ai-WB2 开发板 + DS18B20 温度传感器(TO-92 封装或模块)② 已按 [SDK 安装](../sdk/sdk_intro) 完成环境搭建,并完成 [GPIO输出(点亮LED)](../basic/gpio_led)。
🔗相关章节同为单总线的温湿度传感器见 [DHT11 温湿度传感器](./dht11);更高精度的 I2C 温湿度传感器见 [SHT30 温湿度传感器](./sht3x)。

硬件接线

按官方示例接线(见 SDK applications/iot-solution/demo_ds18b20/README.md),用杜邦线(两端带插针的连接线)连接:

Ai-WB2 引脚 DS18B20 引脚
IO4 DQ(DATA)
3V3 VCC(红色线)
GND GND(黑色线)

⚠️ 必须在 DQ 与 3V3 之间接一个 4.7kΩ 上拉电阻(把线路默认拉到高电平的小电阻)。DS18B20 数据线是开漏输出(只能拉低不能拉高),没有上拉电阻就读不到数据——这是本传感器最容易踩的坑。 💡 DS18B20 支持 3.3V~5V 供电,本教程统一 3.3V。若用手捏住 TO-92 封装的传感器,温度数值会缓慢上升,方便验证。

进入示例工程

本教程直接使用官方 SDK 自带的 demo_ds18b20 示例工程,打开终端进入该工程目录:

cd ~/Ai-Thinker-WB2/applications/iot-solution/demo_ds18b20

说明:cd 是「进入目录」命令,这里进入 DS18B20 示例工程目录;后续的 make 编译、make flash 烧录命令都必须先在这个目录里执行。

本工程是多文件工程:主程序 + 官方移植的 DS18B20 驱动库(源自开源 LibDriver 驱动,封装了单总线复位/读写位/读写字节时序),结构如下:

文件 作用
demo_ds18b20/main.c 主程序源码,本教程主要查看的文件
demo_ds18b20/driver_ds18b20_basic.c/h 基础读写接口(初始化、读温度)
demo_ds18b20/driver_ds18b20.c/h 单总线时序核心(复位、读写位、读写字节)
demo_ds18b20/driver_ds18b20_alarm.c/h 报警(阈值)功能,本教程未用到
demo_ds18b20/driver_ds18b20_search.c/h 总线上搜索多颗传感器(64 位序列号),本教程未用到
demo_ds18b20/driver_ds18b20_interface_bl602.c 平台适配层:把驱动接到 WB2 的 GPIO4 上
Makefile 编译入口,一般无需修改
编写代码

打开 demo_ds18b20/main.c,本步完整代码已移至文末,见:

📜 完整代码 — 位于本页「完整代码」章节,默认折叠,点击展开,与官方示例(applications/iot-solution/demo_ds18b20/demo_ds18b20/main.c)完全一致。

代码要点:

代码 作用
ds18b20_basic_init() 初始化 DS18B20 驱动(配置单总线引脚 IO4),不初始化驱动无法通信
ds18b20_basic_read(&temperature) 发起一次温度转换并读回 12 位温度数据(分辨率 0.0625°C),读失败返回 1
blog_info("%.2f C degree", temperature) 串口打印温度(°C,两位小数),不打印就看不到测量结果
vTaskDelay(pdMS_TO_TICKS(500)) 每 500ms 采样一次;太快温度转换(12 位约 750ms)来不及完成,读到的会是旧值
编译工程

在工程目录执行编译:

make -j8

说明:make 是「编译工程」命令,把代码变成开发板能运行的固件(程序文件);-j8 表示用 8 个核并行编译,速度更快。

编译成功后生成固件 build_out/demo_ds18b20.bin

⚠️ 若提示 riscv64-unknown-elf-gcc: command not found,说明工具链权限未配置,先执行 cd toolchain/riscv/Linux && . chmod755.sh 再重新编译。

烧录固件

开发板保持 USB 连接,确认串口设备号(Linux 下通常为 /dev/ttyUSB0),执行烧录:

make flash p=/dev/ttyUSB0 b=921600

说明:make flash 是「烧录」命令,把编译好的固件写进开发板芯片。p= 后面是串口设备号(要改成你电脑上实际的串口,可用 ls /dev/ttyUSB* 查看),b= 是烧录波特率(传输速度)。

⏳ 烧录过程中按提示长按开发板 EN 键进入下载模式(部分开发板自动进入),等待进度条完成即烧录成功。 Windows 平台烧录方法见 Windows 平台快速开始

运行验证

烧录完成后开发板自动重启运行,打开串口助手(波特率 921600,波特率 = 串口传输速度,收发两端必须设成一样),每 500ms 打印一次温度:

26.50 C degree
26.50 C degree
...

用手捏住传感器,温度应缓慢上升;松手后缓慢回落。

看到串口每 500ms 打印一次温度即为成功;如果温度恒为 85.00 C degree(DS18B20 上电默认值)或一直不打印,说明还没成功,对照文末「常见问题与踩坑提示」排查。

💡 用逻辑分析仪观察 IO4 波形,可看到单总线的复位脉冲与数据位时序(见官方示例 img/logic_analyzer.jpg)。

代码执行流程

例程从启动到运行的完整流程如下(图中的循环箭头表示反复执行):


本文 API 汇总

ds18b20_basic_init()

初始化 DS18B20 驱动:注册平台接口函数(GPIO 读写、微秒延时、关中断)并完成传感器复位自检。

参数

返回值:成功返回 0;失败返回 1(如传感器未应答)。驱动实现见 demo_ds18b20/driver_ds18b20_basic.c

ds18b20_basic_read(temperature)

发起一次温度转换并读取结果:单总线复位 → 发读温度指令 → 读回 2 字节温度原始值 → 换算成浮点温度(°C)。

参数

  • temperaturefloat * 输出指针,收到温度值(单位 °C,如 26.50),必填

返回值:成功返回 0;失败返回 1(读失败或 CRC 错误)。驱动实现见 demo_ds18b20/driver_ds18b20_basic.c

blog_info(fmt, ...)

输出一条 INFO 级日志(UART0,受级别过滤),本教程打印温度。

参数

  • fmt:格式化字符串,同 printf 用法,必填
  • ...:变参,与 fmt 占位符对应,可省略

返回值:无

vTaskDelay(ms)

让当前任务挂起指定毫秒数,期间让出 CPU 给其他任务。

参数

  • ms:延时毫秒数,可选值:任意非负整数(内部经 pdMS_TO_TICKS 换算为系统节拍)

返回值:无


完整代码

以下为 demo_ds18b20/main.c 完整源码,与官方示例(applications/iot-solution/demo_ds18b20/demo_ds18b20/main.c)完全一致。本工程为多文件工程,其余驱动文件(driver_ds18b20*.c/hdriver_ds18b20_interface_bl602.c)位于同一目录,无需修改:

📜 点击展开 demo_ds18b20/main.c 完整代码
c
#include <stdio.h>

#include <FreeRTOS.h>
#include <task.h>
#include <blog.h>
#include "driver_ds18b20_basic.h"

int main(void)
{
    ds18b20_basic_init();

    float temperature;
    for (;;) {
        ds18b20_basic_read(&temperature);
        blog_info("%.2f C degree\r\n", temperature);
        vTaskDelay(pdMS_TO_TICKS(500));
    }

    return 0;
}

常见问题与踩坑提示

⚠️ 温度恒为 85.00°C(读不到真实温度)
原因85.00 是 DS18B20 上电默认值——只要通信失败(最常见是忘了接 4.7kΩ 上拉电阻),读数就会停在这个值
解决:确认 DQ 与 3V3 之间有 4.7kΩ 上拉电阻;核对接线(VCC 红线、GND 黑线、DQ 接 IO4);重新插紧杜邦线

⚠️ 串口一直不打印数据(读不到)
原因:接线错误、DQ 未接 IO4、传感器损坏,或 3.3V 供电不足
解决:对照接线表逐一核对;确认 VCC 接 3V3、GND 接 GND(共地 = 两个设备的地线必须接在一起);换一颗 DS18B20 测试

⚠️ 温度数值乱跳或不变
原因:导线过长/接触不良导致时序抖动,或两次读取间隔太短转换未完成
解决:缩短杜邦线(<20cm);确认上拉电阻可靠焊接;可把 vTaskDelay 加大到 1000 再试

⚠️ 找不到串口设备或提示无权限
原因:Linux 下 /dev/ttyUSB0 不存在或权限不足,Windows 下未安装 USB 转串口驱动
解决:Linux 用 ls /dev/ttyUSB* 确认设备号,权限不足执行 sudo usermod -aG dialout $USER 后重新登录;Windows 在设备管理器安装驱动并确认 COM 口号

⚠️ 烧录一直卡住等待,进度条不动
原因:未进入下载模式,或数据线只能充电不能传数据
解决:烧录时按提示长按 EN 键进入下载模式;换一根能传数据的 Type-C 数据线后重试

⚠️ 执行 make 报找不到 Makefile
原因:在错误的目录执行了编译命令(必须在示例工程目录内)
解决:先执行 cd ~/Ai-Thinker-WB2/applications/iot-solution/demo_ds18b20 进入工程目录,再执行 make -j8

运行自检

串口每 500ms 打印一次温度,手捏传感器温度缓慢上升(不再是 85.00 固定值),即 DS18B20 温度测量验证通过。

遇到问题?

如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

Released under the MIT License. Build Time 2026-09-11 14:52:23