Portál AbcLinuxu, 26. prosince 2025 08:05
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.