Portál AbcLinuxu, 31. října 2025 14:03
Ahojte,
snažím se rozběhnout script pro vytvoření cyklu, který spočítá teplotu dohramdy a na konci provedu dělení a získám tak průměrnou teplotu.
Bohužel se mně to nějak nedaří dát dohromady.  Poradíte prosím?
#!/bin/bash
total_temp=0
avg_temp=0
for i in {1..5}
do
teplota="`cat /sys/bus/w1/devices/28-0301977927ab/w1_slave | sed -n 's/^.*\(t=[^ ]*\).*/\1/p' | sed 's/t=//' | awk '{x=$1}END{print(x/1000)}'`"
total_temp = $total_temp + $teplota
sleep 2
done
avg_temp = $total_temp / 4
echo $avg_temp
total_temp=$(($total_temp + $teplota)) avg_temp=$(($total_temp / 4))Co je vystupem prikazu:
cat /sys/bus/w1/devices/28-0301977927ab/w1_slave?
Co je vystupem prikazu:neco jako:cat /sys/bus/w1/devices/28-0301977927ab/w1_slave?
9a 01 4b 46 7f ff 0c 10 9f : crc=9f YES 9a 01 4b 46 7f ff 0c 10 9f t=25625
#!/bin/bash
total_temp=0
values=0
for i in {1..5}; do
    teplota=`awk -F'=' '/t/{print $2/1000}' /sys/bus/w1/devices/28-0301977927ab/w1_slave`
    total_temp=`echo $total_temp + $teplota | bc -l`
    values=$(($values + 1))
    sleep 2
done
avg_temp=`echo $total_temp / $values |bc -l`
echo $avg_temp
            let values++
((values++))
#!/bin/bash
total_temp=0
values=5
for ((i=0; i<$values; i++)); do
    teplota=`sed -n 's/^.*t=\([^ ]*\).*/\1/p' /sys/bus/w1/devices/28-0301977927ab/w1_slave`
    ((total_temp+=teplota))
    sleep 2
done
((avg_temp=total_temp/values))
echo ${avg_temp%???}.${avg_temp: -3}
A mas to aj s povodnou presnostou (fixed point arithmetic) a s minimom novych procesov (aj ta funkcnost toho sedu sa da prepisat do cisteho bashu, cim sa to asi 10x urychli, ale uz sa mi nechce).
            
# cat w1_awg.awk
BEGIN {
    if ((ARGC < 2) || (ARGC > 3)) {
        print "Usage:", ARGV[0], "/sys/bus/w1/devices/[sensor_id]/w1_slave [samples]"
        exit 1
    }
    if (ARGC==3){
        SAMPLES=ARGV[2]
        if (SAMPLES !~ "[1-9][0-9]*") {
            print "Number of samples must be number greather than zero"
            exit 2
        }
    } else {
        SAMPLES=5
    }
    FNAME=ARGV[1]
    TEMP_SUM=0
    for (i = 1; i <= SAMPLES; ++i) {
        while((getline line < FNAME) > 0 ) {
             if (line ~ "t=") {
                split(line, f, "=")
                TEMP_SUM+=f[2]/1000
             }
        }
        close(FNAME)
        system("sleep 2")
    }
    print TEMP_SUM/SAMPLES
}
# awk -f w1_awg.awk /sys/bus/w1/devices/28-0301977927ab/w1_slave 3 25.75 #
        Tiskni
            
                Sdílej:
                 
                 
                 
                 
                 
                 
            
    
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.