ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ESP32操作DS18B20

ESP32操作DS18B20

DS18B20电气摘要

  • 供电电压3-5.5V
  • 待机电流750nA,活动电流1mA
  • 一线通信方式,信号引脚为开漏结构
  • 硬件供电方式有两种接法。常规供电或总线总线
    在这里插入图片描述

测量相关特性

  • 精度±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表示负数。
    在这里插入图片描述

  • DS手册也举了结果对应的读到的数值例子,如下所示
    在这里插入图片描述

  • 不同测量分辨率下,转换时间是不同的,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.

  • 功能指令有如下这些
    在这里插入图片描述

  • 启动测量发送0x44指令

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

发送初始化脉冲

在这里插入图片描述

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

抓时序

启动测量
在这里插入图片描述

读取数据
在这里插入图片描述

芯片数据存放位置

1.芯片的配置都是存放在内部的EEPROM里面。里面的数据存放规则是这样的。下面对里面的常用的几个字节做下笔记:
在这里插入图片描述

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”
在这里插入图片描述

安装成功后会在工程目录下多一个目录espressif__ds18b20、espressif__onewire_bus,和一个文件idf_component.yml
在这里插入图片描述

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

运行结果

在这里插入图片描述

相关内容

一线驱动的首页
https://components.espressif.com/components/espressif/onewire_bus

附上代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <inttypes.h>
#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 2void app_main(void)
{float temperature;// install 1-wire busonewire_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 searchESP_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 DS18B20ds18b20_config_t ds_cfg = {};// check if the device is a DS18B20, if so, return the ds18b20 handleif (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 temperaturewhile (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

返回列表