Liebes Forum,
ich habe für meinen behinderten Sohn eine Musikanlage (siehe Foto) gebaut, die Musik von der SD Karte abspielt, einen Ein/Aus Schalter hat und einen Bewegungsmelder zum Weiterschalten des Musikstückes.So kann er das Gerät steuern (Tastendruck, Hand an Bewegungsmelder halten).
Bisheriger Aufbau:
Raspi 3B+ mit Hifiberry DAC+ im Holzgehäuse
Taste für Ein/Aus per python scrypt realisiert
Bewegungsmelder auf dem Gehäusedeckel, durch Nagellack auf einen engen Erfassungskegel reduziert (reagiert leider trotzdem manchmal auch auf entfernte Bewegungen, der Radius lässt sich nur auf minmal 3m verkleinern per Poti)
Aktivlautsprecher 2.1
Ohne Monitor, Tastatur, Maus
Raspbian Strech
Kodi mit addon für Bewegungsmelder (python service script), Kodi startet automatisch im Modus Abspielen einer automatischen playlist von Musiktiteln auf der SD Karte
Remotezugriff per Teamviewer und Yatse
Dies will ich nun ausbauen für Video und suche Erfahrungen, vielleicht sogar Beispiele für das folgende Projekt:
Zusätzlich:
Monitor ca 22 Zoll, Wandbefestigung, Halterung vorhanden
Der Monitor sollte vom Raspi aus automatisch ein/aus geschaltet werden. Der vorhandene Schalter am Monitor muss deaktiviert werden. Alternativ Schalten des raspberry durch Betätigen des vorhandenen Schalters am Monitor.
Der Raspi muß fest montiert werden, am besten unterhalb des Monitors, z.B. an der Wandhalterung. Der Bewegungsmelder kann dann hinter dem Monitor angebracht werden und richtet den Erkennungskegel zur Seite weg.
Dann braucht es einen zweiten Bewegungsmelder und einen zweiten Ein/Aus Schalter, der über Funk / WLAN / Bluetooth mit dem raspi kommuniziert und ebenfalls das Skippen / Schalten ermöglicht. Das braucht mein Sohn, wenn er auf dem Bett sitzt und Musik hören will.
Ein weiterer Bewegungsmelder, der von Musik auf Video schaltet, wenn mein Sohn sich vor den Monitor setzt.Und auf Musik schaltet, wenn er wieder weg geht.
Die Aktivlautsprecher bleiben einfach immer eingeschaltet (vielleicht kann man eine Funksteckdose nehmen, die der raspi ansteuert? Dafür suche ich auch Erfahrungen, Beispiele, ist aber zweitrangig.)
Alle Kabel müssen vor dem Herausziehen gesichert sein, am besten hinter einer Abdeckung.
Lautstärkeregler (kann nur von Helfern bedient werden)
Tastatur und Maus sollen zu Wartungszwecken bei Bedarf anschliessbar sein (Buchsen im Gehäuse oder per Funk).
Musik läuft per Zufallsplaylist von der SD Karte
Video analog, ich lade dazu passende Videos von Youtube etc. runter.
Ich hoffe, es wird einigermassen klar, was ich will und ihr habt Ideen und Beispiele dazu.
LG Ernestopheles
Quellcodes:
import xbmc
import xbmcaddon
import RPi.GPIO as GPIO
import time
class MyPlayer(xbmc.Player):
def __init__ (self):
xbmc.Player.__init__(self)
SENSOR_PIN = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN,pull_up_down=GPIO.PUD_UP)
def mein_callback(channel):
# skip = xbmc.executebuiltin("Player.GetPlayingFile")
xbmc.executebuiltin("PlayerControl(Next)")
GPIO.add_event_detect(SENSOR_PIN , GPIO.FALLING, callback=mein_callback)
fobj_out = open('skipped.txt', 'a')
fobj_out.write('Start am ' + time.strftime("%d.%m.%Y %H:%M:%S") + '\n')
fobj_out.close()
monitor = xbmc.Monitor()
player = MyPlayer()
try:
fobj_out = open('skipped.txt', 'a')
# while not xbmc.Monitor.waitForAbort(monitor):
while True:
if GPIO.event_detected(SENSOR_PIN):
if player.isPlayingAudio():
# text = 'Skipped: ' + str(player.getPlayingFile())
text = 'Skipped: ' + time.strftime("%d.%m.%Y %H:%M:%S") + xbmc.getInfoLabel("player.Title").decode('utf-8','ignore')
# else:
# text = 'not playing audio'
fobj_out.write(text + '\n')
time.sleep(1)
# if xbmc.Monitor.waitForAbort(monitor):
# print("")
# break
except KeyboardInterrupt:
print("Keyboard Interruption issued, Stopping...")
except:
print("Exception")
finally:
#print("finally reached")
#fobj_out.close()
#fobj_out = open('skipped.txt', 'a')
fobj_out.write('Ende am ' + time.strftime("%d.%m.%Y %H:%M:%S") + '\n')
fobj_out.close()
GPIO.cleanup()
Alles anzeigen
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.service.playnext" name="play-next" version="0.0.1" provider-name="ej">
<requires>
<import addon="xbmc.python" version="2.20.0"/>
</requires>
<extension point="xbmc.service" library="pir.py" />
<extension point="xbmc.addon.metadata">
<summary lang="en_GB">Bewegungsmelder script</summary>
<description lang="en_GB">a script to skip playback to the next titel when movement detected</description>
<language></language>
<platform>all</platform>
</extension>
</addon>
Alles anzeigen
#!/usr/bin/python
# shutdown / power on Raspberry Pi with pushbutton
# pushbutton: NO connected to GPIO 3, normally open and shuts at button press
# Button press starts raspberry if off (connecting GPIO 3 to GND) and does nothing if raspberry is already on
import RPi.GPIO as GPIO
from subprocess import call
from datetime import datetime
import time
# pushbutton: NC connected to GPIO 27, normally closed and opens at button press
# we want a shutdown if button is pressed meaning GPIO 27 opens
shutdownPin = 27
# button debounce time in seconds
debounceSeconds = 0.01
GPIO.setmode(GPIO.BCM)
GPIO.setup(shutdownPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.setup(shutdownPin, GPIO.IN)
#GPIO.setup(shutdownPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
buttonPressedTime = datetime.now()
def buttonStateChanged(pin):
print("button pressed")
global buttonPressedTime
if not (GPIO.input(pin)):
# button is down
print("not GPIO.input(pin)")
# if buttonPressedTime is None:
buttonPressedTime = datetime.now()
else:
print("GPIO.input(pin):")
print(pin)
# button is up
#if buttonPressedTime is not None:
elapsed = (datetime.now() - buttonPressedTime).total_seconds()
buttonPressedTime = datetime.now()
if elapsed >= debounceSeconds:
# button pressed for a shorter time, also shutdown
call(['shutdown', '-h', 'now'], shell=False)
# subscribe to button presses
GPIO.add_event_detect(shutdownPin, GPIO.BOTH, callback=buttonStateChanged)
while True:
# sleep to reduce unnecessary CPU usage
time.sleep(5)
GPIO.cleanup()
Alles anzeigen