FF-Router inklusive Thermometer

Ich habe mich auch mal ein wenig mit dem Thema Temperatursensor beschäftigt, bin allerdings nicht bei 1-Wire, sondern bei i2c gelandet. Hatte hier noch einen SHT21 von Sensirion rumliegen.

Zunächst habe ich geschaut, wo ich noch 2 freie GPIOs finde. Einer ist ziemlich gut zugänglich (PIN 3 vom JTAG-Header), den anderen musste ich erst suchen. Das ist ein PIN des FLASH. (siehe Bild)

Hardwaremäßig musste ich noch die Pulldown-Widerstände R26 (zwischen JTAG-Header und UART-Header) und R28 auslöten, da I2C ein Idle-High Bus ist. Dafür haben beide Pins einen 10k Pullup Widerstand bekommen.

Hab dann ein paar Pakete nachinstalliert:

opkg update
opkg install kmod-i2c-core kmod-i2c-gpio kmod-i2c-gpio-custom i2c-tools

Mit

insmod i2c-gpio-custom bus0=0,8,9
insmod i2c-dev

wird ein i2c-device erzeugt, welches man mit den i2c-tools benutzen kann.

$>i2cdetect 0 
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-0.
I will probe address range 0x03-0x77.
Continue? [Y/n] 
 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

zeigt, an welcher Adresse sich ein Gerät befindet. Mein SHT21 lauscht auf Adresse 0x40, daher ist diese hier aufgeführt.
Dann habe ich noch ein kleines Script gefunden, welches die Werte ausliest und in Temperatur und Luftfeuchtigkeit umrechnet.

#!/bin/sh
RAWTEMP=$(i2cget -y 0 0x40 0xe3 w)
RAWHUMI=$(i2cget -y 0 0x40 0xe5 w)
echo "<html><body>"
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/')
   DECRAW=$(($HEXORDERED))
   echo $DECRAW | awk -v tem=${DECRAW} '{ printf "%.2f C\n<br>", -46.85+((tem*175.72)/65536)}'
fi
if (echo "$RAWHUMI"| grep -Eq '0x[0-9a-f]{4}'); then
   HEXORDERED=$(echo "$RAWHUMI"|sed -r 's/0x([0-9a-f]{2})([0-9a-f]{2})/0x\2\1/')
   DECRAW=$(($HEXORDERED))
   echo $DECRAW | awk -v hum=${DECRAW} '{ printf "%.2f %%RH\n", -6+((hum*125)/65536)}'
fi
echo "</html></body>"

Ein wenig modifiziert, damit es HTML-Code ausgibt wird dieses Script nun jede Minute durch einen Cron-Job aufgerufen und schreibt seinen Output in /lib/gluon/status-page/www (Cron liegt in /lib/gluon/cron).
Schöner wäre, wenn die Temperatur vom Sensor beim aufrufen der Seite ausgelesen würde, aber das hab ich auf die Schnelle nicht hinbekommen.

Vielleicht hilft das ja jemandem weiter.

5 „Gefällt mir“