ESP32 读取 DS18B20 温度

之前一直使用的是 树莓派 Zero W 实现的 室内温度上报的, 最近又有折腾树莓派的想法, 想着 ZeroW 也不贵.当时是 110元 要的. 但是等我打开 猫狗网站看看的时候才发现手里的树莓派成 香饽饽了. 涨价了.

刚好手里有之前 闲置的 ESP32 就拿来琢磨琢磨了

首先是 库的查找

我这里使用的是 Paul Stoffregen 的 OneWire 与 Miles Burtone 的 DallasTemperature.

接线图

DS18B20 Vdd DQ 之间接 4.7K 电阻, Vdd 接 ESP32 3v3 , GNDGND, DQ 接 ESP32 GPIO 16 我这个标注的是 D16 手里另外一块 ESP32 标注的 RX2 注意辨别

如图 这里是并联了 3 个 温度传感器

代码

下面是 代码 简单 注释

#include <OneWire.h>

#include <DallasTemperature.h>

// DS18B20 数据脚
#define ONE_WIRE_BUS 16

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

// 传感器数量
int tempDeviceNumber;

// 传感器地址
DeviceAddress tempDeviceAddress;

void callback() {
    // 占位符回调函数
}

void setup() {
    Serial.begin(115200);
    delay(1000); // 等待串口监视器打开

    Serial.print("数据 GPIO ");
    Serial.println(ONE_WIRE_BUS);
    while (true) {
        // 启动库
        sensors.begin();

        // 获取设备数量
        tempDeviceNumber = sensors.getDeviceCount();

        // 定位设备
        Serial.print("定位设备...");
        Serial.print("找到 ");
        Serial.print(tempDeviceNumber, DEC);
        Serial.println(" 个设备");

        // 发送获取温度的命令
        sensors.requestTemperatures();

        // 循环通过每个设备, 打印出地址
        for (int i = 0; i < tempDeviceNumber; i++) {
            // 搜索地址
            if (sensors.getAddress(tempDeviceAddress, i)) {
                Serial.print("找到设备 ");
                Serial.print(i, DEC);
                Serial.print(" 地址: ");
                Serial.print(parseAddress(tempDeviceAddress));
                float tempC = sensors.getTempC(tempDeviceAddress);
                Serial.print(" 温度: ");
                Serial.print(tempC);
                Serial.println(" ℃");
            } else {
                Serial.print("在 ");
                Serial.print(i, DEC);
                Serial.println(" 找到重影设备, 但无法检测地址。检查电源和电缆");
            }
        }
        delay(15000);
    }
}

void loop() {
    // This is not going to be called
}

// 解析地址
char * parseAddress(DeviceAddress deviceAddress) {
    static char res[18];
    static char * hex = "0123456789ABCDEF";
    uint8_t i, j;

    for (i = 0, j = 0; i < 8; i++) {
        res[j++] = hex[deviceAddress[i] / 16];
        res[j++] = hex[deviceAddress[i] & 15];
    }
    res[j] = '\0';

    return (res);
}

串口调试 输出

这里 后来又加进去 6 个 DS18B20 测试的

Post Author: admin