Автор Тема: ds18b20 грешно връщане на температурата  (Прочетена 664 пъти)

vladi4k0

  • Участник
  • *****
  • Публикации: 10
    • Профил
Моля за малко помощ
ползвам следното за да взимам температурата но по някой път ми връща температура от порядака на -1000 + 1000 градуса и съответно графиката се нарушава като в rrdtool има стойност в слединя ред -+1000 -+250 -+50 и се нормализира. Всичко е просто с любителска цел затова несе чудете на писането :)
Код
GeSHi (Bash):
  1. /project/data-ds18b20/# cat getvalue1.sh
  2. #!/bin/bash
  3. # a script to read and save temperature readings from all the group 28 1-wire temperature sensors
  4. #
  5. # get all devices in the '28' family
  6. FILES=" 28-041694f0f0ff "
  7. # iterate through all the devices
  8. for file in $FILES
  9.    do
  10.      # get the 2 lines of the response from the device
  11.  
  12.      if [ -f "/sys/bus/w1/devices/w1_bus_master1/$file/w1_slave" ]; then
  13.      GETDATA=`cat /sys/bus/w1/devices/w1_bus_master1/$file/w1_slave`
  14.  
  15.      echo -e "$GETDATA" | grep -e "00 00 00 00 00 00 00 00 00"  >&2
  16.      if [ $? -ne 0 ]; then
  17.  
  18.      GETDATA1=`echo "$GETDATA" | grep crc`
  19.      GETDATA2=`echo "$GETDATA" | grep t=`
  20.      # get temperature
  21.      TEMP=`echo $GETDATA2 | sed -n 's/.*t=//;p'`
  22.      #
  23.        # test if crc is 'YES' and temperature is not -62 or +125
  24.        if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP != "-62" -a $TEMP != "125000" ]
  25.           then
  26.               # crc is 'YES' and temperature is not -62 or +85 - so save result
  27.               #echo `date +"%d-%m-%Y %H:%M:%S "; echo $GETDATA2 | sed -n 's/.*t=//;p'`
  28.               #echo `echo $GETDATA2 | sed -n 's/.*t=//;p'`
  29.               TEMP=$(echo "scale=2; `echo $GETDATA2 | sed -n 's/.*t=//;p'`/1000" | bc)
  30.               echo $TEMP
  31.           else
  32.               # there was an error (crc not 'yes' or invalid temperature)
  33.               # try again after waiting 1 second
  34.               sleep 1
  35.               # get the 2 lines of the response from the device again
  36.               GETDATA=`cat /sys/bus/w1/devices/w1_bus_master1/$file/w1_slave`
  37.               GETDATA1=`echo "$GETDATA" | grep crc`
  38.               GETDATA2=`echo "$GETDATA" | grep t=`
  39.               # get the temperature from the new response
  40.               TEMP=`echo $GETDATA2 | sed -n 's/.*t=//;p'`
  41.                  if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP != "-62" -a $TEMP != "125000" ]
  42.                      then
  43.                      # save result if crc is 'YES' and temperature is not -62 or +125 - if not, just miss it and move on
  44.                      #echo `date +"%d-%m-%Y %H:%M:%S "; echo $GETDATA2 | sed -n 's/.*t=//;p'`
  45.                      TEMP=$(echo "scale=2; `echo $GETDATA2 | sed -n 's/.*t=//;p'`/1000" | bc)
  46.                      echo $TEMP
  47.                  fi
  48.               # this is a retry so log the failure - record date/time & device ID
  49.               #echo `date +"%d-%m-%Y %H:%M:%S"`" - ""$file"
  50.               echo "U"
  51.               continue
  52.           fi
  53.  
  54.      else
  55.      echo "U"
  56.      continue
  57.      fi
  58.  
  59.      else
  60.      echo "U"
  61.      continue
  62.      fi
  63.  
  64.    done
  65. exit 0
  66.  
и
Код
GeSHi (Bash):
  1. #/bin/bash
  2. TEMP1=`/project/data-ds18b20/getvalue1.sh`
  3. TEMP2=`/project/data-ds18b20/getvalue2.sh`
  4. TEMP3=`/project/data-ds18b20/getvalue3.sh`
  5. TEMP4=`/project/data-ds18b20/getvalue4.sh`
  6. echo "$TEMP1:$TEMP2:$TEMP3:$TEMP4"
  7.  
и
Код
GeSHi (Bash):
  1. /project/data-ds18b20# cat write_rdd.sh
  2. #!/bin/bash
  3.  
  4. DIGITEMP=/project/data-ds18b20/1in4.sh
  5.  
  6. LOGFILE=/project/data-ds18b20/log/solar-access.log
  7. RRD_PATH=/project/data-ds18b20
  8.  
  9. #
  10. # Function to call digitemp with a given sensor ID and location.
  11. # Generates a log message in $LOGFILE
  12. #
  13. function ProcessSensor {
  14.  sensor_id=$1
  15.  sensor_location=$2
  16.  
  17.  cur_date=$(date +"%Y/%m/%d %H:%M:%S")
  18.  dateEpoch=$(date -d "$cur_date" +%s)
  19. #  cur_temp=$(/usr/bin/digitemp -t $sensor_id -q -c /etc/digitemprc -o%.2F)
  20.  cur_temp=$($DIGITEMP)
  21. #  echo $cur_date $sensor_location F: $cur_temp >> $LOGFILE
  22.  
  23. #echo $cur_date $sensor_location C: $cur_temp >> $LOGFILE
  24.  
  25. #rrdtool update $RRD_PATH/$sensor_location.rrd $dateEpoch:$cur_temp
  26.  
  27. #if [[ $cur_temp == ?(-)+([0-9.])":"?(-)+([0-9.])":"?(-)+([0-9.]?)":"?(-)+([0-9.]) ]] 2>/dev/null
  28. #then
  29. #echo $cur_date $sensor_location C: $dateEpoch:$cur_temp >> $LOGFILE
  30. rrdtool update $RRD_PATH/$sensor_location.rrd $dateEpoch:$cur_temp
  31. #else
  32. #LOGFILE=/project/data-ds18b20/log/solar-error.log
  33. #echo $cur_date $sensor_location C: error $cur_temp >> $LOGFILE
  34. #fi
  35.  
  36. }
  37.  
  38. ProcessSensor 1 ds18b20
  39. #ProcessSensor 1 Garage
  40. #ProcessSensor 2 Living_Room
  41. #ProcessSensor 3 Master_Bedroom
  42.  

мислех да сложа да проверявам стойноста ако е по голяма +150 или по малка -25 за невалидна. но неще ме яде от вътре.
Активен

Naka

  • Участник
  • *****
  • Публикации: 2332
    • Профил
Re: ds18b20 грешно връщане на температурата
« Отговор #1 -: Фев 10, 2018, 12:56 »
Мерене на температурата на какво?

Незнам за какво и къде се използва този сензор, nо един път имах подобни проблеми с lm_sensors и стандартните вградени сенсори в IO чипа. От време на време връщаше температура +127 което му е максималната на насищане. Скачаше от +40,50реалната случайно на +127 след това се връщаше. Оказа се хардуерен проблем и поизгорял сенсор.

А съм сигурен че при мене е хардуерен проблем, защото в началото близо 1 година мереше нормално, и след това почна да ги прави тези подскоци.

Пробвай на ръка с много пъти команди от вида cat /sys/bus/**** (ако може така да се чете температурата) да видиш дали ще върне някой път грешна стойност.
« Последна редакция: Фев 10, 2018, 14:27 от Naka »
Активен

Perl - the only language that looks the same before and after encryption.

makeme

  • Участник
  • *****
  • Публикации: 451
  • Distribution: Many
  • Window Manager: Mate
    • Профил
Re: ds18b20 грешно връщане на температурата
« Отговор #2 -: Фев 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" отпред и виж дали скрипта е невинен :)
Активен

Distributions:  UbuntuMate 14.04; 15.10; 16.04, CentOS 6.x, 7.x, Kali 2.0 ...

vladi4k0

  • Участник
  • *****
  • Публикации: 10
    • Профил
Re: ds18b20 грешно връщане на температурата
« Отговор #3 -: Фев 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):
  1. root@orangepizero:/project/dht22/install-dht# ./dht
  2. DHT22 temperature/humidity test
  3. Humidity = 34.9 % Temperature = 33.1 *C
  4. Humidity = 0.0 % Temperature = 0.0 *C
  5. Humidity = 0.0 % Temperature = 0.0 *C
  6. Humidity = 35.0 % Temperature = 33.1 *C
  7. Humidity = 0.0 % Temperature = 0.0 *C
  8. ^C
  9.  
  10. root@orangepizero:/project/dht22/install-dht# ./dht22
  11. DHT22 temperature/humidity test
  12. Data not good, skip
  13. Humidity = 0.0 % Temperature = 0.0 *C (32.0 *F)
  14. Data not good, skip
  15. Humidity = 0.0 % Temperature = 0.0 *C (32.0 *F)
  16. Data not good, skip
  17. 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):
  1. root@orangepizero:/project/tempmonitor/boilerhome# cat boilerhome_in_get.sh
  2. #!/bin/bash
  3.  
  4. COUNTER=0
  5. SUM=0
  6. NUMCHECK=0
  7.  
  8. while [ $COUNTER -lt 20 ]; do
  9.    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`
  10.        if [[ $GETVALUE == ?(-)+([0-9.]) ]] 2>/dev/null
  11.        then
  12.        VOLTAGE=`echo "3300*($GETVALUE/1023)" | bc -l`
  13.        TEMPERATURE=`echo "scale=2;($VOLTAGE-500)/10.0" | bc -l`
  14.        SUM=$(echo "$SUM + $TEMPERATURE" | bc)
  15.        let NUMCHECK=NUMCHECK+1
  16.        else
  17.        cur_date=$(date +"%Y/%m/%d %H:%M:%S")
  18.        LOGFILE=/project/tempmonitor/boilerhome/boilerhome-error.log
  19.        echo $cur_date $COUNTER C: error >> $LOGFILE
  20.        let COUNTER=COUNTER+3
  21.            if [ $COUNTER -gt 19 ]
  22.            then
  23.            exit
  24.            fi
  25.            #echo $COUNTER
  26.        fi
  27.    let COUNTER=COUNTER+1
  28. done
  29. echo "scale=2;$SUM/$NUMCHECK" | bc -l
  30.  
поръчах си и 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

« Последна редакция: Фев 11, 2018, 00:31 от vladi4k0 »
Активен

makeme

  • Участник
  • *****
  • Публикации: 451
  • Distribution: Many
  • Window Manager: Mate
    • Профил
Re: ds18b20 грешно връщане на температурата
« Отговор #4 -: Фев 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/
« Последна редакция: Фев 11, 2018, 02:07 от makeme »
Активен

Distributions:  UbuntuMate 14.04; 15.10; 16.04, CentOS 6.x, 7.x, Kali 2.0 ...

vladi4k0

  • Участник
  • *****
  • Публикации: 10
    • Профил
Re: ds18b20 грешно връщане на температурата
« Отговор #5 -: Фев 11, 2018, 11:29 »
да това е оригиналното  което бях намерил явно още там е -62
Код
GeSHi (Bash):
  1. #!/bin/bash
  2. # a script to read and save temperature readings from all the group 28 1-wire temperature sensors
  3. #
  4. # get all devices in the '28' family
  5. FILES=`ls /sys/bus/w1/devices/w1_bus_master1/ | grep '^28'`
  6. # iterate through all the devices
  7. for file in $FILES
  8.    do
  9.      # get the 2 lines of the response from the device
  10.      GETDATA=`cat /sys/bus/w1/devices/w1_bus_master1/$file/w1_slave`
  11.      GETDATA1=`echo "$GETDATA" | grep crc`
  12.      GETDATA2=`echo "$GETDATA" | grep t=`
  13.      # get temperature
  14.      TEMP=`echo $GETDATA2 | sed -n 's/.*t=//;p'`
  15.      #
  16.        # test if crc is 'YES' and temperature is not -62 or +85
  17.        #if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP != "-62" -a $TEMP != "125000" ]
  18.         if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP -ge "-55000" -a $TEMP -le "125000" ]
  19.           then
  20.               # crc is 'YES' and temperature is not -62 or +85 - so save result
  21.               #echo `date +"%d-%m-%Y %H:%M:%S "; echo $GETDATA2 | sed -n 's/.*t=//;p'`
  22.               #echo `echo $GETDATA2 | sed -n 's/.*t=//;p'`
  23.               TEMP=$(echo "scale=2; `echo $GETDATA2 | sed -n 's/.*t=//;p'`/1000" | bc)
  24.               echo $file "-" $TEMP
  25.           else
  26.               # there was an error (crc not 'yes' or invalid temperature)
  27.               # try again after waiting 1 second
  28.               sleep 1
  29.               # get the 2 lines of the response from the device again
  30.               GETDATA=`cat /sys/bus/w1/devices/w1_bus_master1/$file/w1_slave`
  31.               GETDATA1=`echo "$GETDATA" | grep crc`
  32.               GETDATA2=`echo "$GETDATA" | grep t=`
  33.               # get the temperature from the new response
  34.               TEMP=`echo $GETDATA2 | sed -n 's/.*t=//;p'`
  35.                  #if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP != "-62" -a $TEMP != "125000" ]
  36.                  if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP -ge "-55000" -a $TEMP -le "125000" ]
  37.                      then
  38.                      # save result if crc is 'YES' and temperature is not -62 or +85 - if not, just miss it and move on
  39.                      #echo `date +"%d-%m-%Y %H:%M:%S "; echo $GETDATA2 | sed -n 's/.*t=//;p'`
  40.                      TEMP=$(echo "scale=2; `echo $GETDATA2 | sed -n 's/.*t=//;p'`/1000" | bc)
  41.                      echo $TEMP
  42.                  fi
  43.               # this is a retry so log the failure - record date/time & device ID
  44.               #echo `date +"%d-%m-%Y %H:%M:%S"`" - ""$file"
  45.               continue
  46.           fi
  47.    done
  48. exit 0
  49.  
смених реда така
if [ `echo $GETDATA1 | sed 's/^.*\(...\)$/\1/'` = "YES" -a $TEMP -ge "-55000" -a $TEMP -le "125000" ]

на dht22 добавих sleep

Код
GeSHi (C):
  1.  
  2. #include <unistd.h>
  3.  
  4.        //float f = c * 1.8f + 32;
  5.        //printf( "Humidity = %.1f %% Temperature = %.1f *C (%.1f *F)\n", h, c, f );
  6.        //printf( "Humidity = %.1f %% Temperature = %.1f *C\n", h, c );
  7.        printf( "%.1f %.1f \n", h, c );
  8.  
  9.    }
  10.    else  {
  11.       sleep(0.3);
  12.       read_dht_data();
  13.       // printf( "Data not good, skip\n" );
  14.    }
  15. }
  16. .
  17. int main( void )
  18. {
  19.    // printf( "DHT22 temperature/humidity test\n" );
  20. .
  21.    if ( wiringPiSetup() == -1 )
  22.        exit( 1 );
  23. .
  24.    while ( 1 )
  25.    {
  26.        read_dht_data();
  27.        exit(0);
  28.        //delay( 2000 ); /* wait 2 seconds before next read */
  29.    }
  30.    return(0);
  31. }
  32.  

има има на 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
« Последна редакция: Фев 11, 2018, 11:42 от vladi4k0 »
Активен

makeme

  • Участник
  • *****
  • Публикации: 451
  • Distribution: Many
  • Window Manager: Mate
    • Профил
Re: ds18b20 грешно връщане на температурата
« Отговор #6 -: Фев 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 и тнт, значи логиката със сгрешена сметка почти отпада (имах теория, че понеже делиш на кръгло число и резултата е кръгло число, се бъга идва от сметката на процесора). Връщаме се на датчика :) С промените на границите, би трябвало да се оправи.
« Последна редакция: Фев 11, 2018, 14:59 от makeme »
Активен

Distributions:  UbuntuMate 14.04; 15.10; 16.04, CentOS 6.x, 7.x, Kali 2.0 ...