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 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

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值