Der RoomController kommt… (Teil 1)

Nachdem ich nun bereits seit längerer Zeit einige Dinge mit dem ESP8266 angestellt hatte, bin ich auf die Idee gekommen einen RoomController zu bauen. Der Controller sollte bestimmte Umgebungsinformationen sammeln und zur weiteren Auswertung weiterleiten. Die folgenden Anwendungszenarien sind mir dabei zuerst in den Sinn gekommen:

Use Cases

  1. Automatisches Anschalten von Licht über einen Bewegungsmelder.
  2. Helligskeitssensor, um festzustellen das Licht eingeschaltet werden sollte wenn der BWM es meldet.
  3. Temparatursensor, um die Heizung ggf. zu steuern.

Sensoren

Ich finde es immer sehr angenehm über I2C oder SPI die Daten der Sensoren zu empfangen. Gerade der I2C hat bei meinem bisherigen Projekten immer sehr gut funktioniert und daher setzte ich immer gerne auf Sensoren, die I2C unterstützen. Folgende Sensoren habe ich daher geplant.

  1. Bewegungsmelder (PIR <Link>) – Adafruit PIR Motion sensor
    1. Hier habe ich vor einiger Zeit mal den Sensor von Adafruit <Link> besorgt, der sehr gut funktioniert hat und softwareseitig leicht einzubinden war.
  2. Helligkeitssensor  – Adafruit TSL2561 Digital Light Sensor (Link)
    1. Auch den hatte ich mir bereits vor längerer Zeit angeschaut. Er ist gut geeignet, weil es I2C kann und die Adafruit Bibliothek auch LUX Werte errechnen kann.
  3. Temperatursensor – SparkfunAtmospheric Sensor Breakout – BME280 (Link)
    1. Auch mit diesem Sensor habe ich bereits positive Erfahrungen. Er kann neben der Temparatur auch die Luftfeuchtigkeit und auch den Luftdruck messen. Bosch hat mit dem BME680 einen neuen rausgebracht, aber der wird ggf. in einer neuen Version des RoomControllers eingesetzt werden.

Ich habe mich für Sensoren entschieden, die bereits auf Leiterplatten aufgebaut sind und die über eine verfügbare Library angesteuert werden können. Man kann sich den BME280 z.B. auch selbst bei Mouser bestellen und auf die Leiterplatten löten, doch das hätte dann alles noch etwas länger gedauert und hätte den Grad der Komplexität doch nochmal etwas erhöht.

Funktion und Logik

Der RoomController soll als reiner Sensor ohne viel Intelligenz funktionieren. Im Kern ist seine Aufgabe die Sensordaten über WiFi mittels MQTT an einen MQTT Broker zu senden. Die eigentliche Logik, also welche Aktionen auf Basis der Sensordaten ausgeführt werden sollen, wird dann Node-Red übernehmen.

 

Prototype

In einem frühen Prototypen habe ich mal probiert, welche Maße die Platine und dann eben auch das Gehäuse benötigen. Daneben wollte ich auch Erfahrungen mit dem Design der Leiterbahnen sammeln, um dieses in ein finales PCB Design einarbeiten  zu können.

Einen der vorderen Plätze im Wettbewerb des Schönlötens habe ich mit diesem Werk mal wieder weit verfehlt, doch beim Piloten geht Funktion erstmal vor.

Ich habe hier bereits auch gleich einen Step-down Converter eingebaut, welcher den ESP8266 mit Strom versorgt. Da der PIR meiner Erfahrung nach nur sauber mit 5 Volt läuft (er kann zwar umgestellt werden, aber das hat bei mir nie richtig funktioniert), gehe ich mit 5 Volt auf das Board und über den Buck Converter (Link) dann auf 3,3 Volt.

Ich habe dafür den Pololu S7V8F3 Voltage Regulator (Link) genommen, der bis zu 1 Ampere liefern kann.

Learnings:

  • Befestigung des ESP8266
    • Hier hatte ich mir meinen eigenen Adapter gebaut. Hat gut funktioniert, ist jedoch recht aufwändig. Besser sind Lötadapter (Link), welche auch schon Pull-Up Widerstände haben. Die Adapter sind für die Arbeit am Breadboard ggf. zu gebrauchen, doch für die Montage auf einem PCB nicht geeignet. Also habe ich mich dafür entschieden, den ESP8266 später direkt auf die Platine zu löten. Er kann dann zwar nicht getauscht werden, aber der Preis rechtfertigt das.
    • Noch ein Wort zu dem Lötadapter. Der ist 12 Breadboard Pins breit und passt daher genau auf ein Breadboard. Etwas unglücklich ist nur, dass die Abgänge dann nicht so gut verkabelt werden können weil kein Platz mehr frei ist. Oder habe ich hier etwas falsch verstanden. <Bild>
  • Bohrungen für das Gehäuse berücksichtigen
    • Je nach Gehäuse (Der englische Fach- und Google-Begriff ist hier „Sensor enclosure“) sind unterschiedliche Platinenbohrungen vorzusehen, welche dann wiederum das PCB Design beeinflussen.
  • Aufbauhöhe berücksichtigen.
    • Besonders, wenn im Deckel noch der PIR eingebaut werden soll ist es wichtig, dass der Gehäusedeckel noch auf den Boden passt. Hier können umfangreiche CAD Programme helfen, doch wäre dies sehr aufwändig und es geht doch nichts über die Praxis.
  • Gesamtgröße der Platine

Wie man aus den Learnings erkennen kann, habe ich noch nicht so viele Projekte mit Gehäusen gemacht. Der Prototyp war mir dabei aber eine sehr große Hilfe. Das manuelle legen der Leiterbahnen ist zwar ein gewisser Aufwand, doch diese Erfahrungen können dann beim virtuellen Design mit KiCAD sehr gut eingesetzt werden. Man bekommt einfach ein Gefühl für das Board.

Display

Vor einiger Zeit hatte ich mal etwas mit einem 0,96″ OLED Display herumexperimentert (Link). Die sichtbare Fläche ist ca. 25mm x 12mm und prinzipiell dafür geeignet ein paar Informationen im Rahmen des RoomController Projektes anzuzeigen. Da ich jetzt am Anfang die Hard- und Software im Funktionsumfang nicht überladen wollte, habe ich erstmal auf den Einbau verzichtet. Aus dem Projekt „Es knistert …“ wusste ich allerdings, dass das Display neben den klassischen 4 I2C Leitungen (3,3 V, GND, SCL (Signal Clock)  und SDA (Signal Data)) auch eine Reset Leitung benötigt, welche dann auf einen ESP8266 GPIO gesteuert wird.

Das Display hat eine Auflösung von 128 x 64 und das interessante daran ist, dass die oberen 50 Pixelreihen in gelber Schrift erscheinen und alles darunter in blauer. So kann man eine Art von Statuszeile darstellen.

 

 

Im Design habe ich das Display aber nur Optional vorgesehen und die Verkabelung eingeplant.

 

Gehäuse  / enclosure box

Eine recht schwierige Aufgaben war das Finden des richtigen Gehäuses, weil die Auswahl auch das PCB Design (Bohrlöcher) beeinflusst.

Hier habe ich einiges probiert und habe mich dann für ein Gehäuse von Evatron aus UK entschieden (Link). Das ist weiß, hat eine gute größe, ist gut verarbeitet, hat eine gute Dokumentation, ist recht stabil und der Preis ist auch in Ordnung.

Ein Nachteil ist aber, dass hier keine Bohrungen für den Anbau auf eine Schalterdose vorhanden sind. Da muss man dann messen und bohren. Diese Bohrungen hat das IEC276 von Spiratronics (Link) zwar, aber leider nur in der Farbe Elfenbein.

 

Schaltplan und PCB Layout

Um mein herumgebrate mal etwas zu professionalisieren, habe ich dann mit KiCAD ein saubers Schema und ein PCB-Layout gestaltet. Das war dann auch die Grundlage für die PCB Fertigung. Ich habe mich etwas nach guten PCB Tools umgeschaut und bin bei KiCAD hängengeblieben. Dazu gibt es eine Menge guter Einführungsvideos auf Youtube, die Software wird kontinuierlich weiterentwickelt und die Bedienung fand ich angenehm.

Hier noch ein paar Anmerkungen zum Schema:

LEDs – Ich habe noch zwei PINs für LED (rot und grün) vorgesehen. So kann ich von außen sehen, ob alles OK ist oder ob eine bestimmte Verbindung (Kein LAN oder keine Verbindung zum MQTT Broker) gestört sind.

Kondensatoren: In vielen Foren kann man lesen, dass einige ESPs aufgrund einer nicht sauberen Spannungsversorgung instabil laufen. Hier wird häufig die Anwendung von Stützkondensatoren empfohlen. Hier ist ein recht guter Beitrag zu dem Thema (Link). Ich hatte mit dem ESP8266 12E bislang noch keine Probleme. Weder auf dem Breadboard noch auf einer Platine. Ich habe deshalb erstmal auf Kondensatoren verzichtet. Ich hoffe nicht, dass sich das später nochmal rächen wird.

Das PCB Layout wurde maßgeblich durch die Abmessungen des Gehäuses bestimmt und außerdem wollte ich mal sehen, wie ein so leicht abgeschrägters Board aussieht.

Hier noch ein paar Kommentare zum Layout.

SMD Widerstände: Ich habe die Widerständde (LED Vorwiderstände und I2C Pull-up) als SMD ausgelegt. Bislang hatte ich vor SMD etwas Respekt, aber der Artikel bei microcontroller.net (Link) was sehr aufschlussreich und motivierend. So habe ich die vier Widerstände (2x LED Vorwiderstand und 2x I2C Pull-up) als SMD 805 ausgelegt.

IC2 Pull-up Widerstände: Der I2C Bus benötigt Pull-Up Widerstände, damit der Bus überhaupt funktioniert. Häufig werden meister pauschal 4,7K Ohm Widerstände empfohlen, die auf VCC gezogen werden. Bei der Verwendung von Modulen (z.B. SparkfunAtmospheric Sensor Breakout) ist darauf zu achten, dass manchmal bereits Pull-up Widerstände auf dem Board vorhanden sind. Wenn man dann also mehrere I2C Boards an den Bus hängt und zusätzlich noch auf der Platine Pull-ups hat ist das für das Signal theoretisch nicht zwingend positiv. Hier (Link) hat mal jemand die verschiedenen Widerstände im I2C Bus nachgemessen.

Die meisten Boards haben aber auch eine Brücke, über die die Widerstände vom Bus getrennt werden können.

 

Ich habe mal schnell mein billich USB Oszi angeschlossen und die Messungen haben ergeben, dass ich mit 2 x 4,7K Ohm (link) an z.B. SDA eine bessere Signal Qualität (signal rise time) bekomme als mit nur 1 x 4,7K Ohm (rechts). Dafür habe ich mit 2 Rs 4,2V auf dem Bus, was aber noch weit unter 5V ist (Link) und alle Komponenten inkl. der ESP8266 GPIOs mitmachen sollten. Wo wir gerade dabei sind. Da haben sich bereits eine Menge Leute Gedanken über die 5 Volt Festigkeit (5V Tolerance) gemacht. Der beste Artikel ist hier (Link). Da hat der Espresssif CEO auch zu diesem Thema mal getwittert.

Aber ich muss wohl hier (Link) nochmal nachschauen und rechnen, um den idealen Widerstand zu bekommen.

 

 

 

 

Und weil ich die 3D Funktion von KiCAD so schön finde, hier nochmal ein Bild des Boards wie es hoffentlich nach der Produktion aussehen wird.

Ich werde jetzt mal testweise zwei Boards bestellen und bin gespannt, was da kommt. Wenn es alles so ist wie ich es mir vorstelle, werde ich die KiCAD Files auf Github bereitstellen.

Im nächsten Teil wird es dann um die Bestückung der Platine, die Stromversorgung und den Einbau in das Gehäuse gehen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert