Artikel-Schlagworte: „Raspberry Pi“

Erweiterung der Wetterstation: Feinstaubmessung

Angeregt durch einen Artikel im Make-Magazin habe ich meine Wetterstation um einen Feinstaubsensor erweitert.
Die Feinstaubmesswerte sind ja seit einiger Zeit ein heißes Eisen, da die EU heftige Strafen für unsere Städte verhängt, wenn die Feinstaubgrenzwerte an zu vielen Tagen im Jahr überschritten werden. Und für unsere Gesundheit ist es ja allemal besser, wenn nicht so viel Dreck in der Luft rumfliegt… 😉

Nun sind die offiziellen Messstationen ja sehr ungleichmäßig über das Stadtgebiet verteilt und da nützt es mir wenig, wenn ich weiß, dass die Messwerte am Hauptbahnhof mal wieder durch die Decke gehen. Mich interessieren ja eher die Werte direkt vor der eigenen Haustür.

Über die Hintergründe zur Messung, was die einzelnen Messwerte und deren Bedeutung betrifft, will ich hier nicht näher eingehen, das kann man besser hier nachlesen. Dort wird auch ausführlich beschrieben, wie man sich selbst mit einfachen Mitteln seine eigene Feinstaub-Messstation aufbauen kann.

Die Messung selbst ist auch für so blutige Amateure wie unsereinen kein Problem. Der Sensor liefert jede Sekunde ein Datentelegramm mit den Messwerten über eine serielle Schnittstelle. Da die meisten PCs heutzutage nicht mehr über letztere verfügen, liefert der Hersteller einen seriell zu USB Konverter gleich mit. Die aufwändige Installation eines Treibers dafür entfällt beim Raspberry Pi zum Glück, der hat den gleich an Bord. Also nur anstöpseln und läuft!

Auch die Spannungsversorgung des Sensors ist problemlos, er bezieht seinen “Saft” über den USB-Anschluß.

Das Skript muss nun nur noch die über die serielle USB-Schnittstelle eingehenden Daten auf Plausibilität prüfen und anschließend in der Datenbank speichern.

Im Gegensatz zu Make-Magazin (den Artikel kann man übrigens auch auf der Homepage des Autors nachlesen) habe ich kein Shellskript zur Messung benutzt, sondern nutze die schon bei der Wetterstation genutzte Variante und habe stattdessen ein Perlskript geschrieben.
Dabei war der Artikel aus dem Make-Magazin aber sehr hilfreich.

Dieses Skript erfasst die Messdaten alle fünf Minuten und schreibt die Messwerte in eine MySQL-Datenbank. Von dort liest ein PHP-Skript auf dem Webserver die Daten und zeigt sie auf der Homepage an. In den nächsten Tagen werde ich dann meine Skriptsammlung noch um eine grafische Auswertung der Messwerte erweitern.

Was gibt es sonst noch zu tun? Im Datenblatt des Sensors steht geschrieben, dass der Sensor nur “gut” für 8000 Betriebsstunden ist. Nach Adam Riese sind das etwa 333 Tage, also nicht mal ein ganzes Jahr. In der Voreinstellung misst der Sensor rund um die Uhr ohne Pause, was also bedeutet, dass man damit rechnen kann, dass der Sensor nach 11 Monaten den Geist aufgeben könnte.
Bei einem Preis von ca. 25€ pro Stück macht es also Sinn, die Betriebsdauer zu verlängern.

Im Datenblatt des Sensors schreibt der Hersteller, dass man den Sensor auch in einen sogenannten “Sleep-Modus” schicken kann. Dabei werden der Lüfter, der die Luft in die Messkammer saugt und der Laser, der die in der Luft enthaltenen Partikel mit einem Laserstrahl “beschießt”, abgeschaltet.
Dadurch kann man die Betriebsdauer natürlich erheblich verlängern.
Nur leider lässt sich der Hersteller im genannten Datenblatt nicht darüber aus, wie man den Sensor dazu bringt, eine Pause zu machen. Auch die Suchmaschine mit den sechs Buchstaben liefert leider nicht sehr viele Ergebnisse zu diesem Thema. Einen Ansatz habe ich schon gefunden. Da gilt es in den nächsten Tagen etwas zu experimentieren.
Also falls es mal keine Messwerte gibt, dann ist dabei etwas schief gegangen… 😉

Foto: Feinstaub-Messstation

Auf dem Foto sieht man meine Messtation im Einsatz, angebaut am Gartengeräte-Häuschen in ca. 1,70m Höhe. Links der Raspberry Pi, ein schon etwas älteres Modell B, darüber der Seriell-zu-USB-Konverter, in der Mitte der eigentliche Feinstaubsensor und rechts daneben Empfänger und Sender für 433Mhz-Signale.
Letzterer ist gedacht zum Ein- und Ausschalten von entsprechenden Funksteckdosen. Aber das ist schon wieder ein anderes Thema ;-).

Alle drei sind auf einer sogenannten Hutschiene mittels selbst entworfener und mit dem 3D-Drucker gedruckten Halterungen befestigt. Wobei ich auf die Konstruktion der Zugentlastung für das Anschlusskabel der 5V-Stromversorgung (das schwarze Ding unten in der Mitte zwischen der blauen und der grünen Klemmleiste) besonders stolz bin. Das Ding sieht zwar nicht sonderlich spektakulär aus, aber da ich ja nicht jeden Tag 3D-Konstruktionen mache und die Konstruktion auf Anhieb in die am Gehäuse vorhandene Aufnahme gepasst hat, darf man sich bestimmt ein bissel darüber freuen ;-).

Wohnungssuchende gesichtet…

Foto: Meise am Nistkasten
 
Beim Blick aus dem Fenster habe ich heute viele interessierte Piepmätze auf Wohnungsbesichtung gesehen. Der Makler hatte alle Hände voll zu tun, schließlich gibt es seit gestern zwei zusätzliche freie Wohnungen in 1a-Lage zu mieten ;-).

Wie schon im letzten Jahr gibt es für denjenigen, der den ersten Schnappschuß eines Vogels im von der Nestcam überwachten Kasten präsentiert, eine Flasche Sekt. Allerdings nur für Selbstabholer… ;-).

Der Nistkasten vom Bild dürfte dem einen oder anderen bekannt vorkommen. Ich habe ihn sozusagen recycled und nun dem ursprünglich vorgesehenen Verwendungszweck zugeführt.

Auch der Kasten mit der Nestcam hatte viele neugierige Besucher, einer hat sich sogar drinnen umgesehen. Es lohnt sich also immer mal wieder ein Blick auf das Video.

Das jede Minute aktualisierte Bild der Nestcam findet ihr hier.

NestCam

Nistkasteninnenaufnahme mit IR-Kamera
Ein weiteres Projekt geht in die heiße Phase. Den Winter über habe ich an einem Nistkasten mit Webcam gebastelt.

So etwas hatte ich schon länger vor, doch dank RaspberryPi und Infrarot-Kamera ist es nun Wirklichkeit geworden.

Dazu habe ich mir einen Nistkasten mit drei Brutkammern besorgt. Eine Brutkammer beherbergt den RaspberryPi, die zweite eine IR-Kamera und vier schaltbare Infrarot-LEDs zur “Ausleuchtung” der Szene.

Die dritte Brutkammer ist dann noch frei für kamerascheue Piepmätze. Schließlich will ja nicht jeder in nen BigBrother-Container einziehen. 😉

Die Kamera schießt alle zwei Minuten ein Bild, welches der Raspi dann auf den Webserver hochlädt. Die IR-LEDs werden dazu nur während der Aufnahme des Bildes eingeschaltet und sind ansonsten zwecks Energieeinsparung abgeschaltet.

Ein simples Foto alle paar Minuten ist natürlich nicht

 

sooo der Brüller. Deshalb werde ich mal schauen, ob ich es hinbekomme, aus den einzelnen Bildern tageweise einen Zeitrafferfilm zu erstellen.

Technisch ist das kein Problem, da muss ich nur etwas Zeit und Hirnschmalz investieren. Wobei ersteres natürlich meistens das Problem ist… ;-).

Da der Raspi als Speicher üblicherweise nur eine SD-Karte benutzt und diese bei vielen Schreibzugriffen bekanntlich nur eine ziemlich kurze Lebensdauer besitzen, habe ich zum Speichern der Fotos eine RAM-Disk mit 8MB Größe angelegt.

Dazu habe ich als root das Verzeichnis /mnt/ram erstellt und danach  die Datei /etc/fstab um die folgende Zeile ergänzt:

Danach ein

und die RAM-Disk steht ab sofort zur Verfügung. Natürlich lassen sich dort auch andere temporär genutzte Dateien mit vielen Schreibzugriffen ablegen, ich denke da z.B. an diverse Logdateien u.ä..

C-Berry: Linien zeichnen

Recktecke und Kreise sind zwar schon recht hübsch, aber Linien braucht man auch noch ;-).

Benutzung:

 

Hier der Quellcode:

 

Und für alle, die zu faul zum Abtippen sind, hier das File zum Download: tft_line.c

C-Berry: Rechtecke zeichnen

Und weiter geht’s mit dem C-Berry-Display. Diesmal werden Rechtecke gezeichnet.

Genutzt wird der Befehl wie folgt:

x1,y1: Ecke  oben links, gültige Werte: x1 0…319, y1 0…239
x2,y2:  Ecke unten rechts, gültige Werte: x2 0…319, y2 0…239
color:  Farbe, mit der das Rechteck gezeichnet wird
modus:  0 – nicht gefüllt, 1 – gefüllt zeichnen

Auch hier ist es so, dass das Rechteck komplett gefüllt gezeichnet wird.

UPDATE:

Auch dieser Quellcode und die dazugehörige Datei zum Download sind aktualisiert. Es können jetzt auch ungefüllte Rechtecke gezeichnet werden.

 

Quellcode:

Und hier die Datei zum Runterladen.

 

C-Berry: Kreise zeichnen

Heute gibt es den nächsten Schnipsel C-Code rund um das C-Berry Display. Diesmal geht es um das Zeichnen von Kreisen.
Mit tft_circle lassen sich, wie schon geschrieben, Kreise auf das Display zeichnen.

Aufgerufen wird der Befehl mit den folgenden Parametern:

tft_circle position_x position_y radius füllfarbe modus

Dabei haben die einzelnen Parameter folgende Wertebereiche:

  • Position_X: 0…319
  • Position_Y: 0…239
  • Radius: 0…319
  • Füllfarbe: 0…255
  • Modus: 0 – nicht gefüllt, 1 – gefüllt zeichnen

In dieser Version lassen sich nur gefüllte Kreise zeichnen, will man einen einfachen Kreis ohne Füllfarbe, zeichnet man einfach einen zweiten Kreis an die gleiche Position, verkleinert den Radius und nutzt die aktuelle Hintergrundfarbe zum Zeichnen. Ich denke darüber nach, eine zweite Version zu schreiben, die das automatisch erledigt. Mal sehen… ;-).

Update!

Ich habe mich nochmal durch den Beispielcode gekämpft und gesehen, dass es da schon eine Option gibt, Kreise und Rechtecke gefüllt oder eben nicht gefüllt zu zeichnen. Sourcecode und Datei zum Download sind entsprechend aktualisiert.

Hier nun der Quelltext:

Und für alle, die zu faul zum Abtippen sind, hier das File zum Download.

 

Neues von der Himbeere

C-Berry-DisplayVor einiger Zeit erwarb ich für den Raspberry Pi ein TFT-Display namens C-Berry mit 320×240 Bildpunkten. Bislang lag das mehr oder weniger in der Ecke, weil die Ansteuerung nur über C-Programmierung zu machen ist, bzw. über einen Umweg mit Python. Wobei dort mithilfe von Pygame ein Bild erzeugt wird und dieses dann per Shell-Kommando zum Display übertragen wird. Nicht gerade effektiv…
 
Also setzte ich mich hin, schnappte mir ein Buch für C-Anfänger und wurschtelte mich durch die mit dem Display gelieferten Beispiele. Inzwischen bin ich soweit, dass ich mir eigene Shell-Befehle zum Zeichnen von Linien, Rechtecken und der Ausgabe von kurzen Textschnipseln gebastelt habe. Letzterer ist noch nicht perfekt, weil der Text am Ende einer Displayzeile zwar umgebrochen wird, aber das passiert eben auch mitten in einem Wort. Und das ist dann ja nicht so toll… ;-).
 
Weitere Befehle zum Initialisieren und Löschen des Displays, sowie der Einstellung der Helligkeit habe ich hier gefunden.
 
Natürlich will ich den ganzen Kram nun nicht nur für mich behalten. Vielleicht hilft es dem einen oder anderen bei der Umsetzung eigener Projekte. Außerdem wäre es ja cool, wenn es jemand noch verbessern und ich dabei auch etwas lernen kann.
 
Heute gibt es zunächst den Code-Schnipsel zum Anzeigen von Text auf dem C-Berry. Wenn ihr es kompilieren wollt, solltet ihr euch vorher die orginale Software von Admatec herunterladen und entpacken. Dort findet ihr alle benötigten Header-Dateien.
 
Ich habe mir für meine Programme ein eigenes Verzeichnis angelegt und alle benötigten Dateien einschließlich des makefiles dorthin kopiert. Den nachfolgenden Code müsst ihr dann in eine Datei (bei mir heißt sie tft_string.c) kopieren.
 


#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include "RAIO8870.h"
#include <string.h>
int main( int argc, char *argv[] )
{
char text[255];
strcpy(text,argv[6]);
int fsf=atoi(argv[1]);
int px=atoi(argv[2]);
int py=atoi(argv[3]);
int col_fg=atoi(argv[4]);
int col_bg=atoi(argv[5]);

if (!bcm2835_init()){
printf("tft_string: Error, check your display!\n");
exit(1);
}

if( argc < 1 || argc > 7){
printf("tft_string: Error, check arguments!\n");
printf("Use 'tft_string fontsize pos_x pos_y fg_color bg_color string'");
exit(1);
}

if( strlen(text) > 255){
printf("tft_string: Error, string too long! Limit: 255 chars \n");
exit(1);
}

if( col_fg < 0 || col_fg > 255){
printf("tft_string: Error, foregroundcolor out of range! Use 0...255! \n");
exit(1);
}

if(col_bg < 0 || col_bg > 255){
printf("tft_string: Error, backgroundcolor out oft range! Use 0...255!\n");
exit(1);
}

if( px < 0 || px > 319){
printf("tft_string: Error, pos_x out of range! pos_x: 0...319!\n");
exit(1);
}

if ( py < 0 || py > 239){
printf("tft_string: Error, pos_y out of range! pos_y: 0...239!\n");
exit(1);
}
if ( fsf < 0 || fsf > 20){
printf("tft_string: Error, bad fontsize! fs: 0...20!\n");
exit(1);
}

RAIO_SetFontSizeFactor ( fsf );

RAIO_print_text ( px, py, text, col_bg ,col_fg);


return 0;
}

 

Vor dem Kompilieren müsst ihr das orginale Makefile noch etwas bearbeiten, sonst rattert es Fehlermeĺdungen 😉
 

all: tft_string

tft_string: tft_string.o tft.o RAIO8870.o
gcc tft_string.o tft.o RAIO8870.o -lbcm2835 -lrt -o tft_string

tft.o: tft.c tft.h
gcc -Os -c tft.c

tft_string.o: tft_string.c
gcc -Os -c tft_string.c

RAIO8870.o: RAIO8870.c RAIO8870.h
gcc -Os -c RAIO8870.c

clean:
rm -rf *o tft_string

 
So sollte es anschließend aussehen. Danach wird das Progrämmchen mit “make” erstellt. Wenn alles ohne Fehlermeldung kompiliert wurde könnt ihr es gleich testen mit einem fröhlichen “Hallo Welt” :-).
 

sudo ./tft_string 0 10 10 255 0 "Hallo Welt"

 
Wichtig: alle Parameter nach dem “./tft_string” müssen durch Leerzeichen voneinander getrennt sein! Die Parameter bedeuten im einzelnen:

0 ------------ Schriftgröße, gültiger, von mir willkürlich festgelegter Wertebereich 0-20
10 10 -------- Cursorposition x y, gültiger Wertebereich: x 0-319, y 0-239
255 ---------- Schriftfarbe, hier Weiß, gültiger Wertebereich: 0-255
0 ------------ Hintergrundfarbe, hier Schwarz. Gültiger Wertebereich: 0-255
"Hallo Welt" - sollte klar sein. Es sind maximal 255 Zeichen möglich.

 
Damit der Befehl systemweit aufgerufen werden kann, kopiert ihr ihn (wenn er euch gefällt und funktioniert) nach /usr/bin.
 
Für Fragen, Anregungen und Hinweise nutzt bitte die Kommentarfunktion (solange sich der SPAM in Grenzen hält) oder das Kontaktformular!
Sollten hier irgendwo grobe Fehler vorhanden sein, denkt bitte dran: Ich bin C-Anfänger! Also bitte nicht hauen, sondern sagen, wie man es besser macht… 😉
 
Hier noch ein kleines Demo. Ein Shellscript, das die Uhrzeit auf das C-Berry schreibt, bestehend aus ganzen 8 Zeilen… 🙂
 

Stalk-Pi / 2

Foto: Infrarotaufnahme vom NistkasteninnerenHeute war es soweit. Nach einem Besuch auf dem Baumarkt des geringsten Misstrauens, bei dem ich ein notwendiges Werkzeug für die “Operation Kamera” erstand, ging es zur Sache.
 
Das Objektivgehäuse der Kamera hat jetzt zwar einen unschönen Kratzer, aber der Eingriff scheint mehr oder weniger gelungen zu sein. Das Bild ist scharf, aber irgendwie ist jetzt immer ein dunkler Streifen in der Mitte des Bildes. Mal sehen, woher das kommt und ob ich das noch weg bekomme. Zur Not geht es so, besser als gar kein Blick in den Kasten. Ein weiterer Punkt wäre die Optimierung der Beleuchtung. Die LEDs machen einen hübschen hellen Spot in der Mitte. Den muß ich auch noch irgendwie “entschärfen”. Vielleicht hilft es, die LEDs etwas mit der Feile zu bearbeiten…
 
Als nächstes muß dann die Befestigung der Kamera noch etwas optimiert werden. Das ist mir alles noch zu wacklig und der Blickwinkel verstellt sich deshalb zu leicht. Danach kommt der Temperatursensor an die Reihe.

Stalk-Pi

Foto: Nistkasten mit Raspberry Pi, Kamera und IR-Beleuchtung
Schon seit dem Kauf meines ersten Raspberry Pi liebäugelte ich damit, mal einen Nistkasten mit einer Kamera zu versehen und dann zu schauen, was da drin passiert.
Lange hat es gedauert, aber nun nimmt das Projekt Gestalt an.
 
Angeregt wurde ich nach längerer Zeit durch das Buch “Raspberry Pi – das umfassende Handbuch”. Dort haben die Autoren das gleiche Thema angepackt. Bei mir hing es die ganze Zeit ja eigentlich nur daran, dass ich … hm … ja … zu faul war, einen passenden Nistkasten zu bauen. Aber das haben die Autoren des Buches auch nicht gemacht, sondern auf ein fertiges Produkt zurückgegriffen.
 
Na das kann ich auch… ;-)! Also wurden fix ein paar Onlineshops durchstöbert, bis ich das passende Modell relativ preiswert fand. Es dauerte gar nicht lange, da lag das Teil im Paketkasten und die Bastelei begann. Zunächst kam der 3D-Drucker zum Einsatz, weil der Pi ja ein Gehäuse braucht. Danach folgte der Druck eines Gehäuses für die Kamera. Nachdem das erledigt war, ging ich das Problem des fehlenden Lichtes im Nistkasten an.
 
Damit die Piepmätze sich nicht gestört fühlen, kommt natürlich nur eine InfraRot-Beleuchtung infrage. Weil ich nicht wirklich weiß, ob die Piepmätze sich von der IR-“Beleuchtung” vielleicht doch gestört fühlen, ist sie nicht permanent an, sondern über Transistoren per Raspberry-GPIOs schaltbar. Um die LEDs optimal positionieren zu können, konstruierte ich mit FreeCAD fix zwei kleine “Kronleuchter” und druckte sie anschließend aus.
 
Als sparsamer Bastler testete ich zunächst, wie sich die IR-LEDs einer vom letzten Röhrenfernseher versehentlich übriggebliebenen Fernbedienung als “Lichtquelle” machen. Den Versuch war es wert, aber das Ergebnis war leider enttäuschend. Also wurden in der Bucht mal fix ein paar andere LEDs ersteigert und die machen jetzt wirklich “Licht”, obwohl ich sie nicht mal mit der maximal möglichen Leistung betreibe.
 
Bis dahin ist erstmal alles soweit klar. Leider gibt es da noch ein kleines Problem mit der Kamera. Der Hersteller hat “die Linse” selbiger nämlich dummerweise verklebt und den Fokus somit fest eingestellt. Richtig scharf sind die Bilder auf die kurze Distanz im Nistkasten deshalb leider noch nicht und das Problem lässt sich nur mit roher Gewalt lösen. Geht dabei etwas schief, sind so um die 30 Euro für eine neue Kamera fällig…
 
Diesen Akt werde ich dann in den nächsten Tagen angehen. Außerdem, weil der Pi ja sonst hoffnungslos unterfordert wäre, kommt noch ein Temperatursensor in den Kasten.
Kamerabild und / oder Video werden dann im nächsten Schritt hier im Blog eingebunden. Dazu später mehr.

Folge mir auf Twitter
Wetter aktuell
Messung vom 20.09.2017, 14:45

Temperatur: 12.6°C
rel. Luftfeuchtigkeit: 79 %

Wind: 1.9 km/h

Regensensor: 0 => Kein Regen

Luftdruck: 1017.24 hPa

Feinstaubmesswerte:

PM2,5: 1.2 μg/m³
PM10: 1.7 μg/m³

Sonnenaufgang:  06:52
Sonnenuntergang: 19:13

Haste wieder am falschen Ende gespart und den Filter vergessen? 😂 twitter.com/Herr_Mos…

Gestern von portitzers Twitter via Twitter for Android

Aus dem Fotoalbum

Moscheen, Kirchen, Synagogen - Akko

Blühender Granatapfel in Akko

Markt in Akko