Benutzer-Werkzeuge

Webseiten-Werkzeuge


wiki:deckenfluter

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?

  1. in verschiedenen Farben leuchten
  2. Web-Dienste bereit stellen
  3. Fernsteuerung von allen Geräten im LAN aus
  4. Bedienung per Taster am Deckenfluter, falls kein Computer im LAN
  5. Raum Temperatur Messen und auswerten
  6. andere Systeme im Netz überwachen
  7. eine 2,5„ Festplatte aufnehmen
  8. Daten Backup
  9. 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 LOL 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 was 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@deflu:~ $ 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@deflu:~ $ 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.

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

  1. apache2
  2. php
  3. wiringpi

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 :)

wiki/deckenfluter.txt · Zuletzt geändert: 2021/05/29 15:49 von pulsar