Jak měřit teplotu prostřednictvím PC 

Meření teploty počítačem je věčné téma. Způsobů, jak jí měřit je také mnoho. Můj bratr na mě přišel s požadavkem, měřit nějak teplotu ve sklepě, aby věděl, zda už nastal čas zazimovat tam želvu :)

Prohrabal jsem šuplíkové zásoby a našel integrovaný teploměr pro SMBus DS1631 s přesností 0,5 stupně Celsia. Tak jsem si říkal, že by bylo dobré prostě ho připojit na sběrnici SMBus nějakého PC a jeho obsah číst přes standardní balík LM-sensors.

Ale narazil jsem. První problém byl v tom, že žádný počítač, co jsem měl k dispozici, neměl sběrnici SMBus vyvedenou do patřičného konektoru. A pájet přímo na nožičky SPD EEPROM u DIMM modulů mi připadalo nevhodné.


Začal jsem tedy přemýšlet, kde ještě v počítači je sběrnice I2C. A záhy mě napadl kanál DDC, pomocí kterého komunikuje monitor s grafickou kartou, aby sdělil svá podporovaná rozlišení. Po chvilce Gůglení jsem našel i stránku, příznačně nazvanou 25 cent I2C adapter, která prostřednictvím krásných obrázků informuje, že kromě I2C se ve VGA konektoru najde i +5V pro napájení teplotního čidla a že v linuxu takové řešení funguje s kartami ATI a NVidia.

Našel jsem tedy nějakou starou kartu ATI, vyrobil jednoduchou redukci z VGA na VGA s odbočkou a připojil. i2cdetect čip skutečně našel, a dokonce jsem z příkazového řádku podle datasheetu dokázal přečíst teplotu z čipu. Druhý zádrhel ovšem nastal s ovladači teplotního čidla z balíku lm-sensors. Součástí jádra totiž je ovladač pro DS1621 - starší model, se kterým je DS1631 zpětně kompatibilní. I když jsem však modul zavedl s příznakem force a nastavil adresu, na které senzor byl, ovladač odmítl spolupracovat.

Chvíli jsem zkoušel přinutit ovladač, aby spolupracoval, pak jsem to vzdal a použil shellový skriptík, který teplotu každých 5 minut odečítá a přes wifi prostřednictvím ssh ukládá do mysql databáze :)

#!/bin/bash

modprobe i2c-dev

I2CBUS=$(grep -l vga /sys/class/i2c-dev/*/name | sed -r 's/^.*i2c-([0-9]+).*$/\1/')

if [ "$I2CBUS" == "" ]; then
echo "I2C sbernice 'vga' nenalezena";
exit;
fi

echo "I2C sbernice vga ma cislo $I2CBUS";

CHIPADDR="0x48";

#Software POR
#- pouze prikaz 0x54, nic se necte
i2cget -y ${I2CBUS} ${CHIPADDR} 0x54 2>/dev/null

#Nastaveni na 12-bitove rozliseni, trvale mereni
i2cset -y ${I2CBUS} ${CHIPADDR} 0xac 0x0c 2>/dev/null

#Start Convert
#- pouze 0x51, nic se necte
i2cget -y ${I2CBUS} ${CHIPADDR} 0x51 >/dev/null

INITCHECK=$(i2cget -y ${I2CBUS} ${CHIPADDR} 0xac)
if !(echo "$INITCHECK" | grep -q '0x.c'); then
echo "Chyba inicializace: $INITCHECK";
exit;
fi
echo "Senzor inicializovan";

while true; do
sleep 1;
#nacteni teploty s prohozenymi byty a v dvojkovem doplnku
RAWTEMP=$(i2cget -y ${I2CBUS} ${CHIPADDR} 0xaa w 2>&1)
if (echo "$RAWTEMP"| grep -Eq '0x[0-9a-f]{4}'); then
HEXORDERED=$(echo "$RAWTEMP"|sed -r 's/0x([0-9a-f]{2})([0-9a-f]{2})/0x\2\1/')

#prevod na zaporna cisla
if [ $(($HEXORDERED)) -ge 32768 ]; then
DECRAW=$(( -65536+$HEXORDERED ))
else
DECRAW=$(($HEXORDERED))
fi

#Prevod z 256tin stupne na desetitisiciny stupne
TEMPNODOT=$(( ($DECRAW/16)*625 ))
#Doplneni desetinne carky 4 mista od konce
TEMPDOT=$(echo "$TEMPNODOT" | sed -r 's/([0-9]{4})$/.\1/')

if [ $TEMPNODOT -eq -600000 ]; then
#Prevod asi neni spusten
echo "Teplomer hlasi neplatnou hodnotu -60 stC."
continue;
fi



date '+%Y-%m-%d %H:%M:%S'
echo -n "Teplota je $TEMPDOT stC"

echo "INSERT INTO teploty (date, time, temp) VALUES (NOW(),NOW(),$TEMPDOT);" |
ssh -q -o NumberOfPasswordPrompts=0 teplomer@moon \
'mysql -utempagent -p******* teplomer'
if [ $? -eq 0 ]; then
echo " ... zapsano v databazi"
else
echo " ... nepodarilo se zapsat"
fi


else
echo "Chyba odectu: $RAWTEMP";
fi
sleep 299
done

Administrator (Oskar) 

Snímače mají tříbitovou adresu, lze jich tedy na jednu sběrnici připojit až 8 na adresách 0x48 až 0x4F. Ovšem pouze za předpokladu, že nebude připojen monitor s DDC, který by některou z adres obsadil. Obvykle ale EDID sídlí na adrese 0x50 a více, takže s tím problém není.

Co se vzdálenosti týká, je to těžké. Samotná sběrnice je určena hlavně pro komunikaci mezi IO na jedné desce, takže není navržena na dlouhé vzdálenosti. Řekl bych, že maximum je tak 5 metrů. Já osobně teď provozuji dvě čidla na sběrnici o délce asi 3 metry a funguje to bez problémů.
Mechura 

Dobrý den chtěl jsem se informovat a vyzvedet vice. Potreboval bych neco podobneho. Potrebuji prippojit vice techto snimacu teploty. Na jakou vzadalenost muzu snimace pripojit a kolik jich muze vyset na sbernici jestli tedy jsiu adresovatelne? spěchá děkuji Jiří

Komentáře

Pro tento záznam nejsou komentáře povoleny.