精度±0.5℃,大测量范围时精度±2℃
最大测量范围-55℃ ~ +125℃
分辨率四挡可调9-12bit。每档对应的增量是0.5°C、0.25°C、0.125°C和0.0625°C。
虽然分辨率可以做到0.0625℃,但是还是会受制于物理精度0.5℃。只能说在高分辨率下,起对温度更敏感。但是测量误差依然是0.5℃
上电默认是12bit精度,
不同测量分辨率下,转换时间是不同的,12bit精度下,转换时间为750ms。
通信步骤:
1.发送初始化脉冲
2.ROM指令
3.功能指令
每次通信都必须按照这个发送顺序发送。否则IC不给回应。
ROM指令工5个,用于确定是给哪个设备发送命令。
如果总线上只有一个设备,可以用0x33这个read ROM来简化ROM搜索的过程。
关于ROM指令的详细,可以参考Application Note 937: Book of iButton® Standards.
启动测量发送0x44指令
读取温度等数据0xbe指令
1.芯片的配置都是存放在内部的EEPROM里面。里面的数据存放规则是这样的。下面对里面的常用的几个字节做下笔记:
2.Byte4是配置字节,用于配置分辨率,里面的R0,R1决定了4个分辨率档位,其他bit是固定的,必须原样保留。
在esp-idf的组件库里面,已经有DS18B20的组件库。因此直接拿来主义,重点记录怎么使用这个组件库。
库的首页
https://components.espressif.com/components/espressif/ds18b20
1.先安装依赖
打开terminal输入命令idf.py add-dependency “espressif/ds18b20^0.1.1”
安装成功后会在工程目录下多一个目录espressif__ds18b20、espressif__onewire_bus,和一个文件idf_component.yml
2.增加初始化函数和读取温度。在文档下面附上附上完整代码。这份代码就是官方组件给的例程。
一线驱动的首页
https://components.espressif.com/components/espressif/onewire_bus
附上代码
#include
#include
#include
#include
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_log.h"
// 需要加入这些头文件
#include "onewire_bus.h"
#include "ds18b20.h"
static const char *TAG = "ds18b20_main";
#define EXAMPLE_ONEWIRE_BUS_GPIO 21
#define EXAMPLE_ONEWIRE_MAX_DS18B20 2
void app_main(void)
{
float temperature;
// install 1-wire bus
onewire_bus_handle_t bus = NULL;
onewire_bus_config_t bus_config = {
.bus_gpio_num = EXAMPLE_ONEWIRE_BUS_GPIO,
};
onewire_bus_rmt_config_t rmt_config = {
.max_rx_bytes = 10, // 1byte ROM command + 8byte ROM number + 1byte device command
};
ESP_ERROR_CHECK(onewire_new_bus_rmt(&bus_config, &rmt_config, &bus));
int ds18b20_device_num = 0;
ds18b20_device_handle_t ds18b20s[EXAMPLE_ONEWIRE_MAX_DS18B20];
onewire_device_iter_handle_t iter = NULL;
onewire_device_t next_onewire_device;
esp_err_t search_result = ESP_OK;
// create 1-wire device iterator, which is used for device search
ESP_ERROR_CHECK(onewire_new_device_iter(bus, &iter));
ESP_LOGI(TAG, "Device iterator created, start searching...");
do
{
search_result = onewire_device_iter_get_next(iter, &next_onewire_device);
if (search_result == ESP_OK)
{ // found a new device, let's check if we can upgrade it to a DS18B20
ds18b20_config_t ds_cfg = {};
// check if the device is a DS18B20, if so, return the ds18b20 handle
if (ds18b20_new_device(&next_onewire_device, &ds_cfg, &ds18b20s[ds18b20_device_num]) == ESP_OK)
{
ESP_LOGI(TAG, "Found a DS18B20[%d], address: %016llX", ds18b20_device_num, next_onewire_device.address);
ds18b20_device_num++;
}
else
{
ESP_LOGI(TAG, "Found an unknown device, address: %016llX", next_onewire_device.address);
}
}
} while (search_result != ESP_ERR_NOT_FOUND);
ESP_ERROR_CHECK(onewire_del_device_iter(iter));
ESP_LOGI(TAG, "Searching done, %d DS18B20 device(s) found", ds18b20_device_num);
// Now you have the DS18B20 sensor handle, you can use it to read the temperature
while (1)
{
for (int i = 0; i < ds18b20_device_num; i++)
{
ESP_ERROR_CHECK(ds18b20_trigger_temperature_conversion(ds18b20s[i]));
ESP_ERROR_CHECK(ds18b20_get_temperature(ds18b20s[i], &temperature));
ESP_LOGI(TAG, "temperature read from DS18B20[%d]: %.2fC", i, temperature);
}
}
}
初始化过程
1.初始化1线驱动
2.搜索总线上的所有的设备,搜索到的设备存放到数组ds18b20s里。
读取温度的过程
1.触发温度转换ds18b20_trigger_temperature_conversion
2.获取数据ds18b20_get_temperature