Kirjoittaja Aihe: Lämpötilan automatisoitu mittaus VINKKEJÄ KAIVATAAN (digitemp + 1-wire DS18S20+)  (Luettu 7485 kertaa)

hss-kobolt

  • Käyttäjä
  • Viestejä: 16
    • Profiili
Olen rakentanut ubuntu 8.04 (hardy) palvelimen, joka mittaa maidontuottajalle maitosäiliön lämpötilaa tunnin välein, lokitiedostoihin vuorokausittain ja kuukausittain sekä MYSQL tietokantaan 10 min välein, joita voi tutkia palvelimessa olevalla DTGRAPH sovellutuksella.

Palvelin toimii suht. moitteettomasti. Ongelma on eniten se, ettei kone käynnisty täysin takuuvarmasti kuukausien kuluessa ilman tarkkailua. Nähtävästi kiintolevyn tarkistus jää kysymään käyttäjältä mitä tehdään, eikä se käy palvelimessa johon ei olla yhteydessä kuin tiedon tulostuksen yhteydessä. Toinen ongelma on anturin
DS18S20+ erottelukyky.
http://datasheets.maxim-ic.com/en/ds/DS18S20.pdf Sen pienin mahdollinen esitystarkkuus on käytännössä 0,5 astetta.
Parannusehdotuksia kaipaan.

Ensinnäkin kelpaako anturi DS18B20 ilman mitään muutoksia kunhan vain vaihdetaan? TODNÄK käy.

datasivu:
http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf

Tämän erottelukyky on kuitenkin binäärinä 0.0625 astetta (oletusresoluutio on 12 bittiä virran kytkeytyessä), kun aiemmassa se on 0,5 astetta (9 bittiä).

Ero on varsin merkittävä.

Pastaan tähän skriptit + infoa. Skriptien ajastus on asetettu webminin osiossa "System" --> "Scheduled Cron Jobs".

konfiguraatiot lokeja varten:

digitemp-kk-lokiin.conf:
Koodia: [Valitse]
TTY /dev/ttyS0
LOG_TYPE 1
LOG_FILE /var/www/LOKI/kuluva-kk/data.txt
LOG_FORMAT "<CENTER>%d.%m.%Y klo: %H:%M -- <B> %.1C </B> astetta.</CENTER>"
SENSORS 1
ROM 0 0x10 0xBA 0x4D 0x83 0x01 0x08 0x00 0xBA

digitemp-pvm-lokiin.conf
Koodia: [Valitse]
TTY /dev/ttyS0
LOG_TYPE 1
LOG_FILE /var/www/LOKI/kuluva-pv/data.txt
LOG_FORMAT "<CENTER>%d.%m.%Y klo: %H:%M -- <B> %.1C </B> astetta.</CENTER>"
SENSORS 1
ROM 0 0x10 0xBA 0x4D 0x83 0x01 0x08 0x00 0xBA

Siirtoskriptit:

kuukausilokille:
Koodia: [Valitse]
#!/bin/bash

perushakemisto=/var/www/LOKI/HISTORIA/

mkdir $perushakemisto

ToinenOsa=$(date +kuukausi-lokit-%Y)/
mkdir $perushakemisto$ToinenOsa

loppuosa=$perushakemisto$ToinenOsa$(date +%m)$(date +-%Y)/

mkdir $loppuosa

cp /var/www/LOKI/kuluva-pv/index.php /var/www/LOKI/kuluva-kk/
mv /var/www/LOKI/kuluva-kk/data.txt $loppuosa
cp /var/www/LOKI/kuluva-kk/index.php $loppuosa



exit 0

päiväkohtaiselle lokille:
Koodia: [Valitse]
#!/bin/bash

perushakemisto=/var/www/LOKI/HISTORIA/
mkdir $perushakemisto

vuosihakemisto=$perushakemisto$(date +pvm-lokit-%Y)/
mkdir $vuosihakemisto

KKhakemisto=$vuosihakemisto$(date +%m-%Y)/
mkdir $KKhakemisto

PVhakemisto=$KKhakemisto$(date +%d-%m-%Y)/
mkdir $PVhakemisto

mv /var/www/LOKI/kuluva-pv/data.txt $PVhakemisto
cp /var/www/LOKI/kuluva-pv/index.php $PVhakemisto

exit 0

Konfiguraatio MYSQL tietokannalle:

digitemp-mysql.conf
Koodia: [Valitse]
TTY /dev/ttyS0
LOG_TYPE 1
SENSORS 1
ROM 0 0x10 0xBA 0x4D 0x83 0x01 0x08 0x00 0xBA


Tietokannan kirjausskripti:

digitemp_mysql.pl
Koodia: [Valitse]
#!/usr/bin/perl -W

# DigiTemp MySQL logging script
# Copyright 2002 by Brian C. Lane <bcl@brianlane.com>
# All Rights Reserved
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
#
# -------------------------[ HISTORY ]-------------------------------------
# 08/18/2002  Putting together this MySQL logging script for the new
# bcl         release of DigiTemp.
#
# -------------------------------------------------------------------------
#CREATE table digitemp (
#   dtKey int(11) NOT NULL auto_increment,
#   time timestamp NOT NULL,
#   SerialNumber varchar(17) NOT NULL,
#   Fahrenheit decimal(3,2) NOT NULL,
#   PRIMARY KEY (dtKey),
#   KEY serial_key (SerialNumber),
#   KEY time_key (time)
# );

# GRANT SELECT,INSERT ON digitemp.* TO dt_logger@localhost;
# IDENTIFIED BY '';
#
# -------------------------------------------------------------------------

use DBI;

# Database info
my $db_name     = "stats";
my $db_user     = "dtgraph";
my $db_pass     = "";


# The DigiTemp Configuration file to use
my $digitemp_rcfile = "/usr/digitemp-mysql.conf";
my $digitemp_binary = "/usr/bin/digitemp";
# EDELLINEN OLI /usr/local/bin/digitemp JA ON NYT MUUTETTU!

my $debug = 0;
my $var1 = shift;
if (defined($var1) && $var1 eq 'debug') {
    $debug = 1;
    print "Debug moodi on nyt päällä\n";
}


# Connect to the database
my $dbh = DBI->connect("dbi:mysql:$db_name","$db_user","$db_pass")
          or die "I cannot connect to dbi:mysql:$db_name as $db_user - $DBI::errstr\n";


# Gather information from DigiTemp
# Read the output from digitemp
# Output in form SerialNumber<SPACE>Temperature in Fahrenheit



# -------------------------------------------------------------------------------------------------------


#print "Starttaan digitemp -ohjelman...\n";

open( DIGITEMP, "$digitemp_binary -q -a -o\"%R %.2F\" -c $digitemp_rcfile |" );

#print "Alan lukea asteet portista\n";

while( <DIGITEMP> )
{
  print "$_\n" if($debug);
  chomp;

  ($serialnumber,$temperature) = split(/ /);

  #Safety limits: erroneous data tends to be very high or very low
  #This usually happens when the sensor is having trouble (water, bad connection)
  if ($temperature < -80 || $temperature > 180) {
      print "Erroneous data for $serialnumber: $temperature ... Skipping";
      #continue;
  } else {
      $sql="INSERT INTO digitemp SET SerialNumber='$serialnumber',Fahrenheit=$temperature";
      print "SQL: $sql\n" if($debug);
      $dbh->do($sql) or die "Can't execute statement $sql because: $DBI::errstr";
  }
}

close( DIGITEMP );

$dbh->disconnect;


Ehdollinen uudelleenkäynnistys koko koneelle:
(uudelleenkäynnistys toteutuu mikäli kumpaa tahansa lokitiedostoa on muokattu viimeksi yli 3 tuntia sitten)
Koodia: [Valitse]
#!/bin/bash

if [ -f /var/www/LOKI/kuluva-pv/data.txt ] && [ -f /var/www/LOKI/kuluva-kk/data.txt ];
then

# molemmat ovat olemassa ja ovat tiedostoina.

pvlokiviive=$(stat -c %Y /var/www/LOKI/kuluva-pv/data.txt)
kklokiviive=$(stat -c %Y /var/www/LOKI/kuluva-kk/data.txt)

nyt=$(date +%s)

pverotus=$(($nyt - $pvlokiviive))
kkerotus=$(($nyt - $kklokiviive))

# sekunteina kolme tuntia on 10800
max=10800

function uusitarttaus {
                echo Kirjaan vikalokiin ja käynnistän koko koneen uudelleen nyt.
                vikalokiwriter.cgi
kirjaa-loki.sh
                echo odotan 10 sekuntia ja sit reboot
                sleep 10
                reboot
}

if [ $pverotus -gt $max ];
then
echo
echo Päiväloki on $pverotus sekuntia vanha. maksimi on $max
echo
echo kk-loki kirjattu $kkerotus sekuntia sitten.
echo pv-loki kirjattu $pverotus sekuntia sitten.
uusitarttaus

elif [ $kkerotus -gt $max ];
then
echo
echo Kuukausiloki on $kkerotus sekuntia vanha. maksimi on $max
echo
echo kk-loki kirjattu $kkerotus sekuntia sitten.
echo pv-loki kirjattu $pverotus sekuntia sitten.
uusitarttaus
else
echo
echo kk-loki kirjattu $kkerotus sekuntia sitten.
echo pv-loki kirjattu $pverotus sekuntia sitten.
echo Jos $max sekuntia ylittyy, palvelin käynnistyy uudelleen.
echo
#digitemp -a -q -o"pvm: %d.%m.%Y ---- klo: %H:%M  ----- %.1C astetta "
echo
fi


else
echo AINAKIN TOINEN KIRJAUSLOKI PUUTTUU. SUORITAN YLIMÄÄRÄISEN MITTAUKSEN KUMPAANKIN LOKIIN.
kirjaa-loki.sh
fi

Seuraava skripti sattuu olemaan PHP toteutus, koska en viitsinyt alkaa rakentamaan samasta bash versiota.

vikalokiwriter.cgi
Koodia: [Valitse]
#!/usr/bin/php
<?php
$pvdata 
"/var/www/LOKI/kuluva-pv/data.txt"// esittely


//jatketaan tiedon keruuta, jos tiedosto on olemassa
if (file_exists($pvdata)) {
   
//luetaan tiedoston muokkausaika, sekä lasketaan sen ja nykyhetken erotus
   
$muokkausaika filemtime($pvdata);
   
$nyt_aika date("U");
   
$erotus = ("$nyt_aika"$muokkausaika");

// luodaan kokonaislukumuuttujat aikaa varten
$vuorokausina = (integer) ("$erotus86400); // valmis kokonaisluku
$tunteina = (integer) (("$erotus86400) / 3600); // valmis kokonaisluku
$minuutteina = (integer) (("$erotus3600) / 60); // valmis kokonaisluku
$sekunteina = (integer) (("$erotus60) / 1); // valmis kokonaisluku

// tämän tiedoston suoritusta ei ole ajastettu.
// tämän tiedoston suorittaa vain /usr/bin/ehdollinen-reboot.sh

// seuraava ehto on poistettu siksi, että tämä tiedosto lisää vikalokiin tekstiä
// aina, kun tämä suoritetaan.
// if (($erotus) > 10800) { // onko muokattu yli kolme tuntia sitten (= 10800 sekuntia)
{
//jatketaan, jos vikaloki.txt on olemassa
if (file_exists("/var/www/vikaloki/vikaloki.txt")) {
//avataan vikaloki kirjoitustilassa ja kirjoitus aloitetaan tiedoston lopusta.
$vikalokifile fopen("/var/www/vikaloki/vikaloki.txt""a");
//kirjoitetaan tiedostoon tietorivi; \n tarkoittaa rivinvaihtoa
fwrite($vikalokifile"Aika: ".date("d.m.Y H:i:s")." - Vian kesto:  $vuorokausina vrk $tunteina h $minuutteina min $sekunteina s.\n Palvelin k&auml;ynnistetty uudelleen.\n\n");
//suljetaan tiedosto
fclose($vikalokifile);
}
}}
?>

kirjaa-loki.sh
Koodia: [Valitse]
digitemp -a -q -c /etc/digitemp-pvm-lokiin.conf -o"%d.%m.%Y klo: %H:%M   %.1C  "
digitemp -a -q -c /etc/digitemp-kk-lokiin.conf  -o"%d.%m.%Y klo: %H:%M   %.1C  "

Lokitiedoston muotoileva PHP-sivu (kopioidaan lokisiirtojen yhteydessä kohdehakemistoihin):

index.php
Koodia: [Valitse]
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">
<TITLE>Tilatankin L&#228;mp&#246;tila</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER><TT>
<B><FONT style="color: #000000;background: #BFBFFF;">0,5 &#176;C ja alle</FONT></NOBRT></B>
<B><FONT style="color: #000000;background: #BFFFBF;">0,5 ... 1,9 &#176;C</FONT></NOBRT></B>
<B><FONT style="color: #000000;background: #FFFFBF;">2,0 ... 3,4 &#176;C</FONT></NOBRT></B>
<B><FONT style="color: #000000;background: #FFBFBF;">3,5 &#176;C ja yli</FONT></NOBRT></B>
</CENTER></TT>
<BR>
<CENTER>
<H5>Tilatankin L&#228;mp&#246;tilat:<BR>
<BR>
Matti Meikäläinen<BR></H5>
</CENTER>

<?php
//käsiteltävä tiedosto
$tiedosto "data.txt";
//jatketaan, jos tiedosto on olemassa
if (file_exists($tiedosto)) { 
//luetaan tiedoston muokkausaika muuttujaan 
$kirjoitusaika filemtime($tiedosto); 
//avataan tiedosto lukutilassa
$tekstirivi fopen($tiedosto"r");
//nollataan rivinumerolaskuri
$i 0;

echo 
"<TT><CENTER>\n";

//luetaan rivejä, kunnes tiedosto loppuu
while (!feof($tekstirivi)) {
   
//luetaan rivin teksti muuttujaan $rivi
   
$rivi fgets($tekstirivi100);

// luetaan rivistä tiedot lämpötilasta ja ajasta omiin muuttujiin
$lampotila substr("$rivi"244); // Antaa rivin alusta lukien merkit 24, 25, 26 ja 27.
$aika substr("$rivi"021); // Antaa riviltä merkit rivin alusta aina 21:een.

//rivin tulostus alkaa
// tarkistan lämpötilan olemassaolon eka
if ($lampotila) { // vasta nyt tulostan


if ($lampotila >= 3.5) { // punaisella
echo "<NOBRT><BR>$aika - <B>",'<FONT style="color: #000000;background: #FFBFBF;">',"$lampotila &#38;#176;C</FONT></NOBRT></B>\n";
// punainen loppuu

if (($lampotila >= 2.0) and ($lampotila 3.5)) { // keltaisella
echo "<NOBRT><BR>$aika - <B>",'<FONT style="color: #000000;background: #FFFFBF;">',"$lampotila &#38;#176;C</FONT></NOBRT></B>\n";
// keltaisen loppu

if (($lampotila >= 0.5) and ($lampotila 2.0)) { // vihrealla
echo "<NOBRT><BR>$aika - <B>",'<FONT style="color: #000000;background: #BFFFBF;">',"$lampotila &#38;#176;C</FONT></NOBRT></B>\n";
// vihrean loppu

if ($lampotila 0.5) { // sininen
echo "<NOBRT><BR>$aika - <B>",'<FONT style="color: #000000;background: #BFBFFF;">',"$lampotila &#38;#176;C</FONT></NOBRT></B>\n";
// sininen

// lämpötilan olemassaolon tarkistuksen päättyminen


   //kasvatetaan laskuria
   
$i++;  
}


   echo 
"</TT></CENTER>\n\n";
   
//tulostetaan viimeinen tallennushetki
//   echo "<CENTER><H6>Tuorein lokimuutos: " . date("d.m.Y H:i:s", $kirjoitusaika). ".<BR></H6></CENTER>"; 
//   echo "<CENTER><TT>muotoilu p&#38;#228;ivitetty ".date("d.m.Y H:i:s", (filemtime("index.php")))."</TT></CENTER>";

//   ei tiedä toimiiko edellinen kun tätä sivua kopioidaan lokiin.

//suljetaan tiedosto
fclose($tekstirivi);

} else {
   echo 
"<TT><CENTER>Tiedostoa data.txt ei ole olemassa t&#38;#228;ss&#38;#228; hakemistossa.</CENTER></TT>";
   echo 
"<TT><CENTER>T&#38;#228;h&#38;#228;n hakemistoon ei ole tallennettu l&#38;#228;mp&#38;#246;tilatietoja.</CENTER></TT>";

?>


<CENTER><H5><TT>
<a href="data.txt" title="T&#228;st&#228; linkist&#228; muotoilematon raakaloki" onmouseover="self.status='T&#228;st&#228; linkist&#228; muotoilematon raakaloki'; return true">data.txt</a>
</TT></H5></CENTER><BR>

</BODY>
</HTML>

lokilähde, jota muotoillaan:

data.txt
Koodia: [Valitse]
03.04.2009 klo: 17:00   -1.2
03.04.2009 klo: 18:00   0.0 
03.04.2009 klo: 19:00   0.1 
03.04.2009 klo: 00:00   0.7 
03.04.2009 klo: 01:00   0.8 
03.04.2009 klo: 02:00   1.2 
03.04.2009 klo: 12:00   2.0 
03.04.2009 klo: 13:00   3.4 
03.04.2009 klo: 14:00   4.8 
03.04.2009 klo: 15:00   1.0 
03.04.2009 klo: 16:00   6.2 
03.04.2009 klo: 00:00   0.7 

hss-kobolt

  • Käyttäjä
  • Viestejä: 16
    • Profiili
Alkuperäinen idea lähti liikkeelle maidon vastaanottajan toiveista nähdä tarkempaa tietoa kuormaan poimittavasta tilaerästä.


Olen asettanut nyt koko palvelimen käynnistymään uudelleen kerran viikossa, koska aiemmin kone oli yli kuukauden tallentamatta mitään.

Palvelimessa on siis (jos ei huomattu) apache2 + php5 +mysql, sekä verkolle dhcp palvelin + proxy. Riittää pelkän ristikytketyn kaapelin kytkentä kotikoneen ja tämän väliin. Tästä ei ole verkkoyhteyksiä normaalisti mihinkään.

Kysymyksinä on mm.

1. Kuinka asettaa oletusvastaus levyntarkistukselle kun se tapahtuu, ettei siinä vaiheessa jäädä odottamaan käyttäjän toimia?

2. Ehdotuksia paremmista / varmemmista tavoista hoitaa hommat palvelimessa.

Tämän rustasin viikon aikana. Varmasti virheitäkin on. Jatkuvasti tuli uusia ideoita joita piti listata paperille muistin tueksi. Aiemmasta toteutuksesta poiketen on ainakin erikoismerkit ja skandit kunnossa. Silti tässä on nyt muille yksi köyhä tapa tallennella seurantalämpötiloja.

Tha-Fox

  • Käyttäjä
  • Viestejä: 3315
  • Arch Linux && CentOS
    • Profiili
    • http://kettu.dy.fi
Ei kai levyntarkistus vaadi mitään käyttäjän toimia? Eikös se vain pyydä painamaan esciä, jos haluaa skipata tarkistuksen. Jos siis puhutaan siitä fsck-tarkituksesta, joka tapahtuu oletuksena tietyllä käynnistysvälillä, olikohan jotain 30 käynnistystä. Ja voihan tuon tarkistuksen ottaa pois päältäkin, jos haluaa.

peran

  • Vieras
Palvelin toimii suht. moitteettomasti. Ongelma on eniten se, ettei kone käynnisty täysin takuuvarmasti kuukausien kuluessa ilman tarkkailua. Nähtävästi kiintolevyn tarkistus jää kysymään käyttäjältä mitä tehdään, eikä se käy palvelimessa johon ei olla yhteydessä kuin tiedon tulostuksen yhteydessä.
Toi kysely levyntarkistuksen yhteydessä on todennäköisesti vakava merkki kiintolevyn leviämisestä, mikäli kone on kiinni upsissa, ja kaikki sammutukset ovat normaaleja. Oletko tutkinut kiintolevyn toimivuutta lokeista. Foorumin haulla todennäköisesti löydät oikeat lokit, mitä tutkiskella.

Toinen ongelma on anturin
DS18S20+ erottelukyky.
http://datasheets.maxim-ic.com/en/ds/DS18S20.pdf Sen pienin mahdollinen esitystarkkuus on käytännössä 0,5 astetta.
Parannusehdotuksia kaipaan.

Ensinnäkin kelpaako anturi DS18B20 ilman mitään muutoksia kunhan vain vaihdetaan? TODNÄK käy.

Yritin vähän tavailla speksejä, ja ehkä uskaltaisin sitäkin kokeilla, mikäli laite olisi oma tekemäni, ja osaisin itse tehdä toisen samanlaisen laitteen. Tosin ohjelmaasi pitää tehdä muutoksia: jakaa nykyinen arvo 8:lla, jotta arvo olisi oikea. Ainakin niin päättelisin spekseista. Huomioitavaa lieneen myös se, että jotta lukunopeus pysyisi samana kuin nykyisinkin, niin laitteen tulee olla 12 bittisessä moodissa. Muut moodit ovat huomattavasti nopeampia.

Tosin rehellisyyden nimissä tunnustan, etten aivan ymmärtänyt kuinka data liikkuu ko. anturin ja 1 johto väylän välillä, vaikka yritinkin sitä hoksata. Kytkennät tosin oli esimerkillisesti laitettu, ja kytkennöissä ei noissa näyttänyt olevan mitään eroja, niin sen puolesta. Ei myöskään merkkien määrässä jne.

datasivu:
http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf

Tämän erottelukyky on kuitenkin binäärinä 0.0625 astetta (oletusresoluutio on 12 bittiä virran kytkeytyessä), kun aiemmassa se on 0,5 astetta (9 bittiä).

Ero on varsin merkittävä.

Olethan huomannut. Vaikka näyttötarkkuus on 12 bittiä, niin merkitseviä bittejä on vain 9. Eli molemmat näyttävät 0,5 asteen tarkkuudella. Se mistä toi voi johtua on ehkä kohinasta, tai jostain muusta.
Jos se johtuu kohinasta, niin silloin saatetaan päästä melko tarkkoihinkin tuloksiin ottamalla otoksia kerralla monta ja ottamalla niistä keskiarvo tai mediaani (Huom. keskiarvo suppenee nopeammin, ja antaa tuloksia myös mittaustulosten välistä). Jos joudut tarkemipia tuloksia metsästäessäsi ottamaan useampia mittauksia, niin kannattaneen ottaa pienemmällä resoluutiolla, koska mittaus on silloin nopeampaa. Tarkkuuden kustannuksella tietenkin. Sopivalla kompromissilla.

Pastaan tähän skriptit + infoa. Skriptien ajastus on asetettu webminin osiossa "System" --> "Scheduled Cron Jobs".

konfiguraatiot lokeja varten:

digitemp-kk-lokiin.conf:
Koodia: [Valitse]
TTY /dev/ttyS0
LOG_TYPE 1
LOG_FILE /var/www/LOKI/kuluva-kk/data.txt
LOG_FORMAT "<CENTER>%d.%m.%Y klo: %H:%M -- <B> %.1C </B> astetta.</CENTER>"
SENSORS 1
ROM 0 0x10 0xBA 0x4D 0x83 0x01 0x08 0x00 0xBA

digitemp-pvm-lokiin.conf
Koodia: [Valitse]
TTY /dev/ttyS0
LOG_TYPE 1
LOG_FILE /var/www/LOKI/kuluva-pv/data.txt
LOG_FORMAT "<CENTER>%d.%m.%Y klo: %H:%M -- <B> %.1C </B> astetta.</CENTER>"
SENSORS 1
ROM 0 0x10 0xBA 0x4D 0x83 0x01 0x08 0x00 0xBA

Tästä en ymmärrä ROM-kohtaa, jotain sensorin ID:tä vai mitä?

Sitten paha sanoa toisen anturin toimivuudesta suoraan, kun puuttuu Sensorin takana olevan laitteen piirikuva ja firmis. Firmikseen saattaa joutua tekemään jotain pientä muutosta, mutta en ole ihan 100 varma, kun ei valjennut kuinka anturilta luetaan tietoa ja kuinka sinne kirjoitetaan tietoa. Samaa johtoa pitkin kuitenkin, mutta missään en huomannut kuinka määritelään sisääntuleva ja ulosmenevä. Todennäköisesti aluksi kirjoitetaan oikealla nopeudella kutsu, johon kirjoitetaan myös sisään menevä data, ja sitten hetken päästä laite vastaa. Mutta siis tämä ei minulle valjennut, joten ei siitä sen enempää. Ehkä pitäisi myös lukea speksejä, eikä vain katsella hienoja kaavioita ja yrittää päätellä niistä.

pumo

  • Käyttäjä
  • Viestejä: 140
    • Profiili
kyllä ne kaikki ds18*** anturit käy sekaisin samaan linjaan pitää vaan ajaa se asetus komento aina uuden anturin lisäämisen jälkeen.
"digitemp_DS9097 -i -s/dev/ttyS0  -c digitemp.conf "
ilman -c digitemp.conf tekee ajettavaan hakemistoon .digitemprc tiedoston
tuo rom kohta on anturin 64bittinen sarjanumero joka löytyy jokaisesta anturista ja tallentuu siihen .digitemprc tiedostoon, ei tarvitse eriksen mitään firmiksiä säätä.

itselläni on pyörinyt lämpötila mittaus 4 eri pisteestä 5vuotta 10min välein phplla luku mysql kantaan ja jpgraphilla käppyrät.
maaliskuussa lisäsin sähkömittarin luvun 2min välein ja autotallin lämpötilamittauksen nslu2:lla jossa on DS9490R usb lukija sekä DS2423P dual counter joka lukee sähkömittarin ledin vilkkumista, mittaukset menee tietysti samaan kantaan eri tauluun.
yksi antureista saunassa, ilmoittelee yli 55 asteen tilasta olohuoneen dreamboxille ja lukema saadaan telkkariin, aikasemmin oli tuli myös txt viestinä puhelimeen jätin pois liittymän irtisanomisen yhteydessä.  :-)

1-wire osia halvalla ja aika nopeasti saa:
http://www.hobby-boards.com/
« Viimeksi muokattu: 07.05.09 - klo:09.11 kirjoittanut pumo »

hss-kobolt

  • Käyttäjä
  • Viestejä: 16
    • Profiili
Tiedon lukemiseen käytän digitemp -ohjelmaa:
INFO: http://linux.fi/index.php/Digitemp

1-wire liitännän olen toteuttanut RS-232 portissa seuraavalla adapterilla sen toimintavarmuuden vuoksi:
http://tietomyrsky.fi/tuotteet/1-wirebus/

Niille, jotka eivät tunne 1-wire väylää, linkki wikipediaan (englanniksi):
http://en.wikipedia.org/wiki/1-Wire
-------------------------------------------------------------------------------------------------------

Lainaus
Ei kai levyntarkistus vaadi mitään käyttäjän toimia? Eikös se vain pyydä painamaan esciä, jos haluaa skipata tarkistuksen. Jos siis puhutaan siitä fsck-tarkituksesta, joka tapahtuu oletuksena tietyllä käynnistysvälillä, olikohan jotain 30 käynnistystä. Ja voihan tuon tarkistuksen ottaa pois päältäkin, jos haluaa.

fsck:sta on kyse, mutta palvelimessa EI OLE näyttöä eikä näppäimistöä palvelimen hoitaessa tehtävää.

Lainaus
Toi kysely levyntarkistuksen yhteydessä on todennäköisesti vakava merkki kiintolevyn leviämisestä, mikäli kone on kiinni upsissa, ja kaikki sammutukset ovat normaaleja. Oletko tutkinut kiintolevyn toimivuutta lokeista.

Kiintolevyn virheille on looginen syy koska palvelin sammutetaan toistaiseksi raa-asti virrat katkaisemalla.
Olen muuttanut webminillä kiintolevystä välimuistin pois käytöstä palvelimen nopeuden kustannuksella.
Palvelimen virransyöttöä ei toistaiseksi ole UPS-varmennettu. Tätä olen harkinnut.

Kaipaa hiomista.
Esim sammutus atx-virtakytkimestä hallitusti. Tähän lienee ohjeita foorumilla (muistan lukeneeni joskus)


Lainaus
Yritin vähän tavailla speksejä, ja ehkä uskaltaisin sitäkin kokeilla, mikäli laite olisi oma tekemäni, ja osaisin itse tehdä toisen samanlaisen laitteen.

Mulla on tarkoitus rakentaa kotona olevaan palvelimeen täsmälleen samat ominaisuudet testaukseen ja näiden skriptien kehittelyyn. Tuo toinen anturi, siis DS18B20 (B-anturi) poikkeaa aiemmasta sen ohjelmallisen muokattavuuden vuoksi.

Ensinnäkin tehon syöttö ns "Parasite-Power" -moodissa ei toimine B-anturin suurimmalla resoluutiolla vaan on kytkettävä +5v syöttö mukaan.

Lainaus
Tosin ohjelmaasi pitää tehdä muutoksia: jakaa nykyinen arvo 8:lla, jotta arvo olisi oikea. Ainakin niin päättelisin spekseista.

Näin voisi ajatella. Toisaalta itse digitemp asetuksiin en ole tehnyt mitään muuta kuin lokiin liittyvää muotoilua sekä ihan alussa

HUOMATKAA: komentoa "digitemp" ei ole olemassa, vaan olen tehnyt itselleni symbolisen linkin "digitemp" hakemistoon: /usr/bin/
ja tämän kohteena on (muistaakseni tämä näistä kolmesta) /usr/bin/digitemp_DS2490

seuraavat kolme komentoa toimivat suoraan mm -h parametrilla:
Koodia: [Valitse]
/usr/bin/digitemp_DS2490
/usr/bin/digitemp_DS9097
/usr/bin/digitemp_DS9097U

Anturin ensiasennuksen tein seuraavalla komennolla:
Koodia: [Valitse]
sudo digitemp -i -s/dev/ttyS1
Lukunopeudella ei ole tässä merkitystä, koska tiedon luku anturilta ( joita voi olla kymmeniä) ei kestä muutamaa sekuntia kauempaa yhdelle anturille. Mittausväli on käytännössä ainakin 10 min.

Lainaus
Tosin rehellisyyden nimissä tunnustan, etten aivan ymmärtänyt kuinka data liikkuu ko. anturin ja 1 johto väylän välillä, vaikka yritinkin sitä hoksata.

Tähän vastasinkin jo linkkien avulla.

Lainaus
Olethan huomannut. Vaikka näyttötarkkuus on 12 bittiä, niin merkitseviä bittejä on vain 9. Eli molemmat näyttävät 0,5 asteen tarkkuudella. Se mistä toi voi johtua on ehkä kohinasta, tai jostain muusta.

Tarkoitatko anturin lämpökohinasta? Itse data on ykköstä ja nollaa, eli sitä kone tuskin väärin ymmärtää..

Lainaus
ästä en ymmärrä ROM-kohtaa, jotain sensorin ID:tä vai mitä?

Kyllä. Jokaisella anturilla on oma yksilöllinen sarjanumero / "identiteettitieto", jolla erotetaan väylälle liitetyt laitteet, mikä niistä halutaan lukea. Koska anturit ovat rinnankytkettyjä eli toisinsanoen väylällä vaikuttava jännite vaikuttaa kaikissa antureissa samanaikaisesti. Tämä "ROM koodi" haetaan antureiden asennuksen yhteydessä .digitemprc -tiedostoon, josta olen kopioinut tiedot asetustiedostoihin.

lisätietoa:
Koodia: [Valitse]
man digitemp
Lainaus
Sitten paha sanoa toisen anturin toimivuudesta suoraan, kun puuttuu Sensorin takana olevan laitteen piirikuva ja firmis. Firmikseen saattaa joutua tekemään jotain pientä muutosta, mutta en ole ihan 100 varma, kun ei valjennut kuinka anturilta luetaan tietoa ja kuinka sinne kirjoitetaan tietoa. Samaa johtoa pitkin kuitenkin, mutta missään en huomannut kuinka määritelään sisääntuleva ja ulosmenevä. Todennäköisesti aluksi kirjoitetaan oikealla nopeudella kutsu, johon kirjoitetaan myös sisään menevä data, ja sitten hetken päästä laite vastaa.

Tekninen määrittely löytyy 1-wire väylän kuvauksesta. Väylä on ennalta määritelty kuinka tietoa käsitellään.

pump:
Lainaus
kyllä ne kaikki ds18*** anturit käy sekaisin samaan linjaan pitää vaan ajaa se asetus komento aina uuden anturin lisäämisen jälkeen.
"digitemp_DS9097 -i -s/dev/ttyS0  -c digitemp.conf "
ilman -c digitemp.conf tekee ajettavaan hakemistoon .digitemprc tiedoston

Tämä oli tärkeä tieto. Tuota en itsekään hoksannut, kuinka ulostulon voi syöttää suoraan konfiguraatioon (esim digitemp.conf)
Konfiguraatiot olen rakentanut toistaseks käsityönä copypaste tyyliin. Vaikka joutuuhan nää lokitiedostot kertomaan konfiguraatioissa.

Pump, kiitokset.

peran

  • Vieras
Lainaus
Olethan huomannut. Vaikka näyttötarkkuus on 12 bittiä, niin merkitseviä bittejä on vain 9. Eli molemmat näyttävät 0,5 asteen tarkkuudella. Se mistä toi voi johtua on ehkä kohinasta, tai jostain muusta.

Tarkoitatko anturin lämpökohinasta? Itse data on ykköstä ja nollaa, eli sitä kone tuskin väärin ymmärtää..

No voihan sen lämpökohinaksikin nimetä. Tarkoitan sitä, että välttämättä arvo ei ole vakaa, vaan heti perään otettu uusi arvo saattaa heittää suuntaan tai toiseen 0,25-astetta, vaikka olosuhteet olisivatkin identtiset, sillä spekseissä sanotaan anturin mittaavan 0,5 asteen tarkkuudella. En tiedä, miksi näin on, mutta ehkä toi arvo on epävakaa. Parhaassa tapauksessa kyseinen anturi on kalibroitu anturilla, jonka virallinen oikea näyttö on 0,5 asteen tarkkuudella, jolloin anturi on vakaa, ja näyttää 0.1 asteen tarkkuudella, mutta ei ole kalibroitu kuin 0,5 asteen tarkkuuteen. Silloin siis maidon lämpötila/laatu olisi suhteessa näyttöön, mutta tuloksia ei täysin (täydellä tarkkuudella) pystyisi soveltamaan toisiin saman järjestelmän eri antureihin, kun antureissa olisi yksilöllisiä heittoja.

Vaikea siis päätellä, mistä johtuu toi puolen asteen tarkkuus, mutta joku syy siihen varmaankin on, kun on spekseihin niin kirjoitettu. Tuskin niin tärkeä tieto on siihen unohtunutkaan.

Siis molempien antureiden spekseissä seisoo...
Lainaus
±0.5°C Accuracy from -10°C to +85°C

Siis suomeksi, arvo voi olla puoli astetta eri, mitä anturi antaa kyselyssä, joten ko. muut arvot ovat 'aku ankka'-tarkkuutta.

Jos arvo on vakaa, niin se siitä huolimatta antaa paremman kuvan lämmön vaikutuksesta maidon laatuun kuin toi nykyinen anturi, vaikka tarkkuus on molemmissa samat.

Edit - siis kyseinen tieto on hyvä tietää, mutta tuskin häiritsee itse toimivuutta.
« Viimeksi muokattu: 09.05.09 - klo:04.40 kirjoittanut peran »

mk1970

  • Käyttäjä
  • Viestejä: 213
    • Profiili
1. Kuinka asettaa oletusvastaus levyntarkistukselle kun se tapahtuu, ettei siinä vaiheessa jäädä odottamaan käyttäjän toimia?

Auttaisiko /etc/default/rcS tiedostossa FSCKFIX=yes ?

veekoo

  • Käyttäjä
  • Viestejä: 443
    • Profiili
Onkohan sinulla käytössä ext2 -tiedostojärjestelmä? Ext3 toipuu sujuvammin myös tuosta virrat-pois -tilanteesta. Ext2 -tiedostojärjestelmän voi muuttaa ext3-muotoon ilman uudelleenformatointia:

Koodia: [Valitse]
tune2fs -j /dev/sdaX

Jos tuon teet, niin muista editoida uusi tiedostotyyppi tiedostoon /etc/fstab. Uskoisin, että grub käynnistylatain ei tuosta muunnoksesta hätkähdä, mutta se kannattaa vielä varmistaa. Tietääkö kukaan, uskaltaako tuon tehdä turvallisesti boottilevylle?

hss-kobolt

  • Käyttäjä
  • Viestejä: 16
    • Profiili
Tiedostojärjestelmä on jo ext3. tuon "FSCKFIX=yes" muutankin heti.

sit tuo puolen asteen tarkkuus.

tuon ds18b20 -anturin tiedoissa mainostetaan kyllä tiedon lukemisen tarkempaan olevan mahdollista:

Lainaus
The resolution of the temperature sensor is user-configurable to 9, 10, 11, or 12 bits, corresponding to increments of 0.5°C, 0.25°C, 0.125°C, and 0.0625°C, respectively. The default resolution at power-up is 12-bit.

Vaatinee varmaan muutoksia joko lukukomentoihin tai anturin EEPROM muistiin ennen käyttöä.
Jos kohinasta on kyse, pitänee siirtyä useisiin lukukertoihin ja järjestää talteen vain keskiarvo tms.

pieni huomio:
digitemp voidaan kuitenkin säätää antamaan tulos useamman desimaalin tarkkuudella, joita oletuksella tulee 3. Voisi ainakin kuvitella, että digitemp olisi rakennettu myös lukemaan anturia useammallakin kuin yhdeksällä bitillä. Eli ettei pelkkää tulostetta luotaisi epäuskottavan tarkaksi. Kommentoikaa.

Tuon anturin PDF dokumentissa (DS18B20) sivulta 3/22 (219kt) http://datasheets.maxim-ic.com/en/ds/DS18B20.pdf
kerrotaan edelläoleva lainattu teksti.