Титла: ds18b20 грешно връщане на температурата
Публикувано от: vladi4k0 в Feb 09, 2018, 22:02
Моля за малко помощ ползвам следното за да взимам температурата но по някой път ми връща температура от порядака на -1000 + 1000 градуса и съответно графиката се нарушава като в rrdtool има стойност в слединя ред -+1000 -+250 -+50 и се нормализира. Всичко е просто с любителска цел затова несе чудете на писането :) GeSHi (Bash): /project/data-ds18b20/# cat getvalue1.sh #!/bin/bash # a script to read and save temperature readings from all the group 28 1-wire temperature sensors # # get all devices in the '28' family FILES=" 28-041694f0f0ff " # iterate through all the devices for file in $FILES do # get the 2 lines of the response from the device if [ -f "/sys/bus/w1/devices/w1_bus_master1/$file/w1_slave" ]; then GETDATA=`cat /sys/bus/w1/devices/w1_bus_master1/$file/w1_slave` echo -e "$GETDATA" | grep -e "00 00 00 00 00 00 00 00 00" >&2 if [ $? -ne 0 ]; then GETDATA1=`echo "$GETDATA" | grep crc` GETDATA2=`echo "$GETDATA" | grep t=` # get temperature TEMP=`echo $GETDATA2 | sed -n 's/.*t=//;p'` # # test if crc is 'YES' and temperature is not -62 or +125 if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP != "-62" -a $TEMP != "125000" ] then # crc is 'YES' and temperature is not -62 or +85 - so save result #echo `date +"%d-%m-%Y %H:%M:%S "; echo $GETDATA2 | sed -n 's/.*t=//;p'` #echo `echo $GETDATA2 | sed -n 's/.*t=//;p'` TEMP=$(echo "scale=2; `echo $GETDATA2 | sed -n 's/.*t=//;p'`/1000" | bc) echo $TEMP else # there was an error (crc not 'yes' or invalid temperature) # try again after waiting 1 second sleep 1 # get the 2 lines of the response from the device again GETDATA=`cat /sys/bus/w1/devices/w1_bus_master1/$file/w1_slave` GETDATA1=`echo "$GETDATA" | grep crc` GETDATA2=`echo "$GETDATA" | grep t=` # get the temperature from the new response TEMP=`echo $GETDATA2 | sed -n 's/.*t=//;p'` if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP != "-62" -a $TEMP != "125000" ] then # save result if crc is 'YES' and temperature is not -62 or +125 - if not, just miss it and move on #echo `date +"%d-%m-%Y %H:%M:%S "; echo $GETDATA2 | sed -n 's/.*t=//;p'` TEMP=$(echo "scale=2; `echo $GETDATA2 | sed -n 's/.*t=//;p'`/1000" | bc) echo $TEMP fi # this is a retry so log the failure - record date/time & device ID #echo `date +"%d-%m-%Y %H:%M:%S"`" - ""$file" echo "U" continue fi else echo "U" continue fi else echo "U" continue fi done exit 0
и GeSHi (Bash): #/bin/bash TEMP1=`/project/data-ds18b20/getvalue1.sh` TEMP2=`/project/data-ds18b20/getvalue2.sh` TEMP3=`/project/data-ds18b20/getvalue3.sh` TEMP4=`/project/data-ds18b20/getvalue4.sh` echo "$TEMP1:$TEMP2:$TEMP3:$TEMP4"
и GeSHi (Bash): /project/data-ds18b20# cat write_rdd.sh #!/bin/bash DIGITEMP=/project/data-ds18b20/1in4.sh LOGFILE=/project/data-ds18b20/log/solar-access.log RRD_PATH=/project/data-ds18b20 # # Function to call digitemp with a given sensor ID and location. # Generates a log message in $LOGFILE # function ProcessSensor { sensor_id=$1 sensor_location=$2 cur_date=$(date +"%Y/%m/%d %H:%M:%S") dateEpoch=$(date -d "$cur_date" +%s) # cur_temp=$(/usr/bin/digitemp -t $sensor_id -q -c /etc/digitemprc -o%.2F) cur_temp=$($DIGITEMP) # echo $cur_date $sensor_location F: $cur_temp >> $LOGFILE #echo $cur_date $sensor_location C: $cur_temp >> $LOGFILE #rrdtool update $RRD_PATH/$sensor_location.rrd $dateEpoch:$cur_temp #if [[ $cur_temp == ?(-)+([0-9.])":"?(-)+([0-9.])":"?(-)+([0-9.]?)":"?(-)+([0-9.]) ]] 2>/dev/null #then #echo $cur_date $sensor_location C: $dateEpoch:$cur_temp >> $LOGFILE rrdtool update $RRD_PATH/$sensor_location.rrd $dateEpoch:$cur_temp #else #LOGFILE=/project/data-ds18b20/log/solar-error.log #echo $cur_date $sensor_location C: error $cur_temp >> $LOGFILE #fi } ProcessSensor 1 ds18b20 #ProcessSensor 1 Garage #ProcessSensor 2 Living_Room #ProcessSensor 3 Master_Bedroom
мислех да сложа да проверявам стойноста ако е по голяма +150 или по малка -25 за невалидна. но неще ме яде от вътре.
Титла: Re: ds18b20 грешно връщане на температурата
Публикувано от: Naka в Feb 10, 2018, 12:56
Мерене на температурата на какво?
Незнам за какво и къде се използва този сензор, nо един път имах подобни проблеми с lm_sensors и стандартните вградени сенсори в IO чипа. От време на време връщаше температура +127 което му е максималната на насищане. Скачаше от +40,50реалната случайно на +127 след това се връщаше. Оказа се хардуерен проблем и поизгорял сенсор.
А съм сигурен че при мене е хардуерен проблем, защото в началото близо 1 година мереше нормално, и след това почна да ги прави тези подскоци.
Пробвай на ръка с много пъти команди от вида cat /sys/bus/**** (ако може така да се чете температурата) да видиш дали ще върне някой път грешна стойност.
Титла: Re: ds18b20 грешно връщане на температурата
Публикувано от: makeme в Feb 10, 2018, 18:58
Дай да видим резултата след: echo -e "$GETDATA" | grep -e "00 00 00 00 00 00 00 00 00" >&2 и GETDATA1=`echo "$GETDATA" | grep crc` GETDATA2=`echo "$GETDATA" | grep t=` че не знаем как изглежда този файл, дето четеш. Иначе и аз имам един сензор тука на пайчето (само че dht22) и той чат пат връща невярна информация. Пробвай метода на @Naka като сложиш един "watch -n 1" отпред и виж дали скрипта е невинен :)
Титла: Re: ds18b20 грешно връщане на температурата
Публикувано от: vladi4k0 в Feb 11, 2018, 00:01
ползвам и dht22 и там излезе проблем :) git clone https://github.com/xpertsavenue/WiringOP-Zero.git Installation cd WiringOP-Zero chmod +x ./build sudo ./build на orangepi zero GeSHi (Bash): root@orangepizero:/project/dht22/install-dht# ./dht DHT22 temperature/humidity test Humidity = 34.9 % Temperature = 33.1 *C Humidity = 0.0 % Temperature = 0.0 *C Humidity = 0.0 % Temperature = 0.0 *C Humidity = 35.0 % Temperature = 33.1 *C Humidity = 0.0 % Temperature = 0.0 *C ^C root@orangepizero:/project/dht22/install-dht# ./dht22 DHT22 temperature/humidity test Data not good, skip Humidity = 0.0 % Temperature = 0.0 *C (32.0 *F) Data not good, skip Humidity = 0.0 % Temperature = 0.0 *C (32.0 *F) Data not good, skip Data not good, skip
и сега като пуснах греда 0.0 като на dht файла промених а в dht22 несъм пипал нищо else { printf( "Data not good, skip\n" ); } да вика пак същата функция до верен резултат else { read_dht_data(); //printf( "Data not good, skip\n" ); } но и там :( направих си вентилатора в банята да се включва и изключва по влажност оп проблема бързо се установи за dht22 след ъпдейт на арамбина е сменило пак /etc/default/cpufrequtils MIN_SPEED=240000 за ds18b20 проблема е в годината веднъж или в месец да върне големи температури но ме дразни иначе 7-8 години ползвам mcp9700a и всичко е точно, вързани към picoip на неомонтана GeSHi (Bash): root@orangepizero:/project/tempmonitor/boilerhome# cat boilerhome_in_get.sh #!/bin/bash COUNTER=0 SUM=0 NUMCHECK=0 while [ $COUNTER -lt 20 ]; do GETVALUE=`snmpget -v1 -c 000000000000 192.168.0.5 .1.3.6.1.4.1.19865.1.2.3.1.0 2>/dev/null | awk {'print \$4'} | xargs` if [[ $GETVALUE == ?(-)+([0-9.]) ]] 2>/dev/null then VOLTAGE=`echo "3300*($GETVALUE/1023)" | bc -l` TEMPERATURE=`echo "scale=2;($VOLTAGE-500)/10.0" | bc -l` SUM=$(echo "$SUM + $TEMPERATURE" | bc) let NUMCHECK=NUMCHECK+1 else cur_date=$(date +"%Y/%m/%d %H:%M:%S") LOGFILE=/project/tempmonitor/boilerhome/boilerhome-error.log echo $cur_date $COUNTER C: error >> $LOGFILE let COUNTER=COUNTER+3 if [ $COUNTER -gt 19 ] then exit fi #echo $COUNTER fi let COUNTER=COUNTER+1 done echo "scale=2;$SUM/$NUMCHECK" | bc -l
поръчах си и sdm220 от алиекспрес като идеята дойде от тук https://www.iz8mbw.net/energy-monitor/ работи перфектно поне за мен http://0.miara75.eu/sdm220/ ама не направих дневна и нощна резултата от сензорите е (странно ae се повтаря два пъти и липсва ed) root@raspberrypi:~# cat /sys/bus/w1/devices/w1_bus_master1/*/w1_slave e4 00 4b 46 7f ff 0c 10 ae : crc=ae YES e4 00 4b 46 7f ff 0c 10 ae t=14250 e4 00 4b 46 7f ff 0c 10 ae : crc=ae YES e4 00 4b 46 7f ff 0c 10 ae t=14250 e0 00 4b 46 7f ff 0c 10 bb : crc=bb YES e0 00 4b 46 7f ff 0c 10 bb t=14000 e6 00 4b 46 7f ff 0c 10 28 : crc=28 YES e6 00 4b 46 7f ff 0c 10 28 t=14375 root@raspberrypi:~# cat /sys/bus/w1/devices/w1_bus_master1/*/w1_slave e5 00 4b 46 7f ff 0c 10 ed : crc=ed YES e5 00 4b 46 7f ff 0c 10 ed t=14312 e4 00 4b 46 7f ff 0c 10 ae : crc=ae YES e4 00 4b 46 7f ff 0c 10 ae t=14250 e0 00 4b 46 7f ff 0c 10 bb : crc=bb YES e0 00 4b 46 7f ff 0c 10 bb t=14000 e6 00 4b 46 7f ff 0c 10 28 : crc=28 YES e6 00 4b 46 7f ff 0c 10 28 t=14375 root@raspberrypi:~# cat /sys/bus/w1/devices/w1_bus_master1/*/w1_slave e4 00 4b 46 7f ff 0c 10 ae : crc=ae YES e4 00 4b 46 7f ff 0c 10 ae t=14250 e4 00 4b 46 7f ff 0c 10 ae : crc=ae YES e4 00 4b 46 7f ff 0c 10 ae t=14250 e0 00 4b 46 7f ff 0c 10 bb : crc=bb YES e0 00 4b 46 7f ff 0c 10 bb t=14000 e6 00 4b 46 7f ff 0c 10 28 : crc=28 YES e6 00 4b 46 7f ff 0c 10 28 t=14375 root@raspberrypi:~# cat /sys/bus/w1/devices/w1_bus_master1/*/w1_slave e5 00 4b 46 7f ff 0c 10 ed : crc=ed YES e5 00 4b 46 7f ff 0c 10 ed t=14312 e4 00 4b 46 7f ff 0c 10 ae : crc=ae YES e4 00 4b 46 7f ff 0c 10 ae t=14250 e0 00 4b 46 7f ff 0c 10 bb : crc=bb YES e0 00 4b 46 7f ff 0c 10 bb t=14000 e6 00 4b 46 7f ff 0c 10 28 : crc=28 YES e6 00 4b 46 7f ff 0c 10 28 t=14375 root@raspberrypi:~# грешната стойност идва от getvalue*.sh има доста варианти в интернет но този уж най читав ми се видя и се чудя как да избегна грешната стойност http://solar.miara75.eu/ ползвам 3ж флашка с прокси пас и ds18b20 https://imgur.com/a/etFLv
Титла: Re: ds18b20 грешно връщане на температурата
Публикувано от: makeme в Feb 11, 2018, 01:15
Дам и аз съм с orangepipc :) Бъгава работа, ма за играчка е супер :) аз му праснах един слийп и заспа :) else { /* printf( "Data not good, skip\n" ); */ sleep(0.3);
Пробвай https://github.com/ionutpi/DHT22-Python-library-Orange-PI , работи доста добре. Относно ds18b20, ако си сигурен, че не е от датчика не може ли да промениш само реда: if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP != "-62" -a $TEMP != "125000" ] да гледа дали е в тези граници, а не да проверява само границите. И ако тогава се бъгне пак ,тогава грешката ще е при сметката: TEMP=$(echo "scale=2; `echo $GETDATA2 | sed -n 's/.*t=//;p'`/1000" | bc) пп: -62 не трябва ли да е -62000? пп2: Прегледах го целия скрипт и не мисля, че е от него. Единствения вариант е при сметката процесора да греши, което не ми се вярва много. пп3: не видях тука такива стойности –+1000 http://solar.miara75.eu/
Титла: Re: ds18b20 грешно връщане на температурата
Публикувано от: vladi4k0 в Feb 11, 2018, 11:29
да това е оригиналното което бях намерил явно още там е -62 GeSHi (Bash): #!/bin/bash # a script to read and save temperature readings from all the group 28 1-wire temperature sensors # # get all devices in the '28' family FILES=`ls /sys/bus/w1/devices/w1_bus_master1/ | grep '^28'` # iterate through all the devices for file in $FILES do # get the 2 lines of the response from the device GETDATA=`cat /sys/bus/w1/devices/w1_bus_master1/$file/w1_slave` GETDATA1=`echo "$GETDATA" | grep crc` GETDATA2=`echo "$GETDATA" | grep t=` # get temperature TEMP=`echo $GETDATA2 | sed -n 's/.*t=//;p'` # # test if crc is 'YES' and temperature is not -62 or +85 #if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP != "-62" -a $TEMP != "125000" ] if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP -ge "-55000" -a $TEMP -le "125000" ] then # crc is 'YES' and temperature is not -62 or +85 - so save result #echo `date +"%d-%m-%Y %H:%M:%S "; echo $GETDATA2 | sed -n 's/.*t=//;p'` #echo `echo $GETDATA2 | sed -n 's/.*t=//;p'` TEMP=$(echo "scale=2; `echo $GETDATA2 | sed -n 's/.*t=//;p'`/1000" | bc) echo $file "-" $TEMP else # there was an error (crc not 'yes' or invalid temperature) # try again after waiting 1 second sleep 1 # get the 2 lines of the response from the device again GETDATA=`cat /sys/bus/w1/devices/w1_bus_master1/$file/w1_slave` GETDATA1=`echo "$GETDATA" | grep crc` GETDATA2=`echo "$GETDATA" | grep t=` # get the temperature from the new response TEMP=`echo $GETDATA2 | sed -n 's/.*t=//;p'` #if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP != "-62" -a $TEMP != "125000" ] if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP -ge "-55000" -a $TEMP -le "125000" ] then # save result if crc is 'YES' and temperature is not -62 or +85 - if not, just miss it and move on #echo `date +"%d-%m-%Y %H:%M:%S "; echo $GETDATA2 | sed -n 's/.*t=//;p'` TEMP=$(echo "scale=2; `echo $GETDATA2 | sed -n 's/.*t=//;p'`/1000" | bc) echo $TEMP fi # this is a retry so log the failure - record date/time & device ID #echo `date +"%d-%m-%Y %H:%M:%S"`" - ""$file" continue fi done exit 0
смених реда така if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP -ge "-55000" -a $TEMP -le "125000" ] на dht22 добавих sleep GeSHi (C): #include <unistd.h> //float f = c * 1.8f + 32; //printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f ); //printf( "Humidity = %.1f %% Temperature = %.1f *C\n", h, c ); printf( "%.1f %.1f \n", h , c ); } else { sleep(0.3); read_dht_data(); // printf( "Data not good, skip\n" ); } } . int main( void ) { // printf( "DHT22 temperature/humidity test\n" ); . if ( wiringPiSetup() == -1 ) exit( 1 ); . while ( 1 ) { read_dht_data(); exit(0); //delay( 2000 ); /* wait 2 seconds before next read */ } return(0); }
има има на rrd_fetch, иначе rrd файловете са на 30 секунди за 4 години малко са големички незнам какво ще и се случи ако оцелеят 1 - Time: 2018-01-27 13:58:30, average is 61.12 32.12 17.75 26.93 2 - Time: 2018-01-27 13:59:00, average is 61.12 32.12 17.75 26.93 3 - Time: 2018-01-27 13:59:30, average is 61.12 32.12 17.86 -1211.46 4 - Time: 2018-01-27 14:00:00, average is 61.12 32.12 17.86 -1211.46 5 - Time: 2018-01-27 14:00:30, average is 61.12 32.12 17.97 -271.15 6 - Time: 2018-01-27 14:01:00, average is 61.12 32.12 17.97 -271.15 7 - Time: 2018-01-27 14:01:30, average is 61.08 32.08 18.08 27.04 8 - Time: 2018-01-27 14:02:00, average is 61.08 32.08 18.08 27.04
Титла: Re: ds18b20 грешно връщане на температурата
Публикувано от: makeme в Feb 11, 2018, 14:56
Аз сложих слийп да не залуупвам кода, иначе и по твоя начин трябва да работи. Смисъла със слийповете е ако дръпнеш датчика да не ти ходи процесора на 100% :) Иначе, виж DHT22-Python-library-Orange-PI, мисля, че ще ти хареса много повече как работи (крайния резултат). 3 - Time: 2018-01-27 13:59:30, average is 61.12 32.12 17.86 -1211.46 4 - Time: 2018-01-27 14:00:00, average is 61.12 32.12 17.86 -1211.46 5 - Time: 2018-01-27 14:00:30, average is 61.12 32.12 17.97 -271.15 6 - Time: 2018-01-27 14:01:00, average is 61.12 32.12 17.97 -271.15 Виж, те не са точни числа 1000, 250 и тнт, значи логиката със сгрешена сметка почти отпада (имах теория, че понеже делиш на кръгло число и резултата е кръгло число, се бъга идва от сметката на процесора). Връщаме се на датчика :) С промените на границите, би трябвало да се оправи.
|