Searching for all devices connected to the One_Wire bus

Hello, I am working on a project that is in charge of measuring temperature and sending values ​​via BLE. I am working with the DS18B20 sensor and I have helped myself a lot with the examples that Zephyr offers.


I have 2 devices connected to one One-wire bus, and in order to receive values ​​from each sensor, I have to manually enter their ROM addresses.

This manual entry is inefficient and I would like to make a "ROM finder" that would at least print the ROM addresses of devices connected to the bus.



J3 and J4 represent the header on which the one-wire is connected and with the help of GPIO 1 and GPIO 3 I am able to read data from the sensor (only if GPIO_0 and GPIO_2 are in the state of logic 1)

This is my device tree:

&arduino_serial {
    status = "okay";

    w1_0: w1-zephyr-serial-0 {
        compatible = "zephyr,w1-serial";
        #address-cells = <1>;
        #size-cells = <0>;
        status = "okay";

        ds18b20_0 {
            label = "SENSOR_DS18B20_0";
            compatible = "maxim,ds18b20";
            family-code = <0x28>;
            resolution = <12>;
            status = "okay";
        };
        ds18b20_1 {
            label = "SENSOR_DS18B20_1";
            compatible = "maxim,ds18b20";
            family-code = <0x28>;
            resolution = <12>;
            status = "okay";
        };
    };  
};


#pragma once
#include <zephyr/kernel.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/device.h>
#include <zephyr/kernel.h>
#include <zephyr/types.h>


#define MAX_DEVICES 2  

void print_rom_address(const struct w1_rom *rom) {
    uint64_t rom_value = w1_rom_to_uint64(rom);
    LOG_INF("ROM Address: %016llX", rom_value);
}


void scan_ds18b20_sensors(const struct device *w1_dev) {
    struct w1_rom rom;
    uint8_t last_discrepancy = 0;
    int found_devices = 0;
    int ret;

    if (!w1_dev || !device_is_ready(w1_dev)) {
        LOG_ERR("1-Wire device is not ready or found.");
        return;
    }

    LOG_INF("Scanning 1-Wire bus for DS18B20 devices...");

    w1_reset_bus(w1_dev);

    while (found_devices < MAX_DEVICES) {
        ret = w1_search_rom(w1_dev, &rom, &last_discrepancy);
        if (ret) {
            break;
        }

        LOG_INF("Found DS18B20 sensor %d:", found_devices + 1);
        print_rom_address(&rom);
        found_devices++;
    }

    if (found_devices == 0) {
        LOG_WRN("No DS18B20 sensors found.");
    } else {
        LOG_INF("Total found DS18B20 sensors: %d", found_devices);
    }
}



main:
int main() {

    while (true) {
        const struct device *w1_dev = DEVICE_DT_GET(DT_NODELABEL(w1_0));

    if (!device_is_ready(w1_dev)) {
        LOG_ERR("1-Wire device not found!");
        return;
    }

    LOG_INF("Starting DS18B20 scanning...");
    scan_ds18b20_sensors(w1_dev);
    k_sleep(K_SECONDS(1));
    }
    
    

    return 0;
}


I am currently receiving invalid addresses that I cannot use.


I will be very happy for any advice. I REALLY can't move on from this….

Related