Temperaturerfassung mit Raspberry Pi und I²C

Aus Port23Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Stückliste)
(Elektronik)
Zeile 25: Zeile 25:
 
<li style="display: inline-block;"> [[Datei:IMG 20150923 190423.jpg|thumb|none|400px|Sensorplatine im Rackwinkel montiert]] </li>
 
<li style="display: inline-block;"> [[Datei:IMG 20150923 190423.jpg|thumb|none|400px|Sensorplatine im Rackwinkel montiert]] </li>
 
</ul></div>
 
</ul></div>
  +
  +
Der Raspberry Pi wird mit 4 Schrauben M2,5x8 am Rackwinkel befestigt. Auf der einen Seite (am Stromanschluss) mit den Muttern M2,5, auf der anderen Seite mit den beiden Abstandshaltern. Anschließend wird das "raspi I²C hat" aufgesteckt und mit 2 weiteren Muttern M2,5 fixiert. Zum Schluss verschließt der Deckel die Elektronik mit 4 weiteren Schreauben M2,5x8. Diese letzen 4 Schrauben schneiden sich ihr Gewinde selbst in die Bohrungen des Deckels - bitte nicht zu stramm festziehen!
  +
  +
[[Datei:Hih6030.jpg|200px|right]]Nun werden die Sensorplatinen in die Rackwinkel geschraubt. Der Luftfeuchtigkeitssensor ist ab Werk mit einem Schutzaufkleber versehen. Dieser muss entfernt werden. Vorsicht: '''das Innere des Chips liegt nun frei und kann leicht beschädigt werden!''' Die Temperatursensoren müssen '''unterschiedliche''' I²C Adressen haben. Die Adresskodierung kann man mittels Lötbrücken oder Jumper vornehmen. Ohne Brücke ist die Adresse des Sensors '''0'''. Mit 1-3 Jumpern (oder Lötbrücken) kann man nun Adressen zwischen 1 und 7 kodieren. Der linke Jumper ist der in Richtung der Rack Montagelöcher.
  +
  +
  +
{| border="1"
  +
!Adresse
  +
!Jumper links
  +
!Jumper mitte
  +
!Jumper rechts
  +
|-
  +
|align="center"|0
  +
|
  +
|
  +
|
  +
|-
  +
|align="center"|1
  +
|align="center"|x
  +
|
  +
|
  +
|-
  +
|align="center"|2
  +
|
  +
|align="center"|x
  +
|
  +
|-
  +
|align="center"|3
  +
|align="center"|x
  +
|align="center"|x
  +
|
  +
|-
  +
|align="center"|4
  +
|
  +
|
  +
|align="center"|x
  +
|-
  +
|align="center"|5
  +
|align="center"|x
  +
|
  +
|align="center"|x
  +
|-
  +
|align="center"|6
  +
|
  +
|align="center"|x
  +
|align="center"|x
  +
|-
  +
|align="center"|7
  +
|align="center"|x
  +
|align="center"|x
  +
|align="center"|x
  +
|-
  +
|}
   
 
== Boot Image ==
 
== Boot Image ==

Version vom 18. Oktober 2015, 11:35 Uhr

Hier entsteht die Dokumentation einer Server- / 19"-Rack Temperaturüberwachung mit einem Raspberry Pi und mehreren I²C Sensoren. Basierend auf einer Raspbian Jessie Installation wird ein lighthttp Webserver aufgesetzt, der mittels PHP eine handvoll Webseiten ausliefert um den Zustand eines Serverracks zu zeigen. Die Temperaturwerte werden in eine RRD geschrieben und mittels rrd graph visualisiert. Ein konfigurierter Schwellwert soll die Administratoren informieren, wenn die Temperaturen zu hoch sind.

Inhaltsverzeichnis

Stückliste

Nachfolgend die benötigten Bauteile:

  • Raspberry Pi 2 Modell B
  • Stromversorgung 5V 1,2A min. Micro-USB
  • Speicherkarte microSD mind. 8 GB (Class 4 oder besser)
  • Raspi I²C Hat
  • 19" Rackwinkel + Deckel für Raspberry Pi (3D Druck)
  • gew. Anzahl I²C Sensorplatinen mit LM75 oder HIH6030. Die Sensoren können mit einem Telefonkabel (RJ11, 6p4c) hintereinander geschaltet werden.
  • 19" Rackwinkel für Sensorplatine (3D Druck)
  • Telefonkabel (RJ11, 6p4c)
  • 4x Schraube M2,5x8 + 4x Mutter M2,5 pro Sensor
  • 8x Schraube M2,5x8 + 4x Mutter M2,5 + 2x M2,5 Abstandshalter 11 mm
  • Jumper RM 2,54 mm

Elektronik

  • (thumbnail)
    Hat & Sensorplatine von oben
  • (thumbnail)
    Hat & Sensorplatine von unten
  • (thumbnail)
    Hat und Raspberry Pi im Rackwinkel montiert
  • (thumbnail)
    Sensorplatine im Rackwinkel montiert

Der Raspberry Pi wird mit 4 Schrauben M2,5x8 am Rackwinkel befestigt. Auf der einen Seite (am Stromanschluss) mit den Muttern M2,5, auf der anderen Seite mit den beiden Abstandshaltern. Anschließend wird das "raspi I²C hat" aufgesteckt und mit 2 weiteren Muttern M2,5 fixiert. Zum Schluss verschließt der Deckel die Elektronik mit 4 weiteren Schreauben M2,5x8. Diese letzen 4 Schrauben schneiden sich ihr Gewinde selbst in die Bohrungen des Deckels - bitte nicht zu stramm festziehen!

Hih6030.jpg
Nun werden die Sensorplatinen in die Rackwinkel geschraubt. Der Luftfeuchtigkeitssensor ist ab Werk mit einem Schutzaufkleber versehen. Dieser muss entfernt werden. Vorsicht: das Innere des Chips liegt nun frei und kann leicht beschädigt werden! Die Temperatursensoren müssen unterschiedliche I²C Adressen haben. Die Adresskodierung kann man mittels Lötbrücken oder Jumper vornehmen. Ohne Brücke ist die Adresse des Sensors 0. Mit 1-3 Jumpern (oder Lötbrücken) kann man nun Adressen zwischen 1 und 7 kodieren. Der linke Jumper ist der in Richtung der Rack Montagelöcher.


Adresse Jumper links Jumper mitte Jumper rechts
0
1 x
2 x
3 x x
4 x
5 x x
6 x x
7 x x x

Boot Image

  • Zum Booten wird das aktuelle Raspbian Debian Jessie von Raspberry Pi Foundation (1,3 GB) verwendet. Das in Planung befindliche "Lite" sollte ebenfalls funktionieren, steht aber im Moment noch nicht zur Verfügung.
  • Nach dem ersten Boot müssen auch hier die "üblichen" Schritte getan werden. Raspbian Jessie bootet standardmäßig in die graphische Oberfläche - da in dieser Anwendung kein Monitor verwendet wird, kann darauf verzichtet werden. Die nötigen Einstellungen nimmt man in "raspi-config" vor:
    • das Dateisystem erweitern,
    • den Hostnamen setzen,
    • die Ländereinstellungen vornehmen,
    • boot-optionen -> text console einstellen.
  • System aktualisieren
    • apt-get update
    • apt-get upgrade
    • rpi-update

In /boot/config.txt das Kommentarzeichen in der Zeile dtparam=i2c_arm=on entfernen:

# Uncomment some or all of these to enable the optional hardware interfaces
dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

Zur Abfrage der Sensoren kann man sensors.c compilieren:

wget http://hackdaworld.org/~hunz/raspi_i2c/boards/sensors.c
gcc sensors.c -o sensors
./sensors /dev/i2c-1
pi@celsius ~/celsius $ ./sensors /dev/i2c-1
HIH6030: status: 1 humidity:  51% temp:  24°C
LM75-0 : temp:  24°C
pi@celsius ~/celsius $

Konfiguration

Zum Abspeichern der Sensorwerte werden RRD Dateien angelegt:

  • pro Sensor eine rrd anlegen.
#!/bin/bash

#
# Anlegen einer RRD zur Speicherung von Temperaturmessdaten
# 

rrdtool create $1 --step 60 \
           DS:temperature:GAUGE:120:U:U  \
           RRA:AVERAGE:0.5:1:2160  \
           RRA:AVERAGE:0.5:5:2016  \
           RRA:AVERAGE:0.5:15:2880 \
           RRA:AVERAGE:0.5:60:8760 \
           RRA:MIN:0.5:1:2160  \
           RRA:MIN:0.5:5:2016  \
           RRA:MIN:0.5:15:2880 \
           RRA:MAX:0.5:1:2160  \
           RRA:MAX:0.5:5:2016  \
           RRA:MAX:0.5:15:2880


#!/bin/bash

#
# Anlegen einer RRD zur Speicherung von Luftfeuchtigkeitsmessdaten
# 

rrdtool create $1 --step 60 \
           DS:luftfeuchtigkeit:GAUGE:120:U:U  \
           RRA:AVERAGE:0.5:1:2160  \
           RRA:AVERAGE:0.5:5:2016  \
           RRA:AVERAGE:0.5:15:2880 \
           RRA:AVERAGE:0.5:60:8760 \
           RRA:MIN:0.5:1:2160  \
           RRA:MIN:0.5:5:2016  \
           RRA:MIN:0.5:15:2880 \
           RRA:MAX:0.5:1:2160  \
           RRA:MAX:0.5:5:2016  \
           RRA:MAX:0.5:15:2880

Im nächsten Schritt werden die Sensoren ausgelesen und die Werte in die RRD Dateien gespeichert. Die Ausgabe von "sensors" muss man durch geeignete Filter schicken, um den numerischen Temperaturwert zu bekommen:

temperature=`/home/pi/celsius/sensors /dev/i2c-1 | grep LM75-0 | cut -d" " -f5 | cut -c1-2`
rrdtool update /home/pi/celsius/LM75-0.rrd N:$temperature

temperature=`/home/pi/celsius/sensors /dev/i2c-1 | grep HIH6030 | cut -d" " -f9 | cut -c1-2`
rrdtool update /home/pi/celsius/HIH6030-temp.rrd N:$temperature

Die Temperatur des Raspberry selbst steht auch zur Verfügung:

calc()
{
  awk "BEGIN { print "$*" }"
}

temperature=`cat /sys/class/thermal/thermal_zone0/temp`
temperature=`calc $temperature/1000`
rrdtool update /home/pi/celsius/CPU-temp.rrd N:$temperature

Diese Aufgaben werden in ein Shellscript getan und regelmäßig per cron aufgerufen.

Im letzten Schritt werden die Sensorwerte aus der RRD Datei ausgelesen und zu mehreren Grafiken verarbeitet:

for zeit in "1hour" "6hours" "1day" "1week" "1month" "1year"
do
   rrdtool graph /home/pi/public_html/all-${zeit}.png \
           -s "now - ${zeit}" -e 'now' \
           -t "STANDORT" \
           -v "Temperatur °C" \
           -w 800 -h 200 \
           -u 50 -l 10 \
           -E \
           -W "(c) Firma `date`" \
           DEF:temp1=/home/pi/celsius/LM75-0.rrd:temperature:AVERAGE \
           DEF:temp2=/home/pi/celsius/HIH6030-temp.rrd:temperature:AVERAGE \
           DEF:temp3=/home/pi/celsius/CPU-temp.rrd:temperature:AVERAGE \
           VDEF:max1=temp1,MAXIMUM \
           VDEF:avg1=temp1,AVERAGE \
           VDEF:min1=temp1,MINIMUM \
           VDEF:max2=temp2,MAXIMUM \
           VDEF:avg2=temp2,AVERAGE \
           VDEF:min2=temp2,MINIMUM \
           VDEF:max3=temp3,MAXIMUM \
           VDEF:avg3=temp3,AVERAGE \
           VDEF:min3=temp3,MINIMUM \
           COMMENT:"\t\t  Aktuell\t\t   Maximum\t\t   Mittelwert\t     Minimum\l" \
           LINE1:temp1#0000FF:"Sensor 1\: " \
           GPRINT:temp1:LAST:"%6.2lf°C" \
           GPRINT:max1:"\t%6.2lf°C" \
           GPRINT:avg1:"\t%6.2lf°C" \
           GPRINT:min1:"\t%6.2lf°C\l" \
           LINE1:temp2#00FFFF:"Sensor 2\: " \
           GPRINT:temp2:LAST:"%6.2lf°C" \
           GPRINT:max2:"\t%6.2lf°C" \
           GPRINT:avg2:"\t%6.2lf°C" \
           GPRINT:min2:"\t%6.2lf°C\l" \
           LINE1:temp3#FF0000:"CPU\:      " \
           GPRINT:temp3:LAST:"%6.2lf°C" \
           GPRINT:max3:"\t%6.2lf°C" \
           GPRINT:avg3:"\t%6.2lf°C" \
           GPRINT:min3:"\t%6.2lf°C\l"

Ergebnis

All-1hour.png

Meine Werkzeuge