基于demo调试onewire(结合esp32和18b20测温)

本文详细介绍了如何在ESP32上使用onewire库进行DS18B20温度传感器的配置、搜索和数据采集,包括安装1-Wirebus、设备搜索、设置分辨率以及实时温度读取。
摘要由CSDN通过智能技术生成

//代码为esp32根据onewire给出的例程文件,稍加注释如下。

#include "freertos/FreeRTOS.h"

#include "freertos/task.h"

#include "esp_log.h"

#include "esp_check.h"

#include "onewire_bus.h"

#include "ds18b20.h"

static const char *TAG = "example";//默认不修改

#define ONEWIRE_BUS_GPIO 15 //esp32端口(信号发射端口)

#define ONEWIRE_MAX_DS18B20 10 //预设的设备最大值数目

void app_main(void)

{

// install new 1-wire bus

onewire_bus_handle_t bus; //初始化发射端口通道

onewire_bus_config_t bus_config = //安装通道

{

.bus_gpio_num = 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));

ESP_LOGI(TAG, "1-Wire bus installed on GPIO%d", ONEWIRE_BUS_GPIO);//成功植入onewire并打印对应的GPIO端口号

int ds18b20_device_num = 0;

ds18b20_device_handle_t ds18b20s[ONEWIRE_MAX_DS18B20];//定义了一个用以存储18b20设备数量的空间,宏定义给出空间大小

onewire_device_iter_handle_t iter = NULL;//遍历总线上的18b20设备

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));//通过之前创建的句柄存储在iter中

ESP_LOGI(TAG, "Device iterator created, start searching...");

//循环遍历总线上所有的18b20设备:

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 = {}; //初始化找到的新设备

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++;//设备号加1

if (ds18b20_device_num >= ONEWIRE_MAX_DS18B20)//遍历设备达到预设的最大值

{

ESP_LOGI(TAG, "Max DS18B20 number reached, stop searching...");

break;

}

}

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));//删除之前的设备存储(iter为之前存储所遍历到的设备号的存储空间)

ESP_LOGI(TAG, "Searching done, %d DS18B20 device(s) found", ds18b20_device_num);

// set resolution for all DS18B20s

for (int i = 0; i < ds18b20_device_num; i++)

{

// set resolution

//函数调用,设置分辨率,调用的参数为:(设备,分辨率)

ESP_ERROR_CHECK(ds18b20_set_resolution(ds18b20s[i], DS18B20_RESOLUTION_12B));

}

// get temperature from sensors one by one

float temperatures[ds18b20_device_num];

while (1)

{

vTaskDelay(pdMS_TO_TICKS(200));//延时200ms

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], &temperatures[i])); //存储转换的温度值

//避免多个传感器通过总线连接造成前一个设备的数值被当前设备的数值覆盖,待实现

ESP_LOGI(TAG, "temperature read from DS18B20[%d]: %.2fC", i, temperatures[i]); //打印遍历到的设备的温度值

}

}

}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值