Kleiner Denkfehler

In meiner Euphorie über die Inbetriebnahme der Wetterstation habe ich einen kleinen Fehler gemacht! Der Sensor ist ungeschützt! Bislang ist mir da nichts negatives aufgefallen. Aber nun, da ich die Werte des Sensors ja im Widget sehe, wird es dann doch deutlich.

Die Sonne ist über den Tag natürlich gewandert. Bislang war das kein Problem, denn dort, wo der Sensor sitzt, war bisher Schatten. Nun steht die Sonne jedoch so, dass der Sensor direkter Einstrahlung ausgesetzt ist. Okay, es ist nicht kalt draussen, aber was der Sensor mir anzeigt ist ein wenig übertrieben!

Laut dem Widget sind draussen runde 38°C. Ganz ehrlich, dass glaube ich ihm nicht! Kalt es es wirklich nicht, aber 38°C? Nee.

Leider ist die Sache aber logisch und hätte mir direkt auffallen müssen. Ich denke auch, die Meisten, die das hier lesen, werden meinen Fehler schon lange erkannt haben! Natürlich heizt der sich auf, wenn er von der Sonne angestrahlt wird. Ergo, ich bekomme keine korrekten Daten!

Aber gut. Kleiner Rückschlag, dummer Denkfehler, kann man beheben! Ich werde einfach einen Schutz dafür bauen. Erst einmal aus Pappe, um die Wirkung zu sehen. Wenn das klappt, drucke ich mir ein Gehäuse für den Sensor, den ich draussen anbringe. Hoffentlich kriege ich damit dann die korrekten Werte!

Der nächste Client ist da!

Tja, kaum vermelde ich die Inbetriebnahme der Wetterstation, kann ich schon den nächsten Fortschritt vermelden!

Ja, wenn es läuft …

Wie ich im letzten Artikel ja geschrieben habe, Daten in einer Datenbank nutzen nichts, wenn man damit nicht auch irgendwie arbeiten kann. Das Widget für Awesome-WM ist ja nichts besonders und kann eigentlich nichts, deshalb hier jetzt der nächste Client. Der kann zwar auch noch nichts, aber dem werde ich noch Abhilfe schaffen!

Nice, oder? Was kann das gute Stück denn nun?

Es kann die Daten aus der Datenbank abrufen. Immerhin!

Na gut, ein bisschen mehr macht der Client schon. Drückt man auf Abrufen, zieht das Programm zuerst alle Daten aus der Datenbank. Logisch. Dabei zeigt es in der Status-Leiste an, wie viele Datensätze abgerufen werden und verarbeitet diese.

Was heisst verarbeiten? Die Rohdaten beinhalten die UNIX-Zeit und die jeweiligen Temperaturdaten. Da ich aber nicht so gut im lesen der Unix-Zeit bin, bzw. in der Umrechnung, will ich natürlich Zeit und Datum so vorfinden, dass ich sie auch sofort verstehe. Das macht das Programm schon beim abrufen. Ausserdem soll, wenn auch nur für die Optik, °C hinter der Temperatur stehen. Auch das macht das Programm.

Schlussendlich zeigt es die Werte in der Liste an und beendet seine Arbeit. Das ist natürlich noch nicht viel, aber stellt nur den Anfang dar! Daran werde ich noch weiterarbeiten. Das Plotten aller Daten, oder nur von ausgewählten zum Beispiel. Auch den Zugriff auf die Speicherkarte der Wetterstation will ich noch einbauen. Das hatte ich ja schon in der ersten Variante. Ich denke aber, im Laufe der Zeit werden mir da noch einige Dinge einfallen, die ich dem Programm antun kann. Für den Moment soll das so aber reichen.

Wetterstation in Betrieb!

Man mag es kaum glauben, aber die Wetterstation ist nun offiziell in Betrieb!

Ich habe es mir gespart, die Herstellung des Kabels zu zeigen. Ich denke mal, jeder, der Interesse an so etwas hat, wird wissen wie man so etwas zusammenlötet. Spannend fand ich das also eher weniger.

Aber gut, jetzt ans Eingemachte!

Wie im letzten Artikel gezeigt, sitzt die Platine mit dem Arduino Nano und den beiden Temperatursensoren neben dem Raspberry Pi unter meinem Tisch. Ein Sensor erfasst die Temperatur im Raum, einer die draussen vor dem Fenster. Der Arduino ermittelt die Daten und speichert sie auf der SD-Karte.

Hier muss ich anmerken, ohne eine Uhr ist das wenig nutzbringend. Die Wetterstation soll aber irgendwann mit einer Uhr ausgestattet werden, so dass die Daten auf der SD-Karte mit der entsprechenden UNIX-Zeit gespeichert werden. Auf diese Weise kann der Server die Daten in der Datenbank synchronisieren. Ist aber noch Zukunftsmusik.

Okay. Der Wetterserver auf dem Raspberry Pi ruft nun alle 60 Sekunden die Daten vom Arduino ab und speichert sie in der Datenbank. Das lief ja vorher schon einwandfrei, muss ich also nichts mehr zu sagen.

Solche Daten sind auch schön und gut, nur nützen sie ja nichts, wenn man damit nichts anfangen kann. Deshalb nun die erste Client-Software, die auf meinem Arbeitsgerät läuft. Natürlich in C++ geschrieben, wie sich das gehört. Wobei ich aber auch sagen muss, für das, was das Programm macht, ist C++ eigentlich übertrieben. Es ist und bleibt aber meine bevorzugte Programmiersprache.

Was macht der Client?

Sehr wenig. Er ruft einfach die Daten für die Aussentemperatur aus der Datenbank des Servers ab und gibt sie aus. Also eigentlich kein wirklicher Aufwand.

Für Awesome-WM habe ich mir ein kleines Widget gebaut (wie man das macht will ich auch noch beschreiben), welches die Aussentemperatur in der unteren Leiste anzeigt.

So sieht das dann bei mir aus. Ja, wie man sehen kann ist das Bild wirklich zeitnah erstellt, da ich gerade an dem Beitrag hier arbeite.

Unten Links ist nun die aktuelle Temperatur ablesbar. Das Widget aktualisiert sich alle 60 Sekunden, bekommt also immer die aktuellen Werte vom Server.

Hier noch einmal in “gross”.

Ich freue mich deshalb sagen zu können, eins meiner Projekte ist nun wirklich betriebsbereit. Noch nicht so weit entwickelt, wie ich es haben will, aber es läuft und das freut mich!

Die Halterung

Das war ziemlich einfach. Erstellt war das Teil schnell und so sieht es aus:

(aus dem letzten Artikel)

Hier zeigt sich wieder die unglaubliche Präzision des 3D Drucker. Die Platine passt so genial da rein, ich bin einfach nur fasziniert! Hier das Ergebnis:

Kleine Zwischenbemerkung:

Der 3D-Drucker ist in meinen Augen wirklich eine der genialsten Entwicklungen seit vielen Jahren! Laut Cura soll das Objekt exakte 4g haben. Habe ich gewogen, stimmt! Ich habe auch vorher und nachher die Rolle mit dem Filament gewogen. Ebenfalls ein Verlust von 4g. Das heisst, ich habe so ziemlich nur exakt das benötigte Material verbraucht! Würde ich so ein Objekt fräsen, wäre der Verschnitt viel, viel grösser. Spritzguss kommt ja auch nicht infrage, da man dafür erst eine Form herstellen müsste. Brutaler Aufwand für nur ein Objekt. Wobei ich diese Halterung natürlich auch für andere Platinen dieser Grösse nutzen kann! Auf jeden Fall, es ist einfach nur genial. Am Computer mit den exakten Abmessungen erstellt, kurz darauf hat man es als physisches Objekt in der Hand. Extrem genial!

Also, unter den Tisch mit dem Ding!

Zum guten Schluss noch die Platine rein, verkabeln, fertig!

Tut mir leid, dass es so unscharf ist.

Nachdem das alles so wunderbar funktioniert hat, muss ich jetzt nur noch ein Kabel für den Aussensensor bauen und dann kann ich mit der Entwicklung der Software beginnen.

Wetterstation: Es geht weiter!

Ja, nur weil ein Projekt eine Zeit inaktiv ist, ist es noch lange nicht abgebrochen! So verhält es sich nun auch mit der Wetterstation, die eigentlich auf Module wartet und deshalb schon einige Zeit unangetastet geblieben ist. Doch nun geht es weiter, mit neuer Erfahrung und einem neuen Ansatz!

In der Zwischenzeit

Seit dem letzten Artikel zur Wetterstation ist nicht wirklich viel passiert. Eigentlich will ich die Station mit einer eigenen Uhr ausstatten, damit auch auf der SD-Karte die Daten mit Zeitstempel gespeichert werden. Ausserdem will ich noch ein paar Sensoren für die Überwachung der Umwelt. Aber, ist alles noch nicht da, aus verschiedenen Gründen.

Bislang war ja die Idee, dass ein Server auf dem Raspberry Pi eine Kommunikation zur Wetterstation herstellt und man auf diesen Server von aussen zugreifen kann. Das heisst also, ich muss eine Software für den Server schreiben und eine für den Client. Dieser Schritt hatte ich ja schon in Angriff genommen.

In der Zwischenzeit musste ich jedoch, aufgrund eines anderen Projektes, die Arbeit mit Datenbanken erlernen. Dazu benutze ich eine Postgres-Datenbank. Dabei kam mir die Idee, auch auf dem Raspberry eine solche Datenbank einzurichten. Dieser Schritt ist auch schon erledigt und funktioniert einwandfrei!

Aktueller Stand

Die Software der Wetterstation ist unverändert geblieben. Sie speichert nach wie vor die Daten auf der SD-Karte und kann vom Server noch entsprechend gesteuert werden.

Den Server hingegen habe ich komplett neu geschrieben. Es ist nur ein kleines Programm, welches die Innen- und Aussentemperatur alle 60 Sekunden abruft. Die empfangenen Daten werden dekodiert, mit Zeitstempel (Unix-Zeit, also Sekunden seit dem 01.01.1970) versehen und in der Datenbank gespeichert. Da alles in den Tests einwandfrei funktioniert hat, liegt der Server nun in Version 1.0 vor.

Da sich Software und Verkabelung der Wetterstation bewährt hat, habe ich nun auch eine Platine gelötet. So sieht das nun aus:

Ist vielleicht nicht schön, aber selten! Am wichtigsten ist aber, es funktioniert! Ein Test hat ergeben, die SD-Karte wird einwandfrei mit Daten gefüllt und die Kommunikation mit dem Server, inklusive Übergabe der Temperaturen, funktioniert einwandfrei!

Ich habe die Platine so gestaltet, dass alle Komponenten ausgetauscht werden können.

Wie geht es jetzt weiter?

Drei Punkte sind noch zu erledigen, bevor ich die Wetterstation offiziell als “In Betrieb” bezeichne.

  1. Eine Halterung für die Platine muss her. Die werde ich mit Blender erstellen und ausdrucken. Ich will sie so gestalten, dass ich die Platine einfach darauf drücken kann und diese einrastet. Des Weiteren wird die Halterung mit zwei Schrauben unter den Tisch geschraubt.
  2. Einer der Sensoren soll mit einem langen Kabel aus dem Fenster geführt werden, um die Aussentemperatur zu ermitteln. Das Kabel muss ich noch bauen.
  3. Ich muss noch Software entwickeln, mit welcher ich die Daten auch verwenden kann. Derzeit habe ich zwei Varianten im Sinn. Einmal eine, welche Innen und Aussentemperatur einfach ohne GUI ausgibt, um damit ein Widget für Awesome erstellen zu können. Zum Anderen will ich eine Software haben, welche die ganzen Daten aus der Datenbank holen und auswerten kann. Mit Graphen und was auch immer. Da bin ich mit meinen Überlegungen noch nicht ganz durch.

Version 0.2

In Version 0.2 erfasst der Arduino Nano mittels zwei DS18B20 die Innen- und Aussentemperatur und speichert die Daten auf die SD-Karte. Da noch keine RTC verbaut ist, erscheint bei Uhrzeit und Datum natürlich immer der selbe Wert, was ohne eine entsprechende RTC kaum zu ändern ist.

Der Arduino wartet auf Eingabe über die serielle Schnittstelle. Ausgegeben können die Informationen der SD-Karte inklusive deren Grösse und wie viel Speicherplatz noch frei ist, die aktuellen Daten und alle gespeicherten Daten. Ausserdem kann der Arduino auf Kommando auch die Speicherkarte wieder löschen, was in der Backup-Funktion zum Einsatz kommen soll.

Kommunikation zwischen Arduino und Raspberry übernimmt die Server-Software der Wetterstation, welche rein über die Kommandozeile läuft. Geschrieben wird der Server in C/C++ mit Visual-Studio-Code unter Verwendung von cmake. Der Einfachheit halber bekommen alle Komponenten immer die gleiche Versionsnummer.

Der Server baut dabei einen Socket auf und wartet auf Anfragen. Diese können von verschiedenen Anwendungen kommen und spezifisch auf verschiedene Gebiete ausgelegt sein. Beispielsweise dem Erzeugen eines Widgets, wobei kein GUI notwendig ist und nur die aktuellen Daten abgefragt werden.

Die vollständige Client-Software kann sämtliche Informationen der Wetterstation abrufen. Von der SD-Karte, die aktuelle Werte, wie auch alle gespeicherten Werte. Es wird angezeigt, wie viel Speicherplatz noch auf der Karte ist, die Karte kann gelöscht und es kann ein Backup erstellt werden. Beim Backup werden alle Daten von der Wetterstation auf den Computer übertragen und in einer Datei gespeichert. Ist die Datei bereits vorhanden, so werden die neuen Daten angehängt, um ein vollständiges Bild seit Beginn der Aufzeichnung zu bekommen. Im Anschluss wird die Speicherkarte gelöscht, um die Zeit der Übertragung zu verkürzen.

Auch der Client wird in C/C++ mit Visual-Studio-Code geschrieben und verwendet zum Erzeugen des GUI die Bibliothek Nana.

Aktueller Stand (03.12.2018):

  • Schaltung aufgebaut und getestet
  • Die Firmware des Arduino verfügt über alle geforderten Funktionen
  • Der Server kann alle Daten der SD-Karte auslesen und übertragen
  • Der Server kann die Temperaturen abrufen und übertragen
  • Der Server speichert die Temperaturen mit falscher Uhrzeit und Datum
  • Der Server kann alle Daten der SD-Karte übertragen
  • Der Server kann die Speicherkarte löschen
  • Die GUI des Client ist fertiggestellt.
  • Der Client kann die Informationen der Speicherkarte abrufen und anzeigen.

ToDo:

  • Abrufen und anzeigen aller gespeicherten Daten
  • Aktualisierung der SD-Karten-Informationen
  • Löschen der SD-Karte
  • Backup

Bekannte Bugs:

  • Gelegentliche Abstürze beim Start, die auch den Server zum Absturz bringen
  • Beim Abrufen der aktuellen Daten besteht die erste Übermittlung immer in der Ausgabe der SD-Karten-Informationen

Wetterstation Beschreibung

Auch heute haben wir wieder Wetter, Wetter, Wetter! Wir haben unglaublich viel Grad. Da 30, dort 60 und da drüber 90 Grad. Ach nein, dass waren ja Winkel!

Spass beiseite! Irgendwie, wenn es um Arduino und Co geht, dann ist da immer irgendwo eine Wetterstation dabei. Dem will ich mich natürlich nicht entziehen! Allerdings will ich es dabei auch ein bisschen übertreibe!

Zielsetzung:

  • Erfassen der Aussentemperatur
  • Erfassen der Innentemperatur
  • Erfassen der Luftfeuchtigkeit
  • Erfassen der Witterung (Regen, oder kein Regen)
  • Speichern aller Daten auf eine 2GB SD-Karte (die sollte eine Zeit halten)
  • Kommunikation zwischen Arduino und einem Raspberry Pi mittels des USB-Port
  • Bereitstellung eines Servers auf dem Raspberry Pi
  • Client-Software zum Abrufen der Daten. Aktuelle Daten, alle gespeicherten Daten, Backup, SD-Karten-Informationen
  • Ausgabe der aktuellen Wetterinformationen auf einem OLED Display

Warum gleich so viel? Nun, warum nicht? Wenn, dann richtig, oder?

Im Prinzip soll die Wetterstation dazu dienen, die Wetterdaten zu sammeln. Der Arduino soll autonom laufen, also nicht auf den Strom vom Raspberry angewiesen sein, damit der Raspberry auch neugestartet und daran gearbeitet werden kann. Der Raspberry dient dabei als Ausgabe und Server gleichzeitig. Dadurch soll bewerkstelligt werden, dass an anderen Computern im Netzwerk die aktuellen Wetterdaten abgerufen und ausgewertet werden können. Beispielsweise ist auf diese Weise ein Widget mit echten Daten vor Ort denkbar.