[JMuwe] Multifunktions Wecker

L I V E Stammtisch ab 20:30 Uhr im Chat
    • Offizieller Beitrag

    Multifunktions Wecker

    [Einleitung]
    Das erste Projekt mit dem RaspberryPi Model B - Ein Multifunktions Wecker.
    Ich habe mir dieses Projekt ausgesucht da es derzeit auf dem Markt kaum bzw keine günstigen
    Internet Radio Wecker zu kaufen gibt (meistens ab 80€ und aufwärts...) daher DIY :)

    [Planung]
    Momentan geplant sind folgende Software Funktionen:
    - Internet Radio Streams abspielen
    - Musik abspielen von PC oder Smartphone via MPD Player
    - Audio Dateien abspielen
    - Audio Dateien vom PC / Laptop aus an den Raspiberry Streamen
    - verschiedene Weck Funktionen
    - Alarm auf Datum / Uhrzeit ✓
    - Alarm auf einem Countdown
    - Hardware entwicklung
    - ansteuerung eines Character LCD oder Grafik LCD
    - Tasten abfragen ✓

    [Hardware]
    - Raspberry pi Model B ✓
    - 512MB RAM
    - SD Karte SanDisk 8GB
    - USB-Lautsprecher ✓

    - Grafik LCD ✓

    - Tasten ✓
    - Gehäuse


    [Software]
    Die Software werde ich in Java implementieren. Bisher habe ich ein Gründgerüst der Netzwerk übertragung um auf dem Raspi
    einen Stream zu öffnen. Leider funktioniert das abspielen des Streams noch nicht (siehe Bugs), wobei es nur auf dem Raspi zu problemen führt.
    Das Programm läuft einwandfrei von PC auf Laptop und umgekehrt.

    [Libraries]
    - JLayer
    - Java MPD
    - Pi4J

    [Releases]
    Jmuwe-0.0.1


    [TODO]
    - Einstellungs Menü erstellen
    - MPD Plugin weiter entwickeln
    - Hauptplatine zusammen löten


    [Bugs]
    - Alarm Wiederholungs Fehler


    [Changelog]

    Spoiler anzeigen

    Version 0.0.1
    + Grundfunktionalität eines Weckers
    + Weckzeiten befinden sich in einer XML Datei
    + LCD oder Grafische Benutzer Schnittstelle
    + ansteuerung des PCF8574 Chips (via i2c)
    + Erweiterbar durch Plugins
    + Einstellungsmöglichkeiten durch settings.xml


    Ich hoffe ich konnte dem ein oder anderem mit dieser Idee auch begeistern.
    Natürlich bin ich für Tipps und eure Erfahrungen immer sehr dankbar. Ich werde hier über meine Fortschritte berichten ;)

    liebe Grüße
    Turael

    Ich bin ein gefallener Engel namens Turael.

    Einst vor langer Zeit rebelierte ich im Himmel bis Gott mich auf die Erde verbannte.

    Doch meine taten werden kein ende finden....

    Einmal editiert, zuletzt von Turael (4. November 2013 um 13:24)

    • Offizieller Beitrag

    Ai ai ai hat sich viel getan!
    Meine erste Idee mit Hilfe einer einfachen HTTP Anfrage sich mit einem Radiostream zu verbinden klappte zwar bei vielen Sendern - aber leider nicht allen :/
    (bevorzugt shoutcast Server bockten ein wenig). Siehe Anhang 1 (Java).

    Danach bin ich auf sehr viele Posts in diesem Forum gestoßen wo es um den Music Player Deamon (MPD) geht. Kurz eingelesen - hört sich ja nicht schlecht an. Aber gibt es da auch eine Java variante um den deamon zu steuern? Google wusste natürlich mehr!

    So wurde ich schnell fündig und kam zu diesem Projekt Java MPD. Hat wohl alles was ich brauchen werde und noch sehr viel mehr :)
    Leider hat noch keiner? erfahrungen sammeln können zu diesem Projekt...(Siehe Raspberrypi Forum).
    Bisher habe ich noch nicht viel Testen können aber die Examples die auf der Homepage zu finden sind habe ich ausprobiert und klappt super.
    Ich bin nun in der Lage Musik / Streams zu starten, stoppen und einzufügen - nur die Geschichte mit den Playlisten muss ich mir noch gründlich ansehen, mal schauen was draus wird :)


    Troz allem hat es sich schon gelohnt dieses Projekt zu beginnen mit hilfe von MPD und Cronjobs wurde ich schon 3x morgens super entspannt mit meinem lieblings Radio geweckt - nur das abstellen gestaltete sich schwierig :D


    naja ich halt euch auf dem laufenden...

    liebe Grüße Turael


    Anhang:
    (Java)

    • Offizieller Beitrag

    Es geht vorran wenn auch langsam - da mir irgendwie Zeit fehlt :rolleyes:
    Naja aber nun kann ich euch ein wenig Software präsentieren.
    Ich hab viel neues ausprobiert zbs ein MVC Struktur wo das Model mal ein Singleton darstellt - mal schaun ob sich das lohnt. Semtliche Einstellungen können super einfach in XML verfasst werden und diese wird dann durch JAXB zu einem schönen Object - dadurch kann man einheitliche Konfigurations Dateien erstellen welche vor dem Programm start auch nochmal überprüft werden kann (Stichwort XML Validation).
    Mit diesem Stück Software kann ich auch ein wenig premiere feiern :) Das LCD Display welches ich mal ansprechen möchte muss ja auch irgendwie realisiert werden da kam mir das Composite Pattern gerade gelegen :)

    Bisheriges Fazit:
    Der Benutzer ist also nun in der Lage sich durch ein paar Menüs zu welzen, MPD abspielen / pausieren zu lassen und den nächsten oder letzten Song von der Playlist auszuwählen.


    Außerdem habe ich noch ein kleines Klassendiagramm angefertig:


    Wer vielleicht auch mal in den bisherigen Quellcode rein schauen möchte kann mir gern eine PM / Email senden ;)


    liebe Grüße Turael

    • Offizieller Beitrag

    Irgendwie bin ich gerade an einer Stelle angekommen wo ich mich frage - macht es einen Sinn das ich die Software so aufbaue?
    Irgendwie ist alles so star programmiert und relativ schwer erweiterbar...
    Nach Tagelangen kopfzerbrechen viel mir dann evtl eine Lösung ein
    undzwar hab ich mir gedanken gemacht und dabei stellte ich mir die Frage:

    Was ist die Hauptaufgabe eines Weckers? Ganz klar eine Uhrzeit anzeigen und zu einer bestimmten Uhrzeit ein Event auslösen um zu wecken.

    Aber was zum Teufel mach ich dann mit MPD, Wetter anzeige usw..?
    Da kam mir die Idee das Hauptprogramm mit einem Pluginloader zu erweitern.
    Dadurch würde das Hauptprogramm nur noch die Uhrzeit und die Weckzeiten verwalten und die Plugins werden durch ein Event vom Hauptprogramm dann quasi aktiviert und durchlaufen ihre routinen ...

    mal schauen was daraus noch so alles wird :)

    liebe Grüße Turael

    • Offizieller Beitrag

    Es war eine super Idee dass komplette Programm auf den Kopf zu stellen! :)
    Nun da das Hauptprogramm nur noch die Uhrzeit, die Weckzeiten verwaltet und ab und an ein paar Events wirft ist alles so viel einfacher geworden :)

    Ich hab euch da mal ein Video aufgenommen:
    [youtube]ulWS121kcE0[/youtube]

    Den MPD Code hab ich nun ausgelagert in ein "Plugin" und kann dort separat programmiert werden.
    Jedes Plugin muss eigentlich nur die einheitliche Schnittstelle <<Plugin>> besitzen und wird somit automatisch vom Hauptprogramm
    gescannt, verwaltet und eingebunden.

    Die nächsten Aufgaben die ich angehen werde sind:
    - Weckzeiten per GUI erstellen / ändern / löschen
    - Einstellungs Menü

    Nun sollte ich langsam mal mit der Hardware Planung anfangen denn, ich glaube das es gar nicht mehr weit ist bis ich mein Wecker in Betrieb nehmen kann :)


    liebe Grüße
    Turael

  • Hallo,

    so - mein erster Post ;)


    Mich würde interessieren wie der Status von Deinem Wecker ist. Würde diesen gerne nachbauen - habe aber leider zu wenig Ahnung von Linux. Bin aber bereit viel zu lesen und mich hier schlau zu machen.

    Was ich gerne noch hätte (vielleicht auch was für Dich) wär eine funktion zum einschlafen. Hören gerne Hörspiele zum einschlafen und da wäre es toll, wenn der Wecker nach 30min immer leiser wird.

    Zusätzlich wäre es grossartig wenn man ein LED Strip mit einbringen könnte, so dass dieser einen Sonnenaufgang simuliert.

    Das währe dann der perfekte Wecker. Bedienen per iPhone kann man das ja, oder? ;)


    Danke und Gruß
    Stefan

    • Offizieller Beitrag

    Du brauchst definitv Grundkenntnisse in Linux und in Java.
    Linux-Kenntnisse werden dir weiterhelfen im Bezug auf das System (damit es 24h läuft).
    Das Java Programm kann unterschiedlich aufgebaut werden... Mein Aufbau ist ein wenig komplexer aber dafür auch leichter zu verwalten / zu erweitern... Man kann es natürlich auch schlicht halten was dann aber sehr starr wird (schlecht zu verwalten / zu erweitern)...

    Die Idee mit einer "Schlaflied Funktion" will ich auch auf jedenfall mit einbauen (als Plugin).
    Mein derzeitiger Wecker besitzt auch so eine Funktion - wobei die Musik / Hörspiel nicht leiser wird sondern nach einer voreingestellten Zeit einfach nur ausgestellt wird.

    LEDStripes hört sich erstmal cool an aber man müsste halt schauen wie es in meinem Schlafzimmer wirkt...
    Und vor allem wie diese angesteuert werden (hatte bisher damit noch nichts zu tun ;) )

    Der momentane Stand der Software ist das ich meine Weckzeiten Hardcoded im Quelltext habe und diese (fast) ändern kann.
    Leider fehlt noch irgendwas Persistentes damit die Weckzeiten dauerhaft gespeichert werden.
    Auch das Löschen und Erstellen von Weckzeiten fehlt noch.
    Wenn diese 2-3 Funktionen und die Hardware(LCD) laufen dann könnte man den Wecker schon fast im Betrieb nehmen...

    Meine Java Anwendung kann man zwar nicht mit Iphone / Android steuern aber den MPD Server kann man durch eine Android App (MPDroid) gesteuert werden. Sicherlich gibt es auch eine Iphone app ;)

    • Offizieller Beitrag


    Hallo Turael

    kennst du "Squeezzebox" von Logitech? Die hat einer auf einem Py nachgebaut. Ist im Grunde genau dass was du Bauen willst

    Gruss Urs

    Wäre wohl wahr aber dann wäre ich wieder Abhängig von dem Logitech Medien Server - Außerdem einfach irgendeine Software zu installieren ist langweilig ;)

    Eine eigene Software zu installieren ist dafür umso interessanter....
    Dank diesem Projekt konnte ich wieder einiges dazu lernen zbs.: Shell Scripting, Linux "Autostart" und diverse Software Architekturen.

    • Offizieller Beitrag

    Nachdem ich die Anzeige für die Weckzeiten noch einmal komplett überarbeitet habe, ist nun eine Komponente dabei raus gekommen:

    Ein Scrollpanel

    Das Scrollpanel kann ich mit Items füllen und diese werden dann von dem Panel je nach LCD Zeilen angezeigt.
    Damit habe ich ein wichtigen Schritt gemacht für die Einstellungs und Weckzeiten Ansicht. :)
    Außerdem sind alle Weckzeiten und auch die Einstellungen persistent, wie geplant als XML. Die Validierung ist leider noch nicht mit dabei... Dies werde ich wahrscheinlich als letztes machen - wenn ich genau weiß das ich alle Einstellungen zusammen habe...

    Der nächste große Schritt wird es sein das LCD in Betrieb zu nehmen. Dafür muss ich leider noch auf meinen neuen Raspberry warten...
    Mal schauen wann dieser endlich mal ankommt (Laut Verkäufer gab es wohl Probleme seitens DHL daher warte ich schon seit 3 Wochen auf das Paket :( )

    • Offizieller Beitrag

    Soooo endlich ist mein neuer Raspberry Pi angekommen... aber ihm bleibt keine ruhe! Direkt an mein Display angeschlossen und los gehts mit Java ;)
    Nächster Schritt wird es sein das Display ordentlich in JMuwe unterzubringen :)


    • Offizieller Beitrag

    Jaja lang ist es her seit dem letzten Post....

    In der Zwischenzeit habe ich noch ein paar neue Teile für das Projekt bestellt und auch direkt mal getestet:

    Ich habe zum ersten mal 2 Taster mit dem I2C Bus angesteuert und war verblüfft wie einfach das doch ist :)

    Hier ein kleiner Schaltplan:

    Außerdem habe ich noch ein kleines Video vorbereitet:

    [youtube]xMAjTix4-jw[/youtube]


    In meiner Bestellung war auch noch ein neues LCD Panel dabei, welches direkt mit 3,3V und einem SPI Bus kompatibel ist :)
    Die nächste Aufgabe wird es sein dieses Display anzusteuern und danach kann ich mich (soweit alles gut läuft) mal an die Hauptplatine setzen...

    Außerdem möchte ich mich bei Orb bedanken für die schönen I2C Schaltpläne in seinem Post :)

    liebe Grüße
    Turael

    • Offizieller Beitrag

    Das DOGM128 hält was es verspricht :)
    Das 2mm dicke Display läuft ohne Probleme mit +3,3V und dass auch noch super schnell dank dem SPI mit einem Takt von 10MHz (max 32MHz möglich) - Zum Vergleich I2C takt (High Speed Mode) 3,4MHz.

    Mittels einer kleinen Demo Anwendung (Python) konnte ich schon direkt die ersten Bilder auf dem Display sehen :) Was mich am meisten beeindruckt ist das alles intern geregelt wird wie zbs: Hintergrund beleuchtung, Kontrast, Reset uvm...

    Momentan versuche ich das Display mit Java anzusteuern dazu liefert Pi4J auch eine passende API
    und auch ein kleines Beispiel. Leider ist da noch ein Fehler den ich klären muss bevor ich überhaupt mit Pi4J arbeiten kann undzwar:

    Auf der Konsole schreibe ich folgenden Befehl:
    gpio write 0 0
    Dieser Befehl sollte doch eigentlich den GPIO 0 (Pin 11) auf low setzen oder irre ich mich da?
    Laut (gpio readall) wird aber ein High auf GPIO 0 angezeigt.
    Wenn ich nun gpio write 0 1 absende setzt sich GPIO 0 auf low - es negiert sich immer.
    Vielleicht kann mir da jemand weiterhelfen?

    Ein weiteres Problem ist momentan auch das wenn ich meine Java Anwendung starte und nur auf einen GPIO Pin zugreife dann blockiert es irgendwie den SPI Bus. Dann wird nichtmal das Demo Programm korrekt ausgeführt :/

    Es gibt noch maßig arbeit bevor ich auch nur an die Hauptplatine denken darf.

    Zum abschluss noch ein paar Bilder und den Schaltplan von dem DOGM128e-6:

    Schaltplan DOGM128E-6
    Bild 1
    Bild 2
    Bild 3


    Kleiner Nachtrag:
    Das zweitere Problem konnte ich lösen. Problem war das ich MOSI als provisionDigitalOutputPin geladen habe - dadurch wurde SPI unbrauchbar... warum auch immer ;)

    Nachtrag 2:
    Ok scheinbar ist das mit dem negierten Pins auch gar kein Problem - da ich das Display nun auch mit meinem Java Programm ansteuern kann :)

    • Offizieller Beitrag

    Scheinbar haben sich meine Problem in Luft aufgelöst.
    Das Display lies sich relativ einfach initialisieren und danach konnte es schon fast los gehen :)

    Als erstes habe ich einfach mal ein paar Hex- Werte übertragen. Sehr umständlich und aufwendig alle Dinge als Hex darzustellen. Dann bin ich auf die Idee gekommen einfach ein Graphics Klasse zu benutzen - Die meisten werden diese Klasse von Applets her kennen.
    Aber wie zum Teufel gewinne ich daraus die passenden Hex- Werte?

    Daraufhin bin ich dann auf die BufferedImage Klasse gestoßen. Dort ist es möglich ein Graphics Objekt zu erzeugen und jeden einzelnen Pixel auszulesen.
    Je nachdem ob der Pixel des Bildes hell oder dunkel ist setze ich dann einfach ein "bit" in einem 2 Dimensionales Array und daraus generiere ich mir dann die entsprechenden Hex- Werte.
    Hier mal einen Auszug aus der Methode zum Zeichnen:


    Spoiler anzeigen


    Außerdem wurde die Zeit aus meinem Projekt erfolgreich angezeigt :)
    Hier noch ein paar Bildchen:

    Spoiler anzeigen


    Zum Schluss bleibt mir nur zu sagen: vielen Dank für die zahlreichen Anfragen / Nachfragen auf JMuwe :)
    Es ist einfach schön zu hören das ich mit meinem Projekt andere Menschen zum basteln anstecke :)


    Edit:

    Ein wenig später ist diese Library enstanden.
    LCDLib-0.0.3

    • Offizieller Beitrag

    In der letzten Zeit habe ich relativ viel umgebaut in dem Projekt... Ein paar Klassen sind rausgeflogen und neue Bibliotheken sind hinzugekommen - nicht zuletzt meine LCDLib ;)
    Außerdem habe ich die Tastenabfrage ein wenig verändert und mit einem Event System ausgestattet.
    Nebenbei habe ich auch ein kleine Intro-Animation erstellt (Video folgt).

    Momentan bin ich dabei mir die letzten Teile zu bestellen für das Projekt. Darunter ist auch endlich die Hintergrundbeleuchtung des DOGM und ein schicker 7Port USB Hub. Neben der Bestellung werde ich mich an das MPD Plugin setzen, dort wurde bisher am wenigsten programmiert ;)

    • Offizieller Beitrag

    Vielen Dank. Klar wird man es nachbauen dürfen ;)
    Leider merke ich das ich die Dokumentation ein wenig vernachlässige aber spätestens wenn das Projekt fertig ist wird ordentlich Dokumentiert :)

  • Das ist doch ein Bastelprojekt. Da gibts doch in der Regel kein fertig ;)
    Ich finde die Anwendung auch super. Hätte ich nicht schon sonen Phillips Tageslichtwecker, würde cih das auch so machen.
    Daher kam mir auch gleich die Idee noch eine mögliche LED oder Lampenansteuerung mit einzubauen. Wurde ja aber vorher auch schonmal erwähnt mit den LED Stripes.
    Da man über den Pi ja auch mit PWM arbeiten kann, wäre das mit dem Dimmen ja auch kein Problem.

    • Offizieller Beitrag

    So seh ich das auch ;) Nur die RGB Stripes werd ich wahrscheinlich über einen I2C gesteuerten LED Treiber ansteuern. Den Platz dafür habe ich schon im i2c registriert müsste nur noch ein 6Pin Stecker dazu packen und los gehts :)

    • Offizieller Beitrag

    Hier noch das versprochene Video:
    Aber ich muss mir noch was einfallen lassen da kleinere Animation schon eine ewigkeit brauchen... =/


    [youtube]ObPDZJeWEdo[/youtube]

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!