Ich stelle hier eine Möglichkeit vor einen iPS Server auf Raspberry Pi B2 Basis incl. TFT Display im Hutschienengehäuse günstig selbst zu bauen.
Der Server ist neben Gehäuse, Display und Netzteil noch auf der Frontseite mit einem Taster, zwei Statusleds und einem Photosensor ausgestattet. Im innern steckt noch ein Sensormodul zur Messung des Luftrdrucks als Ergänzung zur Homematic Wetterstation. Nebenbei hat das Modul auch noch einen Temperatorsensor auf der Platine, der als „Abfallprodukt“ die Temperatur im Gehäuse innern misst (kann beim Übertakten helfen ).
Das kann dann z.B. so aussehen:
Mein Plan ist es zukünftig zwei Stück davon im Cluster zu betreiben sobald die iPS 4.0 final und stabil läuft.
1. Hauptkomponenten
1.1 Gehäuse
[ul]
[li]Montage auf einer DIN-Schiene (35 mm)[/li][li]Breite 4TE[/li][li]Aussparungen für die Anschlüsse[/li][li]Platz für zusätzliche Einbauten[/li][li]LED-Sichtfenster für Display 2,2 Zoll[/li][li]Befestigung des Raspberry mit Schrauben[/li][li]schraubenlose Gehäusemontage[/li][li]Farbe grau[/li][li]Maße (BxHxT): 71,5×90,5×62 mm [/li][/ul]
Gibts z.B. bei Pollin: Link zum Gehäuse
1.2 Hutschienen-Netzteil
[ul]
[li]Hersteller: MeanWell[/li][li]Hersteller Serie: DR-15[/li][li]Herstellerartikelnummer: DR-15-5[/li][li]Ausgang: +5VDC[/li][li]Ausgang (min…max): 4,75…5,5VDC[/li][li]Eingangsspannung: 85…264VAC[/li][li]Eingangsspannung (AC/DC): AC[/li][li]Leistung [W]: 12 W[/li][li]Netzteil-Typ: Din-Rail Netzteil[/li][li]Strom: 2,4 A[/li][li]Wirkungsgrad: 77% [/li][/ul]
Gibts z.B. bei Pollin: Link zum Netzteil
1.3 Display
SPI LCD TFT Display basierend auf ILI9341 chipset betrieben mit dem Nostro framebuffer driver.
[ul]
[li]Bildschirmdiagonale 2,2 Zoll[/li][li]Betriebsspannung: 3,3 Volt[/li][li]Anzahl der Farben: 262K[/li][li]Auflösung: 320×240 Pixel (QVGA)[/li][li]Schnittstelle: 4-Wire SPI[/li][li]Integrierter Controller: ILI9341[/li][li]Hintergrundbeleuchtung: 4 LEDs[/li][li]Abmessung der Platine: ca. 67 mm x 40 mm[/li][li]Hersteller: SHANGHAI TIANMA MICRO-ELECTRONICS[/li][li]Typ/Modell: TM022HDH26 [/li][/ul]
Display und Raspberry Pin Belegung:
TFT Screen | Pin# | Raspberry Pi | Pin# |
---|---|---|---|
VCC | 01 | 3.3v | 01 |
GND | 02 | GND | 09 |
CS | 03 | GPIO8 | 24 |
RESET | 04 | GPIO25 | 22 |
DC/RS | 05 | GPIO24 | 18 |
SD1/MOSI | 06 | GPIO10 | 19 |
SCK | 07 | GPIO11 | 23 |
LED | 08 | GPIO18 | 12 |
SD0/MISO | 09 | GPIO09 | 21 |
Gibts z.B. bei ebay: Link zum Display
2. Soviel zur Hardware, nun noch ein paar Tips zur Konfiguration
Basis ist ein Raspbian Jessie Lite Image
Raspbian Einstellungen:
sudo raspi-config
Unter 9 Advanced Options den Menüpunkt A6 SPI auswählen und default auf ‘Yes’ setzen,
ebenso Menüpunkt A7 i2C auswählen und default auf ‚Yes‘ setzen - danach reboot.
Zum automatischen Laden der FB-Kernelmodule anpassen der /etc/modules-load.d/modules.conf
snd-bcm2835
spi-bcm2835
i2c-bcm2708
i2c-dev
fbtft_device
Wichtig spi-bcm2835 um SPI Master das vom Soundtreiber benutzt wird für den Framebuffer wieder freizugeben!!!
Im Verzeichnis /etc/modprobe.d/ folgenden Befehl zur Dateierstellung ausführen.
echo "options fbtft_device custom name=fb_ili9341 gpios=reset:25,dc:24,led:18 speed=16000000 rotate=90 bgr=1" > fbtft.conf
Zuletzt aktivieren des Framebuffers zur Bootzeit, dazu Ergänzung der Bootparameter in /boot/cmdline.txt am Ende der Zeile mit folgendem Parameter:
fbcon=map:10
LCD Script
Skript zum Ein- und Ausschalten des LCD
Ich habe zusätzlich einen Photosensor eingebaut, der das Display automatisch ausschaltet wenn die Schaltschranktüre geschlossen ist und wieder einschaltet wenn die Türe geöffnet wird. Kann man aber auch mit einem Taster oder anderweitig realisieren.
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import sys
# set Parameters via GPIO for SPI Display
# use Pi.GPIO layout (ordering like Pin-numbers)
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
param_count=len(sys.argv)
def prt_help():
print("Usage: lcd [OPTION]
Set values for SPI LCD Display
")
print("--led --led=on turns the LED Backlight on
--led=off turns the LED Backlight off")
if param_count <= 1:
prt_help()
elif sys.argv[1]=='--led=on':
print('LED einschalten')
GPIO.setup(12, GPIO.OUT)
GPIO.output(12, True)
elif sys.argv[1]=='--led=off':
print('LED ausschalten')
GPIO.setup(12, GPIO.OUT)
GPIO.output(12, False)
elif sys.argv[1]=='--help' or sys.argv[1]=='-h':
prt_help()
else:
print("lcd: unrecognized option ",sys.argv[1],"
Try `lcd --help' for more information.")
3. Module
3.1 Barometer Modul
Für den Luftdruck verwende ich das sehr genaue Modul BMP180 von Bosch
Gibts z.B. für knapp 3,- Euro bei Amazon: Link zum BMP180 Modul
Die Ansteuerung geht sehr einfach über den I²C-Bus
Ein Beispiel zur Verdrahtung findet Ihr hier: Link zur Ansteuerung
Beispiel-Code zum Abfragen der Werte und automatischer Korrektur auf NormalNull:
#!/usr/bin/python
from Adafruit_BMP085 import BMP085
# ===========================================================================
# Example Code
# ===========================================================================
# Altitude over sea level in meter
# please adjust the value to your homebase altitude
altitude = 190
# Initialise the BMP085 and use STANDARD mode (default value)
# bmp = BMP085(0x77, debug=True)
bmp = BMP085(0x77)
# To specify a different operating mode, uncomment one of the following:
# bmp = BMP085(0x77, 0) # ULTRALOWPOWER Mode
# bmp = BMP085(0x77, 1) # STANDARD Mode
# bmp = BMP085(0x77, 2) # HIRES Mode
# bmp = BMP085(0x77, 3) # ULTRAHIRES Mode
temp = bmp.readTemperature()
# Read the current barometric pressure level
pressure = bmp.readPressure()
psea = pressure / pow(1.0 - altitude/44330.0, 5.255)
print "Temperature: %.2f C" % temp
print "Pressure: %.2f hPa" % (pressure / 100.0)
print "Pressure at sea level: %.2f hPa" % (psea / 100.0)
3.2 LDR GL5528
Als Helligkeitssensor kommt die LDR GL5528 in Verbindung mit einem 1 µF Kondensator zum Einsatz
Anbei ein Beispiel-Code zum Ansteuern. Hier ist aber darauf zu achten, dass die Schwellwerte am Anfang des Codes individuell angepasst werden müssen. Je nach Einbautiefe der LDR bzw. der Beschattung durch Gehäuse und Front sind die Werte unterschiedlich.
Auch frisst der Code etwas CPU Leistung wenn die LDR abgedunkelt ist, wenn hier jemand einen besseren Vorschlag für die Abfrage hat, nur her damit.
Die Verdrahtung findet Ihr Beispielhaft hier: Beispiel Aufbau
#!/usr/bin/env python2.7
import time
import os
import RPi.GPIO as GPIO
MaxReads = 40000 #maximum reads from Sensor, higher values need more cpu cycles
SensorPin = 23 #raspberry IO pin number
ThresHold = 0.002 #threshold for activating display, may depend on position of the sensor
CycleDelay = 3 #seconds between sensor reading, lower value means more cpu cycles but faster action
Daemon = 1 #set to 1 to enable daemon mode
debug = 0 #set debug to 1 to get values printed
GPIO.setmode(GPIO.BCM)
GPIO.setup(SensorPin, GPIO.OUT) # 23 for LDR light sensor
def msr_time(msr_pin):
reading = 0
GPIO.setup(msr_pin, GPIO.OUT)
GPIO.output(msr_pin, GPIO.LOW)
time.sleep(0.1)
starttime = time.time() # note start time
GPIO.setup(msr_pin, GPIO.IN)
while (GPIO.input(msr_pin) == GPIO.LOW):
reading += 1
if reading > MaxReads:
break
endtime = time.time() # note end time
total_time = 1000 * (endtime - starttime)
return total_time # reading in milliseconds
def run():
Display = 0
while True:
time.sleep(CycleDelay)
MSR_Value = msr_time(SensorPin)
LightLevel = round(float(1 / MSR_Value / 6),3)
DisplayLast = Display
if LightLevel < ThresHold:
Display = 0
if DisplayLast <> Display:
os.system("lcdctrl --led=off")
if debug:
print "Display:", Display, "DisplayLast", DisplayLast, "LightLevel", LightLevel, "MSR Value:", MSR_Value
else:
Display = 1
if DisplayLast <> Display:
os.system("lcdctrl --led=on")
if debug:
print "Display:", Display, "DisplayLast", DisplayLast, "LightLevel", LightLevel, "MSR Value:", MSR_Value
if __name__ == "__main__":
run()
Hoffe das reicht zum Nachbauen. Viel Spass