Gefällt dir dieser Artikel?

Raspberry Pi: RSS Reader für HD44780 Display

erschienen in der Kategorie Technik, am 12.10.2012
Schnatterente
English speaking people should have a look at this.


So, das ging jetzt schneller als ich selbst gedacht hätte. Ich habe eine erste Version meines RasPi RSS Readers fertiggestellt. Das Programm erlaubt die Anzeige von aktuellen RSS News Feeds auf einem HD44780 Display, das an die GPIO Pins eines Raspberry Pi angeschlossen ist.




(Video nachträglich eingefügt, am 17. Oktober 2012)

Mein Python Skript bietet bisher Folgendes:
  • Es können beliebig viele RSS Feeds angezeigt werden. Genauer gesagt werden nur die Überschriften der Feeds angezeigt. Den im Feed enthaltenen Text anzuzeigen wäre zwar technisch kein Problem, aber doch ein bisschen zu viel für das kleine Display.
  • Es funktioniert mit allen HD44780 Displays.
  • Es bringt die wichtigsten Einstellungen zur Darstellung der Feeds mit (Anzeigedauer eines Displayinhalts; maximale Anzahl der anzuzeigenden Einträge je Feed; die Möglichkeit nur Feeds des aktuellen Tages anzuzeigen; Wörter am Zeilenende trennen oder auf die nächste Zeile schieben; Zeitintervall, bis der Feed neu geladen werden soll).
  • Korrektur der wichtigsten Umlaute (mein Display kann die meisten Umlaute gar nicht darstellen und jene, die es gibt, sind an einer anderen Stelle des Zeichensatzes versteckt).


RasPi RSS Reader installieren

Wer sich auch ein Display an seinen Raspberry Pi gebastelt hat, kann das Programm benutzen. Damit es läuft müssen zuvor noch zwei Libraries installiert werden: RPi.GPIO und Feedparser. Für die Installation der Feedparser-Bibliothek werden noch die Python Setuptools benötigt. Die Installation kann wie folgt via Konsole oder SSH Zugang erfolgen (als root):
# mkdir rss
# cd rss

# wget http://raspberry-gpio-python.googlecode.com/files/python-rpi.gpio_0.3.1a-1_armhf.deb
# dpkg -i python-rpi.gpio_0.3.1a-1_armhf.deb

# wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c9.tar.gz
# tar -zxvf setuptools-0.6c9.tar.gz
# cd setuptools-0.6c9/
# python setup.py build
# python setup.py install
# cd ..

# wget http://feedparser.googlecode.com/files/feedparser-5.1.2.tar.gz
# tar -zxvf feedparser-5.1.2.tar.gz
# cd feedparser-5.1.2/
# python setup.py build
# python setup.py install
# cd ..

# wget http://www.schnatterente.net/code/raspberrypi/rssreader-1.3.py
# chmod +x rssreader-1.3.py

HINWEIS: Ich halte die Versionsnummern der RPi.GPIO-Library, der Setuptools und von Feedparser hier nicht aktuell. Verwendet am besten immer die aktuellsten Versionen der Pakete (welche das sind, erfahrt ihr, wenn ihr die Links anklickt) und passt die oben aufgeführten Kommandos entsprechend an.

RasPi RSS konfigurieren

Das heruntergeladene Python Skript rssreader.py sollte noch auf die eigenen Bedürfnisse angepasst werden. Dazu kann man es z.B. mit nano bearbeiten:
# nano rssreader.py

Zuerst sollte man die Belegung der GPIO Pins anpassen. Falls der Hardwareaufbau jedoch dem gleicht, den ich in meinem letzten Beitrag vorgestellt habe, kann alles so bleiben wie es voreingestellt ist. Falls nicht, sind in dem Beitrag weitere Informationen zu finden.
# GPIO Pins Config
DISPLAY_RS = 7
DISPLAY_E = 8
DISPLAY_DATA4 = 25
DISPLAY_DATA5 = 24
DISPLAY_DATA6 = 23
DISPLAY_DATA7 = 18

Danach können die Feeds und die Anzeige konfiguriert werden. Unter der Variable FEEDURLS können beliebig viele Feeds angegeben werden. Das sieht dann z.B. so aus:
FEEDURLS = ['http://www.schnatterente.net/rss.xml', 'http://www.heise.de/newsticker/heise-atom.xml']

MAXITEMS gibt an, wie viele Einträge eines Feeds maximal angezeigt werden sollen.

MINTIMEPERITEM und MAXTIMEPERITEM legen (in Sekunden) fest, wie lange ein Displayinhalt angezeigt wird, bevor der nächste erscheint. Die Anzeigedauer ist von der Anzahl der Zeichen im Display abhängig. Um einen festen, also nicht variierenden, Zeitslot zu erhalten, müssen beide Variablen auf den gleichen Wert gesetzt werden.

REFETCH legt in Sekunden fest, wie lange bis zum erneuten Herunterladen eines Feeds mindestens gewartet werden soll. Ein Wert von 0 sorgt dafür, dass die Feeds bei jedem Durchlauf neu geladen werden.

In ONLYCURRENTDAY kann angegeben werden, ob nur Nachrichten des aktuellen Tages angezeigt werden sollen. Der Wert dieser und der folgenden Variablen muss "True" oder "False" sein (Groß-/Kleinschreibung beachten).

Ist SHOWFEEDTITLE auf True gesetzt, wird beim Durchschalten der Nachrichten, vor den Einträgen eines Newsfeeds, dessen Titel angezeigt, z.B. "Schnatterente.net - Technik".

BREAKWORDS erlaubt das zerreißen von Wörtern am Zeilenende. Ist es aktiviert, werden Wörter, die nicht mehr auf die aktuelle Zeile passen, nicht auf die nächste Zeile gesetzt, sondern einfach zerstückelt. Dies geschieht ansonsten nur mit Wörtern, welche mehr Zeichen enthalten, als auf eine Displayzeile passen.

Setzt man den Wert von SHOWOVERFLOW gleich False, wird von jeder Nachricht nur der Inhalt angezeigt, der auf eine Displayseite passt. Passt die Nachricht nicht komplett aufs Display, wird der Rest dann abgeschnitten und nicht angezeigt. Stattdessen erscheint nachfolgend der nächste Feed-Eintrag.

Wie geht's weiter?

Ich habe mir ein 4x20 Display bestellt, da ich ja nun weiß, dass sich der Rasperry Pi mit den Dingern verträgt. Da passt dann ein bisschen mehr drauf. Sobald ich es angeschlossen habe, werde ich hier noch mal ein paar Worte dazu verlieren.

UPDATE 17. Oktober 2012: Inzwischen habe ich das 4-zeilige Display, den Eintrag dazu gibt es hier.

Mit dem Programm zur Anzeige kommender Kalendertermine habe ich noch nicht angefangen. Ich denke das mache ich, wenn das neue Display da ist. Ich werde dann auf dem großen Display die RSS Feeds laufen lassen und auf dem kleinen meine Termine aus dem Google Kalender.

Feedback, Feature Requests und Bugmeldungen werden dankbar entgegen genommen!

UPDATE 19.01.2013: Es kam die Frage auf, wie man den Raspberry Pi dazu kriegt, den RSS Reader beim Booten automatisch zu starten. Die Antwort findet ihr hier.
Und ich habe gerade noch zwei kleine Änderungen am Skript vorgenommen, um Probleme mit ASCII, bzw. UTF-8 zu beheben. Falls das Skript bei dir bisher immer mal abgestürzt ist: neue Version ausprobieren!

UPDATE 10.08.2014: Ich habe zwei kleine Änderungen am RSS-Reader-Skript vorgenommen. Die neue Version (1.1) ist online und oben im Tutorial verlinkt. Die alte Version (1.0) ist hier noch verfügbar.
In den alten Version wurden, wenn der Parameter ONLYCURRENTDAY auf True gesetzt war, auch Feeds angezeigt, die keine Einträge enthalten. Die neue Version macht das nicht mehr.
Danke an Marcel für den Hinweis.

UPDATE 19.05.2015: Ich habe wieder Mal ein paar Kleinigkeiten am Skript verändert, weil manche HD44780-Displays am neuen Raspberry Pi 2 nicht so richtig wollten. Das sollte nun gelöst sein. Die aktuelle Version ist jetzt die 1.2.

UPDATE 20.05.2015: Da ich mich nun schon mal wieder in den Code eingearbeitet hatte, habe ich gleich noch ein bisschen weitergebastelt und die Textausgabe optimiert. Die aktuelle Version ist jetzt also die 1.3.


Weitere Artikel in Sachen Raspberry Pi und HD44780-Display:

Geschnatter

41 Kommentare, selbst mitschnattern << < Seite 3/6 > >>
Jesper, am 13.04.2013 um 22:37 Uhr
Is it possible to connect the 4x20 display directly to the Raspberry Pi, using the cobbler, without the need of a breadboard? I want to make an RSS reader as compact as possible.
Antwort: Of course it is. Just connect the display pins with your cobbler. Inside the python script you can set which GPIO pins should be used for the signals.

The breadboard is not necessary.
Jesper, am 17.04.2013 um 13:58 Uhr
But when I look at your scheme, I see 12 wires from the LCD display, ending in 8 wires on the GPIO. So how do I manage to get this working when I solder the header pins to the LCD, and connect these to the GPIO using a ribbon cable?

When using a ribbon cable, the first header pin of the LCD will then be connected to number 26 of the GPIO. Will this work?
Antwort: Righty right. The additional ones are just power lines. Have a look at the GPIO Pin table, there are multiple power lines which can be used.
Jesper, am 19.04.2013 um 19:52 Uhr
This script rocks! But how can I end this script when all RSS feeds are done? It loops now, I want to change that :)
Antwort: The script is refetching the feeds after each cycle to always show you the latest news items. To make it run just once, just delete the line "while True:".
Peter, am 26.04.2013 um 08:28 Uhr
Hallo,
ich habe das Display auch mit dem RSS nachgebaut. Vielen Dank für den Beitrag.
Nun habe ich noch einen "Erweiterungsvorschlag". Ich messe mit meinem PI die Zimmertemperatur. Nun wäre es schön, wenn ich das auch per rss feed in das Display einblenden könnte. Ich habe mich da schon etwas schlau gemacht, bin aber leider nicht sehr weit gekommen :(
Viele Grüße Peter
Antwort: Wenn du weißt, wie du in Python an die Temperatur rankommst, brauchst du eigentlich nur noch die Ausgabe dafür an irgendeiner Stelle im Skript einfügen, z.B. nach jedem RSS Feed.

write_display_message("Tempeatur: 5°C")

Um es nach jedem Feed anzeigen zu lassen, müsste es ans Ende des Blocks: "for f in FEEDURLS:"
Jesper, am 06.05.2013 um 17:29 Uhr
Hey, I have this up and running! :D Very cool. But I am having an issue with the "kill_umlauts", i want to add ë and ï, but am unable to find the correct chr() code for it anywhere, how did you figured that out?
Antwort: Hey, there are some PDF datasheets somewhere in the internet. They often contain a list of letters. HD44780 displays are very different. Some displays can show more or different letters than other ones. As far as I know the display also allows you to define up to eight own (user-defined) symbols (don't ask me how to do this).
Jesper, am 08.05.2013 um 18:41 Uhr
Thanks! But I found another solution by simply ignoring them. I have all text in uppercase now, which looks way better too! :D
Antwort: OK. So... Congratulations to this great workaround! :D
kolo, am 18.06.2013 um 21:01 Uhr
Hi,
kann das Programm nicht unter Python 3.3.2 zum laufen bringen.
Bekomme immerwieder die Fehlermeldung
File rssreadermoj.py line 117
break; TabError: inconsistent use of tabs and spaces in indentation
Antwort: Guck mal hier.