ESP32操作DS18B20

DS18B20电气摘要

  • 供电电压3-5.5V
  • 待机电流750nA,活动电流1mA
  • 一线通信方式,信号引脚为开漏结构
  • 硬件供电方式有两种接法。常规供电或总线总线
    ESP32操作DS18B20_第1张图片

测量相关特性

  • 精度±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精度,

  • 负温度的表示方法,在温度数据的2字节数据里的S位表示正负号,S=0表示正数,1表示负数。
    ESP32操作DS18B20_第2张图片

  • DS手册也举了结果对应的读到的数值例子,如下所示
    ESP32操作DS18B20_第3张图片

  • 不同测量分辨率下,转换时间是不同的,12bit精度下,转换时间为750ms。

不常用特性

  • 每个设备在板载ROM中存储有唯一的64位序列码。可以用这个序列号来唯一确定温度sensor。这64bit数据的含义如下:
    在这里插入图片描述

  • 报警设置的能力,通过报警搜索命令可识别温度超出编程限制的设备。

通信时序

通信步骤:
1.发送初始化脉冲
2.ROM指令
3.功能指令

  • 每次通信都必须按照这个发送顺序发送。否则IC不给回应。

  • ROM指令工5个,用于确定是给哪个设备发送命令。

  • 如果总线上只有一个设备,可以用0x33这个read ROM来简化ROM搜索的过程。

  • 关于ROM指令的详细,可以参考Application Note 937: Book of iButton® Standards.

  • 功能指令有如下这些
    ESP32操作DS18B20_第4张图片

  • 启动测量发送0x44指令

  • 读取温度等数据0xbe指令

发送初始化脉冲

ESP32操作DS18B20_第5张图片

  • 主机拉低信号线,最小拉低480μs。然后释放总线后,DS18B20就会也- 拉低总线回应主机。可以通过这个过程了解DS18B20是否通信正常。

抓时序

启动测量
ESP32操作DS18B20_第6张图片

读取数据
ESP32操作DS18B20_第7张图片

芯片数据存放位置

1.芯片的配置都是存放在内部的EEPROM里面。里面的数据存放规则是这样的。下面对里面的常用的几个字节做下笔记:
ESP32操作DS18B20_第8张图片

2.Byte4是配置字节,用于配置分辨率,里面的R0,R1决定了4个分辨率档位,其他bit是固定的,必须原样保留。
在这里插入图片描述

ESP32操作DS18B20

在esp-idf的组件库里面,已经有DS18B20的组件库。因此直接拿来主义,重点记录怎么使用这个组件库。

库的首页
https://components.espressif.com/components/espressif/ds18b20

1.先安装依赖
打开terminal输入命令idf.py add-dependency “espressif/ds18b20^0.1.1”
ESP32操作DS18B20_第9张图片

安装成功后会在工程目录下多一个目录espressif__ds18b20、espressif__onewire_bus,和一个文件idf_component.yml
ESP32操作DS18B20_第10张图片

2.增加初始化函数和读取温度。在文档下面附上附上完整代码。这份代码就是官方组件给的例程。

运行结果

ESP32操作DS18B20_第11张图片

相关内容

一线驱动的首页
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

你可能感兴趣的:(ESP32,ESP32,DS18B20)