//代码为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]); //打印遍历到的设备的温度值
}
}
}