之前一直使用的是 树莓派 Zero W 实现的 室内温度上报的, 最近又有折腾树莓派的想法, 想着 ZeroW 也不贵.当时是 110元 要的. 但是等我打开 猫狗网站看看的时候才发现手里的树莓派成 香饽饽了. 涨价了.
刚好手里有之前 闲置的 ESP32 就拿来琢磨琢磨了
库
首先是 库的查找
我这里使用的是 Paul Stoffregen 的 OneWire
与 Miles Burtone 的 DallasTemperature
.
接线图
DS18B20 Vdd
DQ
之间接 4.7K
电阻, Vdd
接 ESP32 3v3
, GND
接 GND
, 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 测试的