−Inhaltsverzeichnis
Deckenfluter
Der multifunktionale Deckenfluter.
Ein Projekt mit dem Raspberry Pi. Fragen & Bemerkungen gerne an meinen XMPP Chat pulsar@jabber.ccc.de
Seit Jahren steht hier ein alter Deckenfluter rum der schon lange nicht mehr geht. Ein neues Leuchtmittel mag ich dafür auch nicht mehr kaufen. Daher hatte ich mir über die Zeit einige Dinge überlegt die man mit diesen alten Teil noch sinnvoll umsetzten könnte. Der Sockel ist zumindest groß genug um einen Mini Computer und eine Festplatte darin zu verstauen.
Ziel des ganzen?
- in verschiedenen Farben leuchten
- Web-Dienste bereit stellen
- Fernsteuerung von allen Geräten im LAN aus
- Bedienung per Taster am Deckenfluter, falls kein Computer im LAN
- Raum Temperatur Messen und auswerten
- andere Systeme im Netz überwachen
- eine 2,5„ Festplatte aufnehmen
- Daten Backup
- NFS-Server für Filme & Musik im Netz
Wir benötigen:
- alten Deckenfluter
- Raspberry Pi 2, 3 oder 4
- Temperatur Sensor DS18S20
- 3x 2m Kabel mit jeweils 4 Adern
- viele Leucht-Dioden, je nach Bedarf 30 weiße, 10 rote, 10 blaue
- 20x IC-Sockel mit 16 Beinen
- Lochraster oder besser Lochstreifen Platine
- 1x ULN2004(ein geiles Teil) dient als LED Treiber
- Die meiste Software holen wir uns mit
apt
aus den Raspberry Pi OS Repos - weitere Software laden wir aus dem Netz und passen es an (WebApp)
Der Anfang - Die alte Lampe entkernen
Es geht los mit der Bearbeitung des Lampen Sockels, Dieser besteht größtenteils aus Beton.
dreck's gemetzel Die Platte und der Pi muss da irgendwie rein.
Mit Hilfe eines Stemmeisen Stechbeitels oder besser einem Handmeissel und einen Hammer ging dies recht gut. Dazu habe ich für die Feinarbeiten einen Dremel verwendet.
LED Platine
Als LED´s sollte man schon bessere mit ordentlicher Helligkeit wählen. Nicht die üblichen LEDs nehmen die in vielen Geräten als Kontrollleuchte dienen, diese wären zu dunkel. Der Durchmesser der verbauten LED's ist 5mm.
Um die LED's zu befestigen habe ich eine Lochraster Platine genommen,
welche mit IC-Sockeln in der Länge aneinander gereiht bestückt wird.
Vorteile ist, Dioden lassen sich nach Bedarf austauschen, sei es wegen
Defekt oder weil man eine andere Farbe probieren mag. Jede Reihe wird
von einem GPIO gesteuert, die LEDs sind in jeder Reihe parallel geschaltet.
Alles wird mit dem Original Raspberry Pi Netzteil (5,1V 2,5A) versorgt. Dies ist das Netzteil, welches für den Raspberry Pi 3(+) empfohlen wird. Falls man einen 4er Pi nutzt, dann natürlich das Netzteil für den 4 er nehmen, diese liefert noch mehr Strom.
In der Mitte des LED Boards lassen sich auch 3 polige LEDs mit gemeinsamer Anode anschließen. Die Masse wird geschaltet, je nachdem welcher GPIO betätigt wird schaltet er bei einer 3 poligen LED die eine, die andere oder beide Katoden auf Masse. Somit lassen sich alle 3 Farben bei einer verbauten 3 poligen LED nutzen.
Falls keine 3 poligen LED's verfügbar sind, lassen sich in der Mitte des LED Boards aber auch zwei polige LED's verwenden.
LED Treiber IC ULN2004
Das schalten mehrerer LED's oder allgemein von elekt. Verbrauchern
sollte nicht direkt an den GPIO's des Raspberrys erfolgen,
da diese oftmals zu viel Strom ziehen und damit den
Raspberry schaden können. Der IC Baustein ULN2004A wird daher
eingesetzt um größere Ströme zu schalten.
In meiner Schaltung ist der ULN2004 mit der Masse
des Raspberry's verbunden und schaltet die
Output Pins auf Masse sobald der entsprechende
GPIO ein High-Signal an den Input Pin des ULN
sendet. Der ULN2004A kann Ströme bis max. 500mA
pro Ausgang schalten.
Temperatur Sensor DS18S20
Die Raumtemperatur holen wir uns mit dem Sensor DS18S20. Wer die CPU/GPU Temperatur sucht, kann sich diese mit dem im Raspberry integrierten Temperatur Sensor holen.
Kernel Modul für 1-wire aktivieren
Vor dem Bearbeiten sicherheitshalber die Datei wegsichern:
sudo cp /boot/config.txt /root/config.txt_20170405
In die Datei /boot/config.txt
folgende Zeile hinzufügen:
dtoverlay=w1-gpio
Nach einem neu-booten sind die 1-wire Kernel-Module geladen, das sollte dann mit der Ausgabe des lsmod
Befehls folgendermaßen aussehen:
pi@licht:~ $ lsmod |grep -i w1 w1_therm 3584 0 w1_gpio 3657 0 wire 25219 2 w1_gpio,w1_therm
So bald der 1-wire Bus aktiviert ist und ein entsprechender Temperatur Sensor am GPIO4 angeschlossen wird, erscheint das Verzeichnis /sys/bus/w1/devices/
. In diesem befinden sich alle 1-wire Geräte, dabei fängt die Modell-Reihe DS18S20 immer mit 10-… an, mit einer jeweils pro Sensor definierten Serien Nr.
Die Temperatur Werte können nun vom Sensor ausgelesen werden indem wir uns den Inhalt der Datei w1_slave
mit dem Befehl cat
anzeigen lassen. Die ausgegebenen Werte müssen durch 1000 geteilt werden damit es sinnvoll erscheint. In unseren Fall also 22,06 °C.
pi@licht:~ $ cat /sys/bus/w1/devices/10-00080309f5cb/w1_slave 2c 00 4b 46 ff ff 0b 10 e8 : crc=e8 YES 2c 00 4b 46 ff ff 0b 10 e8 t=22062
Temperatur grafisch darstellen
Die Temperatur möchte ich per Web-Browser grafisch darstellen, um über die Wochen oder Monate den Temperatur Verlauf zurückzuverfolgen.
Update Aktuell - Bin ich dabei dies alles auf Grafana
umzusetzen. Die Software Grafana
wird ebenfalls dazu genutzt Sensor Daten grafisch darzustellen. Die Software kann auch per apt
installiert werden.
Installation benötigter Pakete für Temperatur Auswertung
apt install grafana
Das Round Robin Database Tool (RRDtool) ist ein Werkzeug zum Speichern und Anzeigen von Zeitreihendaten z.B. Netzwerk Bandbreite, Temperatur Verläufe oder Server Auslastung. Es speichert die Daten in einer Round Robin Datenbank, auf sehr kompakter Weise, welche nicht anwachsen über die Zeit. RRDtool verarbeitet die Extrahierte Daten, um eine bestimmte Datendichte zu erreichen und ermöglicht damit die effektive grafische Darstellung von Datenwerten.
sudo apt update sudo apt install rrdtool python-rrdtool
cd Documents/ nano gettemp.py chmod u+x gettemp.py python gettemp.py
rrdtool create temperature.rrd --step 900 DS:temp0:GAUGE:1200:-40:80 DS:temp1:GAUGE:1200:-40:80 RRA:AVERAGE:0.5:1:960 RRA:MIN:0.5:96:3600 RRA:MAX:0.5:96:3600 RRA:AVERAGE:0.5:96:3600
rrdtool create temperature.rrd –step 900 DS:temp0:GAUGE:1200:-40:80 DS:temp1:GAUGE:1200:-40:80 RRA:AVERAGE:0.5:1:960 RRA:MIN:0.5:96:3600 RRA:MAX:0.5:96:3600
rrdtool create temperature.rrd –step 900 DS:temp0:GAUGE:1200:-40:80 RRA:AVERAGE:0.5:1:960 RRA:MIN:0.5:96:3600 RRA:MAX:0.5:96:3600 RRA:AVERAGE:0.5:96:3600
rrdtool lastupdate rrdtool lastupdate temperature.rrd
Mit crontab
ausgeführte Skripte benötigen intern
die vollen Pfade zu Programmen oder Dateien
l /sys/bus/w1/devices/ l /home/pi/Documents/ crontab -l cat /home/pi/Documents/gettemp.log rrdtool graph tempweek.png -s 'now - 1 week' -e 'now' DEF:temp0=temperature.rrd:temp0:AVERAGE LINE2:temp0#00FF00:Innen mkdir /var/www/html/temperatur cp tempweek.png /var/www/html/temperatur/ l /var/www/html/temperatur/ cd Documents/ l /var/www/html/temperatur/ nano gettemp.py l /var/spool/cron/crontabs/ sudo l /var/spool/cron/crontabs/ cat gettemp.py rrdtool graph tempday.png -s "now - 1 day" -e "now" DEF:temp0=/home/pi/Documents/temperature.rrd:temp0:AVERAGE LINE2:temp0#00FF00:Wohnzimmer_1_Tag rrdtool graph /home/pi/Documents/tempday.png -s "now - 1 day" -e "now" DEF:temp0=/home/pi/Documents/temperature.rrd:temp0:AVERAGE LINE2:temp0#00FF00:Wohnzimmer_1_Tag nano gettemp.py cat gettemp.log crontab -l l /var/www/html/temperatur/ nano gettemp.py which rrdtool nano gettemp.py nano gtkdb-temp.py l /sys/devices/w1_bus_master1/w1_master_slaves cat /sys/devices/w1_bus_master1/w1_master_slaves chmod u+x gtkdb-temp.py python gtkdb-temp.py cat /sys/devices/w1_bus_master1/w1_master_slaves
Schalter Eingang
Zunächst wird GPIO 22 als Eingang definiert und im ungeschalteten Zustand durch einen Pull-Up Widerstand auf High Signal (3,3V) gehalten. Der Taster schaltet nicht direkt die LEDs, sondern gibt einen Schaltimpuls an GPIO 22 welchen diesen kurzzeitig auf Ground (GND) setzt. Dieser Eingang wird durch ein Python Programm abgefragt und setzt bei einer Änderung die Ausgangs Pins GPIO 16 und 21 auf High Signal (3,3V) diese Schalten wiederum den IC ULN2004, es sind zwei der PIN's welche auch schon durch die Web-Anwendung gesteuert werden können. Es ist egal von wo aus die LED's geschaltet werden, vom Web oder direkt per Taster, es sind in beide Richtungen Ein- und Aus-Schalten möglich.
- ledinterruptSchalter.py
#!/usr/bin/env python #coding: utf8 import time import RPi.GPIO as GPIO # Zählweise der Pins festlegen GPIO.setmode(GPIO.BCM) # GPIO 22 als Eingang festlegen GPIO.setup(22, GPIO.IN, pull_up_down = GPIO.PUD_DOWN) # GPIOs als Output festlegen GPIO.setup(16, GPIO.OUT) GPIO.setup(21, GPIO.OUT) # Ereignis-Prozedur für Eingang HIGH def doIfHigh(channel): # Prozedur mit Befehlen definiert, die bei positiver Flanke abgearbeitet werden soll if GPIO.input(channel) == GPIO.HIGH: GPIO.output(16, True) GPIO.output(21, True) else: # Wenn Eingang LOW ist GPIOs auf Low bzw False setzen = LED aus GPIO.output(16, False) GPIO.output(21, False) # Ereignis deklarieren #GPIO.add_event_detect(22, GPIO.BOTH, callback = doIfHigh, bouncetime = 200) GPIO.add_event_detect(22, GPIO.BOTH, callback = doIfHigh) # Eigentlicher Programmablauf while 1: time.sleep(0.1)
Raspberry Pi OS
Raspberry Pi OS Lite Image wird in der aktuellsten Form genutzt, das GUI wird deaktiviert und die Grafik-Ausgabe ebenfalls. Nicht benötigte Dienste werden beendet CUPS, VNC usw.
Installation benötigte Pakete für GPIO Steuerung
- apache2
- libapache2-mod-php
Ansonsten sind alle Pakete für die Abzeige und Steuerung der GPIO Pins bereits unter Debian GNU/Linux 12 (bookworm) vorhanden.
- gpiod
- raspi-gpio
- python3-gpiozero
- pinctrl
- pinout
Konfiguration
Benutzer www-data
zur Gruppe gpio
hinzufügen.
Nach der Installation vom Paket wiringpi
steht das Konsolen-Programm gpio
zur Verfügung. Mit dem Kommando gpio readall
wird eine Ausgabe erzeugt auf der angezeigt wird, welcher Pin in welchem Modus (IN/OUT) geschaltet ist. Hier sind ausserdem die verschiedenen Bezeichnungen der Pins ersichtlich. Zum Beispiel ist der physikalische Pin 11 im Betriebssystem als GPIO 17 bekannt, siehe Spalte BCM. Ähnliche Funktionalität bietet das Paket raspi-gpio
.
+-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | | | 3.3v | | | 1 || 2 | | | 5v | | | | 2 | 8 | SDA.1 | IN | 1 | 3 || 4 | | | 5v | | | | 3 | 9 | SCL.1 | IN | 1 | 5 || 6 | | | 0v | | | | 4 | 7 | GPIO. 7 | IN | 1 | 7 || 8 | 0 | IN | TxD | 15 | 14 | | | | 0v | | | 9 || 10 | 1 | IN | RxD | 16 | 15 | | 17 | 0 | GPIO. 0 | OUT | 0 | 11 || 12 | 0 | IN | GPIO. 1 | 1 | 18 | | 27 | 2 | GPIO. 2 | OUT | 0 | 13 || 14 | | | 0v | | | | 22 | 3 | GPIO. 3 | IN | 0 | 15 || 16 | 0 | IN | GPIO. 4 | 4 | 23 | | | | 3.3v | | | 17 || 18 | 0 | IN | GPIO. 5 | 5 | 24 | | 10 | 12 | MOSI | IN | 0 | 19 || 20 | | | 0v | | | | 9 | 13 | MISO | IN | 0 | 21 || 22 | 0 | IN | GPIO. 6 | 6 | 25 | | 11 | 14 | SCLK | IN | 0 | 23 || 24 | 1 | IN | CE0 | 10 | 8 | | | | 0v | | | 25 || 26 | 1 | IN | CE1 | 11 | 7 | | 0 | 30 | SDA.0 | IN | 1 | 27 || 28 | 1 | IN | SCL.0 | 31 | 1 | | 5 | 21 | GPIO.21 | IN | 1 | 29 || 30 | | | 0v | | | | 6 | 22 | GPIO.22 | IN | 1 | 31 || 32 | 0 | IN | GPIO.26 | 26 | 12 | | 13 | 23 | GPIO.23 | IN | 0 | 33 || 34 | | | 0v | | | | 19 | 24 | GPIO.24 | IN | 0 | 35 || 36 | 0 | OUT | GPIO.27 | 27 | 16 | | 26 | 25 | GPIO.25 | IN | 0 | 37 || 38 | 0 | OUT | GPIO.28 | 28 | 20 | | | | 0v | | | 39 || 40 | 0 | OUT | GPIO.29 | 29 | 21 | +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
Die App - drücke die Birnen
Sehr einfach gehalten ist die Anwendung zum Steuern der LED's, diese kommt ohne Text aus und erklärt sich eigentlich von selbst.
Die Steuerung der Lampe sollte nach Möglichkeit von jedem Gerät in meinem LAN möglich sein, ohne die Installation von zusätzlichen Paketen und Apps. Daher viel die Wahl auf eine Web-Anwendung. Im Internet finden sich viele Beispiele im Zusammenhang mit dem RPi und das Steuern von GPIO's über Web-Anwendungen. Eine Anwendung welche meinen Ansprüchen am nächsten kommt hatte ich im Netz gefunden und hier meine gewünschten Änderung vorgenommen. Programmcode, besteht aus einer PHP Anwendung, etwas Java Skript und den Bild Dateien für die Schalter, welche in meinem Fall Glühbirnen sind. Ein hübsches Birnchen hatte ich über die Bildersuche im Netz gefunden, eine blaue leuchtende Birne. Die restlichen Farben(gelb, rot, grün) und die An/Aus(hell/dunkel) Darstellung habe ich mit der Bildbearbeitungs-Software Gimp erstellt.
Download der Web App
blau
rot
violett
Nach der ganzen Arbeit
Nach der ganzen Arbeit sieht das dann wie hier auf dem Video aus :)