0

I'm working on embedded device where user connects and disconnects onewire sensors sometimes. Sensors are connected to DS2482 device, which is I2C to 1Wire converter. DS2482 is supported by Linux Kernel. There are only temperature sensors on the bus (DS18B20 family), also supported by Kernel.

I wrote shell script that is supposed to scan onewire bus and return new list of connected devices.

#!/bin/bash

file=/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves

if [ -f $file ]; then
    echo 1 > /sys/bus/w1/devices/w1_bus_master1/w1_master_search
    cat $file
else
    echo "Error: OneWire not initialized or hardware problem. File not found ($file)"
fi

Search doesn't work, disconnected devices still exist when I'm reading /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves.

I have tried to write bigger number to w1_master_search file. If

echo 100 > /sys/bus/w1/devices/w1_bus_master1/w1_master_search

Then I have checked if file decrements:

cat /sys/bus/w1/devices/w1_bus_master1/w1_master_search

and it decrements every 10 seconds (w1_master_timeout is set to 10), but device list (w1_master_slaves) remain unchanged for a very long time. Disconnected devices disappear after 10 or more searches.

Is there a way to get connected devices instantly?


Edit:

I wrote another script that removes all devices manuall and starts new device scan, however it works unstable. After I disconnect and connect all sensors somethimes only one sensor is visible.

#!/bin/bash
# set -x

slaves_file=/sys/bus/w1/devices/w1_bus_master1/w1_master_slaves
search_file=/sys/bus/w1/devices/w1_bus_master1/w1_master_search
remove_file=/sys/bus/w1/devices/w1_bus_master1/w1_master_remove

# 1. Remove all slaves

slaves=`cat $slaves_file`;
newline='
'
for slave in $slaves
do
    if [ ${#slave} == 15 ]; then
#        echo "Removing $slave"
        echo "$slave" > $remove_file;
    fi
done

# 2. Scan

if [ -f $slaves_file ]; then
#   echo "Scanning onewire..."
    echo 1 > $search_file
#   echo "Waiting for devices to settle up"
    sleep 1
#   echo "Device list:"
    cat $slaves_file | grep "^28"
#    echo "End of device list."
else
    echo "Error: OneWire not initialized or hardware problem. File not found ($slaves_file)"
fi

# set +x

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.