Viele Funkamateure kennen die Herausforderung nur zu gut: Man arbeitet mit mehreren Antennen – etwa für verschiedene Frequenzbänder oder Richtcharakteristiken – und möchte möglichst schnell zwischen ihnen wechseln. Das manuelle Umstecken der Antennenkabel ist jedoch unpraktisch und kann die Anschlüsse belasten. Außerdem möchte schnell umschalten können. – Genau aus dieser alltäglichen Anforderung heraus ist COM Antenna Switch entstanden – meine eigene Lösung, um das Umschalten zwischen Antennen einfach, zuverlässig und komfortabel zu gestalten. Die Anwendung richtet sich besonders an Funkamateure, die ihre Station modernisieren und Prozesse automatisieren möchten, ohne gleich eine komplexe oder teure Steuerhardware anschaffen zu müssen. Die Inspiration stammt von DL1DJH, vielen Dank dafür!
Funktionsweise
Die Kommunikation zwischen PC und Mikrocontroller erfolgt über eine COM‑Schnittstelle, die in der Praxis über USB bereitgestellt wird. Sobald die Anwendung startet, lässt sich der Port auswählen und die Verbindung herstellen. – Ein Arduino oder ESP32 empfängt anschließend serielle Befehle vom PC. Diese Befehle steuern die Relais, die wiederum die Antennenpfade schalten. Dabei gilt ein zentrales Sicherheitsprinzip: Es kann immer nur eine Antenne aktiv sein. Wählt man eine bereits aktive Antenne erneut an, wird diese deaktiviert, sodass bewusst gar keine Antenne geschaltet ist. Zusätzlich besitzt der Mikrocontroller eigene Eingänge, die zur Steuerung genutzt werden können, beispielsweise via Taster. Die Funktionalität bleibt dabei identisch: Umschalten und Deaktivieren.
Hardware
Die Hardware basiert auf bewährten Komponenten, die leicht zu beschaffen und zuverlässig im Betrieb sind. Kernstück ist wahlweise ein Arduino (z.B. Nano) oder ein ESP32. Beide Mikrocontroller eignen sich aufgrund ihrer seriellen Schnittstellen und Anzahl der Ein- und Ausgänge hervorragend für den Betrieb als COM‑Empfänger. Als Schaltelemente kommen Standard‑Relaismodule für Mikrocontroller zum Einsatz – die Anwendung unterstützt derzeit bis zu 7 Relais, die sich direkt an die GPIO‑Pins anschließen lassen. Diese Module sind robust, preiswert und ideal geeignet, um Antennenleitungen zu schalten. Die Verkabelung bleibt bewusst einfach: USB‑Verbindung zum PC, Relais an die Mikrocontroller‑Pins, dazu eine saubere Spannungsversorgung. Fertig ist die Grundinstallation.
Software
Die PC‑Anwendung verwendet ein schlankes layout mit intuitiver Bedienung. Die Benutzeroberfläche zeigt an, welche Antenne aktuell aktiv ist, und erlaubt den Wechsel mit nur einem Klick. Die Software steht kostenlos auf https://pautsch-edv.com/com-antenna-switch/ zur Verfügung. Sie lässt sich ohne Installation starten – ideal für den täglichen Betrieb im Shack.
Code
// v 1.1
const int outSerialNum[7] = {1, 2, 3, 4, 5, 6, 7}; // Antennenummern
const size_t outSerialNum_Size = sizeof(outSerialNum) / sizeof(outSerialNum[0]); // = 7
const int out[7] = {2, 3, 4, 5, 6, 7, 8}; // Esp32
//const int out[7] = {16, 17, 18, 19, 20, 21, 22}; // Ardino Nano
const size_t out_Size = sizeof(out) / sizeof(out[0]); // = 7
const int schalt[7] = {9, 10, 11, 12, 14, 15, 16}; // Esp32
//const int schalt[7] = {23, 24, 25, 26, 27, 28, 29}; // Ardino Nano
const size_t schalt_Size = sizeof(schalt) / sizeof(schalt[0]); // = 7
int outPinStatus[] = {0, 0, 0, 0, 0, 0, 0};
const size_t outPinStatus_Size = sizeof(outPinStatus) / sizeof(outPinStatus[0]); // = 7
void setup()
{
initPinModes();
initSerial();
}
void loop()
{
for (int i=0; i < 10; i++)
{
receiveSerial();
sendSerial();
handleSwitches();
delay(500);
}
outputPinLayout();
}
void initSerial()
{
Serial.begin(115200);
while(!Serial){} // Waiting for serial connection
Serial.println();
}
void initPinModes()
{
for (int i=0; i < schalt_Size; i++)
{
pinMode(schalt[i], INPUT_PULLUP);
}
for (int i=0; i < schalt_Size; i++)
{
pinMode(out[i], OUTPUT);
digitalWrite(out[i], HIGH); // LOW für umgekehrtes schalten
}
}
void receiveSerial()
{
// CHANGE;1=0
// CHANGE;3=1
if (Serial.available())
{
String line = Serial.readStringUntil('\n'); // liest bis '\n' oder Timeout
line.trim();
int sep = line.indexOf(';'); // trennt command und Daten
int eq = line.indexOf('='); // trennt Key und Value
if (sep > 0 && eq > sep)
{
String keyStr = line.substring(sep + 1, eq); // "1"
String valStr = line.substring(eq + 1); // "0"
int key = keyStr.toInt(); // = 1
int val = valStr.toInt(); // = 0
for(int i=0; i < outSerialNum_Size; i++)
{
if (key == outSerialNum[i])
{
if (val == 0)
{
enableAntenna(i, false);
}
else
{
enableAntenna(i, true);
}
}
}
}
else
{
Serial.println("Formatfehler");
}
}
}
void handleSwitches()
{
for(int i=0; i < schalt_Size; i++)
{
if (digitalRead(schalt[i]) == 0)
{
enableAntenna(i, true);
}
}
}
void sendSerial()
{
// STATUS;1=0;2=0;3=....;
String sendStr = "STATUS;";
for (int i=0; i < outPinStatus_Size && i < outSerialNum_Size; i++)
{
sendStr += (String)outSerialNum[i] + (String)"=" + (String)outPinStatus[i] + (String)";";
}
Serial.println(sendStr);
}
void enableAntenna(int iArrPos, bool enable)
{
if (iArrPos >= outPinStatus_Size)
{
return;
}
if (enable == true)
{
if (outPinStatus[iArrPos] == 0)
{
outPinStatus[iArrPos] = 1;
digitalWrite(out[iArrPos], LOW); // HIGH für umgekehrtes schalten
// disable rest
for (int i=0; i < schalt_Size; i++)
{
if (i != iArrPos)
{
outPinStatus[i] = 0;
digitalWrite(out[i], HIGH); // LOW für umgekehrtes schalten
}
}
}
else
{
outPinStatus[iArrPos] = 0;
digitalWrite(out[iArrPos], HIGH); // LOW für umgekehrtes schalten
}
}
else
{
outPinStatus[iArrPos] = 0;
digitalWrite(out[iArrPos], HIGH); // LOW für umgekehrtes schalten
}
}
void outputPinLayout()
{
String sendStr = "";
// OUTSERIAL;1;2;3;4....;
sendStr = "OUTSERIAL;";
for (int i=0; i < outSerialNum_Size; i++)
{
sendStr += (String)outSerialNum[i] + (String)";";
}
Serial.println(sendStr);
// OUTDIGITAL;2;3;4;5....;
sendStr = "OUTDIGITAL;";
for (int i=0; i < out_Size && i < out_Size; i++)
{
sendStr += (String)out[i] + (String)";";
}
Serial.println(sendStr);
// INSCHALT;9;10;11;....;
sendStr = "INSCHALT;";
for (int i=0; i < schalt_Size; i++)
{
sendStr += (String)schalt[i] + (String)";";
}
Serial.println(sendStr);
}
Es kommt vor, dass man Kleinigkeiten, Schlüssel oder anderes für fremde Personen hinterlegen muss, jedoch nicht vor Ort sein kann. Man kann die Dinge irgendwo verstecken oder hinlegen und hoffen, dass sie nicht von Dritten gefunden werden oder man baut sich eine Box, die mit Code, sowie via NFC geöffnet werden kann.
Ich habe mich für die zweite Variante entschieden, die ich hier vorstelle.
Funktionsweise
Die NFC bzw. Code Schlüsselbox soll sich sowohl durch Nutzung von NFC-Karten, sowie durch Eingabe von Codes öffnen lassen. Die Codes und NFC-Karten sollen im Home Assistant bequem und dynamisch hinterlegt werden können.
Nach einer Bestimmten Zeit wird das Display deaktiviert. Durch Drücken der Taste “0” kann dieses wieder aufgeweckt werden. Es kann dann zwischen Code-Eingbe mit “#”, sowie NFC-Karte mit “*” gewählt werden. Das ist wichtig, da während der ESP32 auf die Daten einer NFC-Karte wartet, keine weiteren Interaktionen verarbeiten kann. Zudem ergibt es energetisch keinen Sinn den NFC Kartenleser dauerhaft aktiv zu lassen. Bei Eingabe eines Code wird dieser mit “#” bestätigt.
Daraufhin prüft der ESP32 die Eingabe oder die NFC-Karte, ob diese berechtigt ist. Dafür holt sich der ESP32 regelmäßig die Daten zu den NFC-Karten, sowie Codes vom HomeAssistant ab.
Nach Verfikation und Korrektheit wird die Tür entriegelt und der Schlüssel oder was auch immer in der Box liegt, kann entnommen werden.
Im HomeAssistant werden bei NFC Karten die UID/MAC eingegeben, sowie bei Codes die Zahlen. Das Format der UID/MAC ist: 00:AA:BB:CC…
Zudem wird der positive Zugriff, sowie auch der Fall des negativen Zugriffs an den HomeAssistant zu Dokumentationszwecken übersandt.
Geschlossen wird die Box durch herzhaftes zudrücken, bis das Schloss einrastet. Der Status, ob die Box offen oder geschlossen ist, kann am Schloss selbst abgegriffen werden, dafür bauen die Hersteller dieser Öffner oft Kontakte ein, die diese Information bereitstellen.
Hardware
Wie bereits viele andere meiner Projekte, startet auch dieses mit einem ESP32 Mikrocontroller. Dazu habe ich mir ein Nummernfeld als Tastatur, einen NFC Code Modul, ein Display, sowie einen Öffner besorgt.
Als NFC Modul verwende ich ein PN532 mit i²c Interface. Für dieses Modul gibt es eine gleichnamige Bibliothek.
Ein Keypad 3 Tasten breit und 4 Tasten hoch ist für dieses Projekt ausreichend. Es gibt vierschiedene Keypads, diese funktionieren meistens ähnlich.
Das Display für die Anzeige ist ein LCD Display mit 2×16 Zeichen und i²c als Schnittstelle. Wichtig ist: Falls das Display nichts anzeigt, hilft es, nach zu lesen, ob das Display mit 3,3V oder 5V versorgt werden muss. Ich habe eines, das 5V benötigt, mit nur 3,3V wird nichts angezeigt.
Als Öffner bzw. Schloss verwende ich ein elektrisches Spind Schloss. Zu finden sind sie meistens mit den Suchbegriff “12v dc elektroschloss”. Wichtig ist, dass man diese Schlösser nur ganz kurz mit Strom versorgen darf, da sie sich sonst in Rauch auflösen. Das steht allerdings in der Regel im Begleitpapier nochmal dabei. Diese Spind Öffner melden oft auch den Status zurück.
EN-DC -> Brücke um den ESP über den DC-Wandler zu versorgen (im Normalbetrieb) oder über USB, wenn nicht gebrückt wurde, interessant für Debug-Zwecke
DC-Wandler : RECOM R-78E50-05
MOSFET vom Typ : IRF5210
C1, C2, C3 : 10nF
D1 : Freilaufdode z.B. 1N 4148 oder 1N 4007
L1 : 10 uH
R1 : 5.6 kO
R2 : 1 kO
R3 : 10 kO
T1 : BC547C
Die Platine wird mit 12V DC versorgt. Der DC-Wandler erzeugt daraus 5V für den ESP32. Im Falle des Öffnens, wird vom ESP32 zunächst der Transistor T1 geschaltet, der wiederum 12V / 0V am Gate des IRF5210 setzt. Über R3 wird das Gate des IRF5210 immer auf 12V gehalten, bis T1 durchgeschaltet wird und das Gate des IRF auf 0V zieht, dann schaltet der IRF und legt 12V an den Elektroschloss Öffner Kontakt an. Die Diode D1 ist die Freilaufdiode für das Elektroschloss. SW ist der Elektroschloss Schloss Status Kontakt. Das Elektroschloss hat intern einen kleinen Schalter, der Rückmeldet, ob das Schloss geschlossen (1) oder offen (0) ist. Display, NFC Modul, sowie der optionale BME280 werden am i²c Interface links oben angeschlossen. Mein Display musste statt an 3V an 5V angeschlossen werden. Der Rest muss an 3V angeschlossen werden. 5 = +5V | L = SCL | A = SDA | 3 = +3V | G = GND.
Platine mit durchscheinenden Leiterbahnen der Rückseite.
Das Keypad wird unten rechts an den Kontakten 1-7 angeschlossen. Bei meinem Keybad sieht die Kontaktierung wie folgt aus. Das kann je nach Keypad abweichen, bitte selbst prüfen:
Kontaktierung Keypad
Messpunkte
M1 : 12V Versorgungsspannung
M2 : 5V Spannung nach dem DC-Wandler
M3 : Basis des NPN Transistors T1
M4 : G32 des ESP32 zur Steuerung des T1
M5 : Kollektor des NPN Transistors T1, der mit dem Gate des IRF5210 verbunden ist.
M6 : Spannung die am Elektroschloss Öffner Kontakt anliegt.
Die Box habe ich aus Holz gebaut. An der Tür befindet sich ein Knauf, um sie zu öffnen.
Box von AußenVon innen kann die Box ohne Werkzeug geöffnet werden.
NFC Modul
Das PN532 Modul wird von hinten in eine 3D gedrucktes gehäuse eingesetzt und dann fixiert. Dazu kann entweder Kleber oder, so wie ich es gemacht habe erhitztes Filament verwendet werden.
Rückseite des NFC Modul Gehäuses. Unten erkennt man noch etwas Doppelklebeband, das erleichtert die temporäte Fixierung zum Anzeichnen und wird vor der finalen Montage entfernt.Vorderseite des NFC Modul Gehäuses.
Display und Keypad werden zusammen in einem Gehäuse platziert. Beim Display handelt es sich , wie bereits oben beschrieben, um eines vom Typ LiquidCrystal 2×16 mit i²c. Das Display wird verschraubt, das Keypad mit Dichtmasse eingeklebt.
Rückeite des Display und Keypad gehäuses. Keypad eingeklebt, Display festgeschraubt.Damit das alles etwas abgedichtet ist, hab ich auch das Display mit Dichtmasse eingerahmt.
Ansicht von innen/hinten, im Durchgang sieht man rechts unten das elektrische Schloss. Rechts neben der Box ist in schwarz das Gehäuse für die Platine.Ansicht von innen/hinten mit geschlossener Box, sowie eingesetzter und verkabelter Platine. Über und unter der Platine gehen jeweils Kabel durch die Wand für Display, NFC Modul und Keypad.Ansicht von vorne, komplett fertig.
Video
Code-Eingabe Video – Auf das Bild klicken um das Video zu öffnen. (50MB)NFC-Chip Video – Auf das Bild klicken, um das Video zu öffnen. (30 MB)
Im Code müssen einige Anpassungen vorgenommen werden, wie Beispielsweise Authentication Bearer für den HomeAssistant, dessen IP und Port, WLAN-Name und -Passwort, sowie ggf. Namen der Felder im HomeAssistant. Optional kann ein BME280 Sensor an i²c angeschlossen werden, dieser kann mit der Option “enableBme = true” aktiviert werden. Danach stehen die Werte des BME280 auf dem Webserver des ESP32 in JSON Form zur Verfügung.
Dieser Artikel dokumentiert lediglich meinen Aufbau. Für den Nachbau, die Nutzung einzelner Komponenten, die Platinen und den gesamten Inhalt wird die Haftung in jeglicher Form ausgeschlossen. Der Aufbau erhebt zudem nicht den Anspruch irgend ein Level von Sicherheit zu gewährleisten.
Displays haben viele Anwendungsmöglichkeiten. Sie können wichtige Informationen liefern, als Touch Bedienfeld dienen oder sogar Warnhinweise geben.
Die Auswahl des richtigen Display richtet sich nach den Anforderungen. Für dieses Projekt wird eine dauerhafte Anzeige benötigt, die alle paar Minuten aktualisiert wird. Zudem soll die Anzeige nicht leuchten und dennoch gut lesbar sein. Aus diesem Grund habe ich mich für ein mehrzeiliges ePaper Display entschieden. Klar ist auch, dass das Display mit einem ESP32 kompaitibel sein muss, da ESP32 für mich die Platform der Wahl ist.
Das Display kommt im Gang neben meiner Bürotür zum Einsatz. Im HomeOffice möchte ich anzeigen, ob ich gerade nicht gestört werden möchte, in einer Konferenz bin o.ä..
Display
Das Display hat eine Diagonale von 2,13 Zoll und wird via SPI angesteuert. Ich bevorzuge I²C, das ist jedoch nicht immer möglich. Es kann Schwarz, sowie Rot anzeigen. Der Hintergrund ist weiß.
Platine
Damit das Display fest mit dem ESP32 verbunden werden kann, habe ich eine Platine gestaltet, in die der ESP32 auf der einen Seite, sowie das Display von der anderen Seite eingesteckt wird. Zudem wird die gesamte Platine mit 12V DC versorgt, deshalb ist ein Spannungswandler auf der Platine vorgesehen.
Von der Rückseite wird alles im Gehäuse eingebaut.
Display eingebaut. Zu beachten ist, dass die Stiftleiste (gelb) bereits von mir eingelötet wurde. Das Display wird via M3 Schrauben befestigt.Aufgesteckte Platine mit Stiftleisten und Heads – Ohne ESP32 – Für die Stromversorgung wird an einer Stelle der Wahl ein Loch gebohrtDetailansicht: Zusammengesteckte Verbindung zwischen Platine und DisplayFertig montiertes Display mit BespieltextFertig montiertes Display mit Bespieltext, seitliche Ansicht
Software
Bei meinem Display handelt es sich vermutlich um das Display “UC8151D”. Dafür muss die GxGDEH0213Z19.h verwendet werden. Ich verwende in der Arduino IDE die Bibliothek “GxEPD”. In der entsprechenden Dokumentation sind andere Display Typen dokumentiert.
Als Schriftart verwende ich die “FreeMonoBold9pt7b”. Entsprechende Imports sind im Quellcode zu finden.
Prinzipiell holt sich der ESP32 alle 40 Sekunden die neuen Werte vom HomeAssistant. Es gibt jedoch auch die Möglichkeit, dass man ein sofortiges Holen der Daten triggern kann. Das Triggern funktioniert über einen HTTP-Server, den der ESP32 öffnet.
Für jede Zeile habe ich einen eigenen String für die Anzeige. Zudem gibt es pro Zeile die Möglichkeit diese in schwarz oder Rot anzeigen zu lassen.
Home Assistant
rest:
- scan_interval: 60
resource: http://<IP>/jsondoaction
sensor:
- name: "ESP32 Door Kai - Free RAM"
unit_of_measurement: "bytes"
value_template: "{{ value_json.freeram | int }}"
input_text:
door_kai_line_001:
name: "Door Kai Line 001"
door_kai_line_002:
name: "Door Kai Line 002"
door_kai_line_003:
name: "Door Kai Line 003"
door_kai_line_004:
name: "Door Kai Line 004"
door_kai_line_005:
name: "Door Kai Line 005"
input_boolean:
door_kai_line_001_red:
name: "Door Kai Line 001 Red"
door_kai_line_002_red:
name: "Door Kai Line 002 Red"
door_kai_line_003_red:
name: "Door Kai Line 003 Red"
door_kai_line_004_red:
name: "Door Kai Line 004 Red"
door_kai_line_005_red:
name: "Door Kai Line 005 Red"
Ich habe ein paar Buttons im HomeAssistant erzeugt, hinter die ich Automatisierungen gelegt habe, um schnell einzelne Zeilen zu setzen.
input_button:
door_kai_update_now:
name: "Door Kai - Update Now"
door_kai_auto_praesentation:
name: "Door Kai - Präsentation - NICHT STÖREN"
door_kai_auto_arbeit_andere:
name: "Door Kai - Arbeitszeit"
door_kai_auto_arbeit_fokus:
name: "Door Kai - Fokuszeit"
door_kai_auto_arbeit_pause:
name: "Door Kai - Pause"
door_kai_auto_empty:
name: "Door Kai - Empty"
Das forcierte Aktualisieren funktioniert wie folgt. Zunächst muss ein REST Command in der Konfiguration erstellt werden:
Falls benötigt kann hiernach noch der rest command zum forcierten Aktualisieren getriggert werden.
Wichtig zu wissen ist, dass wir keine Texte direkt auf dem ESP32 setzen, sondern immer im HomeAssistant. Der ESP32 holt sich nur periodisch oder wenn es forciert wird, die Texte vom HomeAssistant und gibt diese auf dem Display aus.
Wichtig ist, dass im HomeAssistant ein User angelegt werden sollte, von dem aus ein Authentication Bearer erzeugt wird, über den sich der ESP32 beim Holen der Informationen authentifiziert.
Dieser Artikel dokumentiert lediglich meinen Aufbau. Für den Nachbau, die Nutzung einzelner Komponenten, die Platinen und den gesamten Inhalt wird die Haftung in jeglicher Form ausgeschlossen.
Mittlerweile sind in meinem Gartenhaus allerlei Sensoren installiert. Was allerdings noch fehlt ist eine Art Webcam. Zunächst ist die Frage was man auf einer Webcam sehen möchte. Mich interessiert, wenn ich nicht daheim bin, wie das Wetter zuhause ist. Ob es bewölkt ist, regnet oder der Himmel frei von Wolken ist. Was für mich nicht in Frage kam, ist eine Webcam, mit der man meinen Garten sieht. Warum also nicht eine Webcam, die den Himmel ablichtet. So entstand die Idee eine SkyCam zu bauen. Dafür sollte die Kamera zudem Weitwinkel können, sonst ist das Sichtfeld in den Himmel doch etwas eingeschränkt.
Für mich wichtig war, dass die Kamera günstig und zuverlässig ist. Nicht wichtig waren mir nächtliche Aufnahmen des Sternenhimmels. Ich wollte kein Betriebssystem (wie bei einem RaspberryPi) mit SD-Karte, die kaputt gehen kann, pflegen und ggf. tauschen.
Somit entschloss ich mich ein ESP32 Kameramodul mit Weitwinkel zu nehmen.
Kamera
Als Kamera habe ich einen ES32 Cam verwendet. Das Modul ist relativ günstig und auch in Weitwinkel zu bekommen. Ohne Weitwinkel sieht ein Modul in etwa so aus:
ESP32 CAM mit Standardobjektiv
Platine
Da ich die Kamera auf einem Mast installieren wollte und nicht 5V bis zum Mast hochführen wollte, habe ich mir eine Platine gestaltet, auf dem ein Step-Down Wandler sitzt, der alles zwischen 6 V und ~25V akzeptiert.
Auf der Platine sind die Anschlüsse zum Flashen des ESP32 zudem extrahiert.
Mit dem Brücken der Kontakte Flash-EN kann der ESP32 geflasht werden. Mit dem Brücken der Kontakte Step-Down-EN wird der Ausgang des Step-Down Wandlers mit dem Versorgungsspannunsgeingang des ESP32 verbunden. Es ist in jedem Fall zu vermeiden Step-Down-EN gebrückt zu haben und den ESP anderweitig z.B. via Flash-Kabel mit einer weiteren Spannungsquelle, wie beispielsweise einem Computer verbunden zu haben. Dies kann zur Beschädigung führen.
Gehäuse
Danach musste ich mir überlegen in was für ein Gehäuse ich für die Kamera nehmen möchte. Um den Himmel zu beobachten bietet sich ein “Dome” einer Überwachungskamera an. Diese können aus diversen Quellen bezogen werden. Meiner ist aus Acrylglas. Der Innendurchmesser beträgt ~76 mm, der Außendurchmesser ~85mm. Den Unterbau, in dem sich die Kamera mit dem ESP befindet habe ich selbst gestaltet, 3D gedruckt und ganz wichtig; angeschliffen und mit Farbe besprüht, um eine gewisse UV Festigkeit zu erreichen. Als Material habe ich ABS verwendet. Das gedruckte Gehäuse besteht aus zwei Teilen. Einem Oberteil, in das der “Dome” eingepasst wird, in den die Kamera schaut, sowie einem unteren Teil, der auf den Mast gesteckt und fest mit dem oberen Teil verbunden wird.
SkyCam gedrucktes Oberteil Foto 1 – die beiden Öffnungen links und rechts der Kameraöffnung sind für Silikagel damit es trocken bleibt.SkyCam gedrucktes Oberteil Foto 2 – die Kamera wird mitsamt der Platine von unten in das Oberteil eingepasst.SkyCam gedrucktes Unterteil Foto 1 – diese Seite wird auf dem Mast gesteckt.SkyCam gedrucktes Unteritel Foto 2 – Diese Seite wird am Oberteil befestigt.
Im Unterteil habe ich eine Sechskantöffnung verwendet, da ich dort eine Wasserdichte Kabeldurchführung für das Stromversorgungskabel verwende.
Der “Dome” wird mit Fugmasse am Oberteil eingelassen, die beiden Fächer im Oberteil sind für Silikagel Kugeln, damit der “Dome” nicht beschlägt.
Endmontage
Fertig am Mast installierte SykCamOberteil mit Silikagel und Tape mit “Löchern” damit die Kugeln nicht bei der Montage am Mast durch die Kuppel fliegen. – Das gesamte Oberteil ist lackiert, der Teil in der Kuppel jedoch NICHT mit Klarlack versehen, um reflexionen zu vermeiden.Lackiertes Unterteil mit Kabeldurchführung. – Gut zu erkennen ist, dass der Druck ursprünglich blau war und schwarz lackiert wurde.Montiert auf dem Mast, noch mit Schutzfolie.Auch die Unterseite (an der das Unterteil mit Schrauben am Oberteil befestigt ist) wurde abgedichtet.
Software
Die Kamera stellt einen HTTP-Server zur Verfügung. Das Kamerabild muss von einem Server im Heimnetzwerk aktiv abgeholt werden. Ich empfehle die Kamera niemals von außerhalb des Heimnetzwerks erreichbar zu machen.
Dieser Artikel dokumentiert lediglich meinen Aufbau. Für den Nachbau, die Nutzung einzelner Komponenten, die Platinen und den gesamten Inhalt wird die Haftung in jeglicher Form ausgeschlossen.
Nachdem ich in meinem Gartenhaus bereits Temperatur, Luftfeuchtigkeit, Luftdruck, Feinstaub und einige andere Werte erfasse ( Weather Station with Dust Sensor based on ESP8266 ) , fehlen mir eigentlich nur noch Niederschlag und Windrichtung, sowie Windgeschwindigkeit.
Der Erfassung der Daten wird über einen ESP32 Mikrocontroller umgesetzt, der diese als JSON bereitstellt, damit ich sie mit HomeAssistant abgreifen und zur Verfügung stellen kann.
Im Gartenhaus sind bereits 12V DC, sowie 5V DC Leitungen verlegt, die Stromversorgung ist damit sichergestellt.
Windrichtung
Für die Erfassung der Windrichtung gibt es verschiedene Sensoren, ich habe mich für einen entschieden, der je nach Richtung verschiedene Spannungen ausgibt. Versorgt wird er mit 12V. Meiner gibt unterteilt in sieben Schritten die Spannungen 0V, 0.8V, 1.4V, 2.1V, 3V, 3,6V, 3,9V aus.
Wichtig zu erwähnen ist, dass man die Gradzahlen, also von-bis welche Spannung ausgegeben wird ausmessen sollte, da die Winkel für die Spannungen nicht gleichgroß sind, bei mir ist beispielsweise der Teil mit 3,9V zirka 90° groß, jedoch der Winkel für 0V nur 40° groß. Für die spätere Richtungsberechnung nehme ich die Mitte als Gradzahl zur Hand.
Da der ESP Spannungen über 3.3V nicht bevorzugt, habe ich mit einem 50/50 Spannungsteiler (2x 5.6kO) die Spannung halbiert, die am ESP32 ankommt.
Windgeschwindigkeit
Bei der Windgeschwindigkeitsmessung habe ich mich für ein Schalenanemometer entschieden. Es gibt sie in verschiedenen Ausführungen und verschiedenen Maxima bei der Messung der Windgeschwindigkeit. Das ist unter anderem auf verschiedene Messtechnologien zurückzuführen. Mein Anemometer kann maximal 70 m/s -> 252 km/h, die hoffentlich nie eintreten werden.
Mein Schalenanemometer wird mit 12V versorgt und generiert über ein NPN-Transistor Low-Hi Signale, die ich mit dem ESP32 auswerte. Bei meinem Anemometer war angegeben, dass eine Umdrehung 20 “Ticks” sind. Es müssen die “Ticks” pro Sekunde gemessen werden und mit dem Auflösungswert multipliziert werden. Meins hat eine Auflösung von 0.0875m/s pro “Tick” das bedeutet; erhalte ich zwei “Ticks” pro Sekunde, liegt eine Windgeschwindigkeit von 0.175 m/s vor.
Hardware
Zunächst stellt sich die Frage, wie die Montage aussehen soll. Windsensoren sollten relativ hoch und frei aufgestellt werden. Da ich am Gartenhaus bereits einen Mast habe, war dieser dafür prädestiniert. Also habe ich mir ein Rohr besorgt, dass sich horizontal zum vertikalen Mast an diesem montierten lässt. Im Rohr habe ich Kerben mit der Flex gemacht und dann 2mm stake Bleche angeschweißt. In der Mitte habe ich ein Loch für die Kabel gebohrt. Das Rohr mit den Stahlblechen habe ich mit Alu-Zink Spray als Rostschutz eingesprüht.
Rohr mit angeschweißten Platten für die Sensormontage. In der Mitte je ein Loch für die Kabel.
Danach habe ich die beiden Sensoren montiert. Als Unterlegscheiben habe ich Teflon Unterlegscheiben verwendet. Wichtig ist, dass der Richtungssensor so montiert ist, dass es bei der Montage am Mast leicht fällt diesen so aus zu richten, dass der Sensor die richtige Richtung detektiert. Da man direkt im Rohr keine Muttern befestigen kann, weil man dort sehr schlecht bis gar nicht hin kommen würde, habe ich Gewinde in das Stahlblech geschnitten, die die Schrauben halten.
Montierter Sensor im Detail, Links und rechts durch geschnittene Gewinde im Blech gehalten, vorne und hinten durch Muttern auf der Unterseite befestigtBeide Sensoren montiert
Nachdem die Sensoren montiert sind, muss die Technik verstaut werden. Als Mikrocontroller wird ein ESP32 mit eigens gestalteter Platine verwendet. (Den Link zur Platine, sowie dessen Bestückung werden später in diesem Artikel erläutert.) Dazu habe ich ein wasserdichtes Gehäuse mit Kabeldurchführungen erworben, sowie eine Masthalterung, an der das Gehäuse befestigt wird. Zunächst wird das Gehäuse mit Bohrungen, sowie Platinen-Halterung vorbereitet. Die Halterung ist 3D gedruckt und steht zum Download bereit.
3D Modell ScreenshotMontierte Platinen-Halterung mit Kabeldurchführung, unten für das CAT.7 Kabel zum Gartenhaus für die Stromversorgung, links für die beiden SensorenMontierte Masthalterung für die Box mit dem Mikrocontroller. Die Löcher für die kleinen Schrauben musste ich selbst in die Masthalterung bohren, danach habe ich wieder Zink-Alu Spray als Rostschutz für die Bohrungen verwendet.
Nachdem die Befestigungen und Boxen für die Technik soweit vorbereitet sind, können wir uns der Platine widmen.
Schaltplan
Die 12V DC vom Gartenhaus werden über einen DC-Wandler zu 5V umgewandelt und dann wird der ESP32 über VIN versorgt. Diese Schaltung klammere ich hier explizit aus.
Der Windrichtungssensor liefert je nach Richtung zwischen 0-3.9V als Spannungen zurück. Über einen Spannungsteiler halbiere ich die Spannung und erfasse sie dann mit dem ESP32 als Analogsignal. Wichtig ist, dass man die ADC2 Kanäle nicht nutzen kann, wenn WLAN aktiviert ist, was der Fall ist. Deshalb müssen wir ADC1 PINs nutzen. Die M-Kontakte im Bild sind Messpunkte auf der Platine, die zur Diagnose mit dem Oszilloskop verwendet werden können.
Spannungsteiler für die Windrichtung mit Kondensator für die Störungsreduktion
Der Windgeschwindigkeitssensor liefert via NPN entsprechende Low-High Rechteck Signale. Da der ESP32 auf das Abfallen oder Ansteigen eines Digital-PINs via Interrupt reagieren kann, wir jedoch keine 12V am ESP32 verarbeiten können oder eben nur einmal mit einer Rauchfahne, wandle ich das 12V Low-High Signal mit einer einfachen Transistorschaltung in ein 3.3V Low-High Signal um.
Einfache Transistorschaltung zur Wandlung des 12V Low-High Signal des Windgeschwindigkeit Messers in ein 3.3V Signal für den ESP32
Wie sich die Geschwindigkeit anhand der Low-High Signale berechnet habe ich bereits am Anfang des Artikels erläutert.
EN-DC -> Brücke um den ESP über den DC-Wandler zu versorgen (im Normalbetrieb) oder eben über USB, wenn nicht gebrückt wurde, interessant für Debug-Zwecke
DC-Wandler : RECOM R-78E50-05
M1 : Eingangsspannung
M2 : Ausgangsspannung DC-Wandler
M3 : Windrichtungssensor Ausgang
M4 : Windgeschwindigkeitssensor Ausgang
M5 : Masse
C1, C2, C3, C4 : 10nF
L1 : 10µH
R1, R2, R3, R4 : 5.6kO
T1 : BC547C
Bestückte und montierte Platine in der Halterung im Gehäuse
Endmontage
Sensoren am Mast montiertSensoren am Mast montiert – DetailansichtLinks die Box mit dem ESP32 und der Platine, sowie rechts oben das Rohr zu sehen auf dem die Sensoren montiert sind
Home Assistant
Der ESP32 ist so programmiert, dass er einmal pro Minute die Wind-Werte der vergangenen Minute zu einer Aussage zusammenfasst, dazu später. Diese Werte fragen wir alle 30 Sekunden im Home Assistant via REST ab, sowohl in m/s, wie auch in km/h. Der ESP32 liefert bei der Geschwindigkeit das Minimum, Maximum, sowie den Durchschnitt. Bei der Windrichtung ist die Berechnung etwas kompexer, hier wird ein berechneter Wert, sowie der Text, also beispielsweise O (für Ost), SW (für Südwest) etc. geliefert.
Home Assistant Screenshot der Live WerteHome Assistant Screenshot der Histogramme
Software
Windgeschwindigkeit
Beginnen wir mit der Bestimmung der Windgeschwindigkeit; Hier müssen wie die Low-Hi Signale pro Sekunde zählen. Zunächst definieren wir eine statische Variable mit der Auflösung des Geschwindigkeitsmessers, sowie die entsprechenden Arrays:
static double speedResolution = 0.0875; // m/s per tick per second
int oneSecondWindTicks[60];
int oneSecondWindTicksLastMinute[60];
int minuteTicksSum;
double minuteWindSpeedAvgMS; // m/s
double minuteWindSpeedMinMS; // m/s
double minuteWindSpeedMaxMS; // m/s
Dafür registrieren wir ein Interrupt, dass in ein Array für die jeweilige Sekunde die “Ticks” hochzählt:
void IRAM_ATTR eventWindSpeedTick()
{
int actualSecond = timeClient.getSeconds();
if (actualSecond > -1 && actualSecond < 60)
{
oneSecondWindTicks[actualSecond]++;
}
}
In der initPinModes() Funktion registrieren wir das Event auf das Fallen des PINs:
In der changeMinute() Funktion, die über den Scheduler jede Sekunde aufgerufen wird und prüft, ob sich die Minute geändert hat, wird das oneSecondWindTicks in ein genau gleichgroßes Array für die vergangene Minute kopiert, um darauf Berechnungen durch zu führen. Danach wird das aktuelle Array “genullt”.
Um dann in der buildLastMinuteVals() Funktion Minimum, Maximum und Durchschnitt zu ermitteln. Dort wird auch die “Auflösung” des Windgeschwindigkeitssensor relevant, denn diese sagt aus welche Windgeschwindigkeit pro Tick gilt. Die Umrechnung der m/s in km/h wird beim Abruf des JSON getätigt.
// wind speed
int minTickVal = oneSecondWindTicksLastMinute[0];
int maxTickVal = 0;
minuteTicksSum = 0;
for (int i=0; i<60; i++)
{
int workVal = oneSecondWindTicksLastMinute[i];
if (workVal < 1000)
{
if (workVal < minTickVal) // set min
{
minTickVal = workVal;
}
if (workVal > maxTickVal) // set max
{
maxTickVal = workVal;
}
minuteTicksSum += workVal; // add to sum
}
}
double avgTickVal = (double)minuteTicksSum / (double)60;
// convert to m/s
minuteWindSpeedAvgMS = avgTickVal * speedResolution;
minuteWindSpeedMinMS = (double)minTickVal * speedResolution;
minuteWindSpeedMaxMS = (double)maxTickVal * speedResolution;
Die Berechnung der Windgeschwindigkeit ist relativ einfach, komplizierter wird es bei der Berechnung der Windrichtung.
Windrichtung
Um auf die Aussage vom Anfang des Artikels zurück zu kommen, hat nicht jeder Teil des Richtungssensors die gleiche Größe (in Grad). Zunächst habe ich den Richtungssensor auf ein Blatt Papier gestellt, markiert wo die Schrauben und das Label sind, dann den Sensor angeschlossen und gemessen von wo bis wo welche Spannung anliegt. Danach habe ich diese Kompassrose (https://de.m.wikipedia.org/wiki/Datei:Kompassrose.svg) aufgeklebt und die Mitte der Bereiche in Grad dazu geschrieben, die als Basis für eine Berechnung dienen. Es sind Augenmaß Werte, kann also durchaus etwas ungenauer aussehen. Hier der Scan meines Papiers (nicht schön aber selten):
Blau eingerahmt die anliegende Spannung, orange markiert die per Augenmaß ermittelte Gradzahl in der Mitte des Bereichs
Danach habe ich am ESP32 die Analogwerte ermittelt, die je Bereich ausgegeben werden, zwischen zwei Analogwerten die Mitte ermittelt und diese als Basis für die Ermittlung der Richtung genommen (größer-gleich). Die Richtung frage ich einmal pro Sekunde hab und schreibe sie an die entsprechende Position im Array die Richtung.
static int diectionAnalogVal[] = { -1, 128, 463, 880, 1302, 1724, 2143}; // min analog value
// Middle Vals 0 256 670 1091 1514 1934 2352
static int diectionVals[] = { 60, 100, 140, 190, 240, 280, 350}; // directions in degree
int directionCountLastMinute[7];
int directionFirst = 0;
int directionSecond = 0;
int directionMostCalculated = 0;
Einmal pro Sekunde rufe ich die Funktion checkDirection() via Task Scheduler auf, die dann das Array entsprechend beschreibt:
void checkDirection()
{
int actualSecond = timeClient.getSeconds();
if (actualSecond > -1 && actualSecond < 60)
{
int analogVal = analogRead(windDirectionPin);
int direction = 0;
for (int i=0; i<7 && (analogVal > diectionAnalogVal[i]); i++)
{
direction = diectionVals[i];
}
oneSecondWindDirection[actualSecond] = direction;
Serial.println("WindDirectionAnalogVal: " + (String)analogVal);
Serial.println("WindDirectionDegreeVal: " + (String)direction);
}
}
Auch hier wird in der Funktion changeMinute() das aktuelle Array mit den Werten in das Array der vorigen Minuten kopiert, um dann Berechnungen durch zu führen.
Komplexer wird die Berechnung der gemittelten Windrichtung. Zunächst ermittle ich die beiden am meisten auftretenden Richtungen. Danach ermittle ich welcher Weg (im oder gegen den Uhrzeigersinn) der kürzere ist. Die “Distanz” zwischen den beiden Gradzahlen wird dann ermittelt und durch die Summe der beiden am häufigsten auftretenden Windrichtungen geteilt und dann entsprechend mit einer der beiden multipliziert und dazu addiert bzw. subtrahiert. Ein einfaches Beispiel: 20x 0° und 30x 100° -> 100-0 -> 100 / (20+30) -> 2° je Messung -> 20 x 2° -> 40° -> 0° + 40° -> 40° -> Nord-Ost. Das passiert in der Funktion buildLastMinuteVals() in den Kommentaren hinter den Berechnungen finden sich die Beispiele mit denen man die entsprechenden Bereiche durchläuft:
Dieser Artikel dokumentiert lediglich meinen Aufbau. Für den Nachbau, die Nutzung einzelner Komponenten, die Platinen und den gesamten Inhalt wird die Haftung in jeglicher Form ausgeschlossen.
Vor einiger Zeit habe ich meine Türklingel smart gemacht, hier der Link.
Relativ schnell hat sich herausgestellt, dass öfter ein Klingeln detektiert wird, wenn man das Licht an- bzw. ausschaltet. Da das Kabel, mit dem die Klingel angesteuert wird nicht geschirmt ist, ist das nicht weiter verwunderlich.
Wir erinnern uns: Der ESP32 reagiert auf das Abfallen des Signals mit einem Interrupt und detektiert ein Klingeln.
Also habe ich mir die Störung auf dem Oszilloskop genauer angeschaut.
Oszilloskop, Störung am ESP32 Eingang
Die Störung ist zirka 6ms Sekunden lang und beginnt sehr “unsauber”.
Danach habe ich mir ein echtes so kurz wie mögliches Klingeln angeschaut.
Oszilloskop, Klingeln am ESP32 Eingang
Was sofort ins Auge fällt ist, dass ein “echtes” Klingeln deutlich länger als die Störung ist. Betrachtet man die Zeit Skala des Oszilloskop Bildes, fällt auf, dass wir nicht mehr 1ms/Einheit sondern 20ms/Einheit haben. Eigentlich müsste man also nur messen, wie lang das Signal “low” ist, um dann entscheiden zu können, ob man eine Klingelbenachrichtigung auslöst. – Zumindest theoretisch. – Am ESP32 ist das nicht so einfach, da man im “Interrupt” nicht so einfach die Möglichkeit hat, ab zu fragen, wie lang der Eingang low/high ist. – Man könnte den Interrupt auch auf “on-low”, sowie auf “on-high” registrieren und messen, wie lang der Abstand zwischen diesen beiden Interrupts ist. Das könnte funktionieren.
Dann habe ich mir das Klingelsignal etwas genauer angeschaut, sowohl den Anfang, wie auch etwa in der Mitte.
Oszilloskop, Klingeln am ESP32 Eingang, Zoom: AnfangOszilloskop, Klingeln am ESP32 Eingang, Zoom: Mitte
Dabei habe ich festgestellt, dass das einfache Messen der Differenz zwischen “on-low” und “on-high” nicht zielführend ist. Wenn man allerdings die Differenz zwischen dem ersten “on-low” und dem letzten “on-high” misst, diese mindestens 40ms betragen muss, sodass ein Klingeln ausgelöst wird, kann man die durch Störungen ausgelösten Klingelbenachrichtigungen bis auf wenige Ausnahmen komplett eliminieren. Der Detektorzeitraum wird nach vier Sekunden zurückgesetzt, damit nicht zwei Störungen zu einer Benachrichtigung führen. – Warum werden nur “fast” alle falschen Klingelbenachrichtigungen eliminiert? – Es kann sein man schaltet das Licht an und innerhalb von vier Sekunden wieder aus und es kommt der Umstand dazu, dass bei beiden Schaltvorgängen Störungen ausgelöst werden, dann erhält man dennoch eine Klingelbenachrichtigung. Das kommt bei mir innerhalb eines Monats maximal einmal vor.
Software
Der ESP32 reagiert jetzt auf “on-low” sowie “on-high” und misst die Differenz zwischen dem ersten “on-low” und dem letzten “on-high”. Beträgt dieser mindestens 40ms, wird klingeln ausgelöst. Die beiden Zeitstempel werden nach vier Sekunden zurückgesetzt, um eine Fehlauslösung durch Störungen zu verhindern.
Dieser Artikel dokumentiert lediglich meinen Aufbau. Für den Nachbau, die Nutzung einzelner Komponenten, die Platinen und den gesamten Inhalt wird die Haftung in jeglicher Form ausgeschlossen.
Vor zirka ein bis zwei Jahren habe ich mir aus einer Laune heraus ein Geiger Müller Zählrohr gekauft. Wie genau die Messung erfolgt und was man beachten muss, sowie wie man die Daten abgreifen kann, wusste ich damals nicht, aber ich wollte das Teil haben.
Ich hatte fast vergessen, dass ich das Zählrohr noch habe, als ich ihn durch Zufall zwischen anderen Platinen wiedergefunden habe.
Warum sollte man selbst ein Geiger-Müller-Zählrohr aufstellen und dessen Werte abgreifen? – Da ich bereits eine Wetterstation mit Feinstaubsensor betreibe, ist es naheliegend diese um weitere Umweltsensoren jeglicher Art zu ergänzen. Weitere Sensoren werden folgen, welche das sein werden, werden wir sehen, es bleibt spannend.
In diesem Artikel werde ich “Geiger-Müller Zählrohr” der Einfachheit halber mit “Geiger-Zähler” abkürzen.
Funktionsweise
Die Funktionsweise eines Geiger-Müller Zählrohrs werde ich nicht erläutern, diese kann in diversen Quellen im Internet nachgelesen werden.
Wichtig ist eher; Wie kann ich die Daten mit dem ESP32 abgreifen. Dafür habe ich mir zunächst das Audio Ausgangssignal des Geiger-Zählers mit dem Oszilloskop angeschaut. Folgendes Signal kommt dabei raus:
Geiger-Zähler: Audio Ausgangssignal
Wir erkennen unschwer, dass es sich um ein erwartungsgemäß schwaches und kein sauberes Hi-/Low-Signal handelt. Selbstverständlich kann man solche Signale verstärken und aufbereiten. Behalten wir im Hinterkopf, dass der ESP32 die Möglichkeit bietet, dass man auf “on Low” sowie “on High” reagieren kann, muss man zugeben, dass selbst wenn eine Aufbereitung gelungen ist die Signalerkennung zwar möglich aber nicht zwingend trivial wird.
Da sich auf der Geiger-Zähler Platine auch eine LED befindet, die immer bei einem “Tick” aufleuchtet, habe ich mir überlegt; Vielleicht kann man dort ein sauberes Hi-Low Signal abgreifen. Meine Vermutung wurde bestätigt, hier liegt ein sauberes ~5V Hi-, sowie Low- Signal an, wie im folgenden zu sehen:
Geiger-Zähler: LED Signal
Da wir jetzt nur noch auf 3.3V runter müssen, ist es sehr einfach dies mithilfe einer Transistorschaltung um zu setzen.
Schaltung 5V -> 3.3V
Bei dieser Schaltung ist es so, dass, wenn der ESP32 Pin von 1 auf 0 geht, entspricht das einem “Tick” des Geiger-Zählers. C1, sowie R3 sind im oberen Schaubild dazu da, dass Störungen beispielsweise durch HF oder das Betätigen von Lichtschaltern reduziert werden. Das bedeutet auch, dass der ESP32 auf “on Low” reagieren bzw. Zählen muss, dazu später.
Berechnung
Nachdem wir das Signal bzw. die “Ticks” des Zählrohrs sauber abgreifen können, stellt sich die Frage, wie man von der Anzahl der Ticks auf die detektierte Dosis kommt. Hier liefert der Hersteller der Platine einen “conversion index”, der in meinem Fall bei 151 liegt. Dieser sagt aus, dass 151 “Ticks” (bzw. CPM = Counts per Minute) innerhalb einer Minute bedeuten, dass 1µSv/h als Dosis anliegen.
Rechenbeispiel: 30 CPM / 150 => 0.1987 µSv/h
Laut meinen Recherchen ist eine Dosis, die in der Umgebung vorherrscht je nach Höhe und Lokalität zwischen ~0.8 und ~1.2 mSv/Jahr eine normale Dosis, die der Mensch durch die gegebene Umgebungsstrahlung pro Jahr aufnimmt. Es ist wohl auch so, dass der Mensch durch die Nahrungsaufnahme, Flugreisen etc. weiterer Strahlung ausgesetzt ist, das wird hier nicht betrachtet, es geht einzig und allein um die Umgebungsstrahlung. Also müssen wir das Ergebnis auf das Jahr hochrechnen. Wichtig hierbei ist, dass man nicht nur mit 365 Tagen sondern 365.25 Tagen rechnet, Thema Schaltjahr.
Für die Zählung der Ticks pro Minute verwende ich die TaskScheduler Bibliothek, die für Arduino zur Verfügung steht. Das bedeutet, dass ich so lange einen Zähler über die Interrupts hochzähle, bis eine Minute vorbei ist und dann den Zähler auf einen “vorherige Minute” Wert schreibe, der dann als JSON Objekt im Webinterface zur Verfügung steht. Genauso basieren die berechneten Dosiswerte, die im Webinterface ausgegeben werden, auf den “Ticks” der vorigen Minute.
Zunächst müssen wir den Handler für das “on Low” Interrupt definieren.
Die Uhrzeit wird über die “NTPClient” Bibliothek ermittelt. Wie man diese Bibliothek verwendet und einbindet ist im Internet zu genüge dokumentiert, deshalb gehe ich hier nicht darauf ein.
Ich versorge die Platine mit 12V DC, der DC Wandler reicht aus, um den ESP32, sowie meine Geiger-Zähler Platine mit Strom (5V) zu versorgen.
Gehäuse
Das Gehäuse habe ich 3D gedruckt. Auf der einen Seite sitzt die Geiger-Zähler Platine, auf der anderen Seite die ESP32 Platine. Wichtig ist: Das 3D Modell besteht aus zwei teilen, die ich zusammengefügt habe. Da ich das Gehäuse aus ABS gedruckt habe, habe ich zum verkleben der beiden Hälften Aceton verwendet. Die Aussparungen für die Kabel sind ausgesägt.
Dieser Artikel dokumentiert lediglich meinen Aufbau. Für den Nachbau, die Nutzung einzelner Komponenten, die Platinen und den gesamten Inhalt wird die Haftung in jeglicher Form ausgeschlossen.
Dezente Beleuchtung ist eine schöne Sache. Vor allem, wenn sie sich einfach anpassen und steuern lässt.
Nachdem ich einige kommerzielle Lösungen angeschaut habe, habe ich mich dazu entschieden eine eigene auf Basis eines ESP32 zu entwickeln, die ich in den Home Assistant integrieren kann. Auch weil ich die Steuerung von Farbe, An- sowie Ausschaltzeitpunkt automatisieren wollte.
Funktionsweise
Zunächst muss man sich mit der Steuerung von LED-Bändern beschäftigen, um eine Steuerung entwickeln zu können. LED Bänder bestehen in der Regel aus vielen RGB (Rot-Grün-Blau) LEDs. Je nach Helligkeit der einzelnen Farben, ändert sich die wahrgenommene Farbe. Sind beispielsweise nur Rot und Grün zu je 100% an, ergibt das die Farbe gelb. Kommt blau zu 100% dazu, ergibt sich weiß. Je nach dem zu wie viel Prozent jede Farbe an ist, entsteht eine Mischfarbe. Wichtig ist das Verhältnis der Werte zueinander. Um die LEDs zu dimmen, werden die Verhältnisse der Farben zu einander gleich gehalten, jedoch alle LEDs insgesamt in der Helligkeit reduziert.
Im Gegensatz zu klassischen Glühbirnen, werden LEDs nicht durch das reduzieren der Spannung verdunkelt, sondern durch das “Takten” und die damit verbundene Helligkeitsreduzierung. Nehmen wir eine Sekunde; In dieser Sekunde ist die eine Farbe der LED die gesamte Zeit an, eine andere nur zu 50%. Als Betrachter nimmt man die andere Farbe somit um 50% weniger Hell wahr. Man schaltet jedoch nicht die andere Farbe eine halbe Sekunde ab und diese dann wieder eine halbe Sekunde an, sondern man wählt eine weitaus schnellere, für das Auge nicht wahrnehmbare Frequenz, in der die zweite Farbe an- und ausgeschaltet wird. Die Folge wäre sonst ein unangenehmer und ständiger Farbwechsel. Im Ergebnis ist; Die andere LED zwar in Summe nur 50% der Zeit an, aber der Wechsel zwischen AN und AUS ist so schnell, dass dieser vom menschlichen Auge nicht wahrgenommen wird. Was das menschliche Auge wahrnimmt ist eine geringere Helligkeit der anderen Farbe und damit bildet sich eine entsprechende Mischfarbe.
Ich habe 15m LED Band im Einsatz. Ein Test hat gezeigt, dass wie zu erwarten das in Reihe schalten der drei Bänder dazu führt, dass das letzte LED Band fast nicht mehr leuchtet. Die Bänder müssen also parallel an die Platine angeschlossen werden. Im Parallelbetrieb gemessen, habe ich bei der Farbe weiß, die den höchsten Stromfluss aufweist, zirka 4.5-5 Ampere bei einer Betriebsspannung von 12V gemessen. Das entspricht einer Leistung von zirka 60W. Das heißt der Pluspol über den der Maximalstrom von 5 Ampere fließt und die zugehörigen Komponenten müssen entsprechend dimensioniert werden. Wichtig an dieser Stelle ist: Man kann keine pauschale Aussage über die Stromaufnahme eines 15m LED Bandes treffen, das hängt von vielen Faktoren ab, beispielsweise wie viele LEDs pro Meter installiert sind.
Zudem habe ich festgestellt, dass die LEDs immer unter Spannung stehen. Das heißt es wird nur der Stromabfluss gesteuert, nicht der Zufluss. Das empfinde ich als großes Manko dieses Bandes, da ich eigentlich nicht möchte, dass dauerhaft 12V am Band anliegen.
Hardware
Zum Einsatz kommen ein ESP32, sowie eine selbst entwickelte Platine.
Das LED-Band besteht aus RGB 5050 LEDs.
Ein ESP32 hat den Vorteil, dass er das sogenannte PWM auf vielen PINs unterstützt. Es können zwar nur zehn verschiedene PWM Kanäle genutzt werden, was aber für ein RGB Band völlig ausreichend ist.
PWM bzw. ausgeschrieben Pulse-width modulation ermöglicht es, PINs des ESP32 in einer bestimmten Frequenz unter Bestimmung der Pulsbreite, also wie breit ist der Teil, in dem der PIN an und wie breit ist der Teil, in dem der PIN aus ist, zu setzen.
Das LED Band wird mit einer Spannung von 12V betrieben und benötigt hohe Ströme. Beides kann der ESP32 nicht leisten. Aus diesem Grund habe ich mich dafür entschieden für das Schalten des LED Bandes MOSFETs zu nutzen. MOSFETs haben den großen Vorteil, dass sie im Gegensatz zu Transistoren einen sehr geringen Innenwiderstand bzw. Spannungsabfall aufweisen. Aus diesem Grund fällt sehr wenig Leistung ab und die Wärmeentwicklung hält sich in Grenzen. Wichtig bei der Verwendung von MOSFETs ist, dass sie immer sauber durchgeschaltet oder gesperrt werden, sonst erhöht sich hier Innenwiderstand signifikant, was zwangsläufig zur Zerstörung des MOSFET führt. Je nach Typ sollte an einem MOSFET am Gate entweder 0V oder die Betriebsspannung (der Source) anliegen. Ein Blick auf das Datenblatt des ESP32 enthüllt; Der Mikrocontroller kann maximal 3.3V und Ströme im Milliampere Bereich leisten. Für ein sauberes Sperren bzw. Durchschalten des MOSFET nicht ausreichend. Aus diesem Grund verwende ich ich einen BC547C Transistor als Schalter, um die MOSFETs an zu steuern.
Um den “Abfluss” der Ströme der einzelnen Farben zu steuern verwende ich N-MOSFETs. Um den “Zufluss” bei deaktiviertem Band respektive einer Helligkeit von null ab zu schalten, verwende ich einen P-MOSFET. Warum man nicht eine Art MOSFET für beide Arten der Steuerung verwenden kann, lässt sich in entsprechender Fachliteratur oder im Internet nachlesen.
Da mein verwendeter P-MOSFETs einen signifikant höheren Innenwiderstand (~0,06 Ohm) aufweist, als die verwendeten N-MOSFETS (~0,006 Ohm) und sich daher eine entsprechende Wärmeentwicklung einstellt, habe ich den P-MOSFET mit einem Kühlköper, sowie das Gehäuse mit einem Lüfter ausgestattet. Mit ein Grund für den Lüfter ist, dass es im Inneren des Gartenhauses gerade im Sommer etwas wärmer werden kann und ich vermeiden wollte, dass sich im Gehäuse hohe Temperaturen bei einer sowieso schon hohen Außentemperatur bilden.
LED1, LED2, LED3, LED4 : Standard LED (dienen zur optischen Kontrolle)
R1, R3, R5, R7 : 1kO
R2, R4, R6 : 2.2kO
R8 : 2.2kO
R9, R10, R11, R12 : 3.3kO
R13, R14, R15, R16 : 5.6kO
L1 : 10uH
T1, T2, T3, T4 : Transistor BC547C
3x MOSFET IRL1004
1x MOSFET IRF5210
1x DC Wandler RECOM R-78E50-05
1x TO-220 Kühlkörper V FI356
2x 7.62mm PCB Screw Terminal Block (3-Pin)
Messpunkte:
M1 : Blau
M2 : Rot
M3 : Grün
M4 : Eingangsspannung
M5 : On/Off Spannung
M6 : 5V DC
M7 : Gate Blau
M8 : Gate Rot
M9 : Gate Grün
M10 : Gate On/Off
M11 : GND
M12 : On/Off Spannung (wie M4)
Verlötete Platine (oben)Verlötete Platine (seite)
Die Anschlüsse unten auf der Platine 3V3, GND, sowie SCL und SDA (I²C) dienen dazu, damit sich spätere Erweiterungen, wie beispielsweise ein Temperatursensor einfach nachrüsten lassen, falls man das möchte.
Gehäuse
Das Gehäuse ist 3D gedruckt und mit einem 40mm 12V Lüfter versehen. Der Lüfter wird an GND und Vout angeschlossen, damit dieser nur dann läuft, wenn das LED Band angeschaltet ist. Zudem habe ich vor Vin eine 10A Schmelzsicherung installiert, falls ein Kurzschluss z.B. in einem LED-Band auftritt und die Schutzschaltung im Netzteil nicht greifen sollte.
Die seitlichen Löcher im Gehäuse habe ich gebohrt. Der Lüfter bringt Luft ins Gehäuse, die über die Löcher austritt.
Home Assistant Steuerelement für Farbe und Helligkeit
Software
Der ESP32 meldet proaktiv Änderungen an den Home Assistant. Dafür ist ein sogenanntes Token oder Bearer genannt notwendig, das im Home Assistant generiert werden kann.
Dieser Artikel dokumentiert lediglich meinen Aufbau. Für den Nachbau, die Nutzung einzelner Komponenten, die Platinen und den gesamten Inhalt wird die Haftung in jeglicher Form ausgeschlossen.
Einige haben sie noch, viele kennen sie noch, manche haben sie schon ersetzt. Die Rede ist von der klassischen Türklingel mit Wechselstrom, die entweder schrillt oder metallern “ding-dong” von sich gibt, wenn an der Tür jemand den Taster mit der Glocke betätigt.
Das Problem ist, wenn man sich gerade im Keller oder draußen befindet, hört man die Klingel nicht immer.
Klassische Klingel, außen AnsichtKlassische Klingel, innen Ansicht
Hier wird durch das “Klingeln” der Bolzen in der Mitte nach links geschlagen, das ist das “ding”, lässt man den Taster los, schlängt der Bolzen wieder nach rechts, das ist das “dong”. An den beiden Kontakten liegt beim Klingeln Wechselspannung an, meist ~12V.
Ich habe mir überlegt, dass man den zum Teil kurzen Wechselspannungsimpuls durch einen ESP32 detektieren müsste, um ihn dann dem Home Assistant für eine Benachrichtigung zu nutzen.
Da es sich um Wechselspannung handelt, könnte es durchaus sein, dass der ESP32 aufgrund des schnellen Wechsels nichts detektiert oder mehrfach detektiert. Ein ESP32 bietet die Funktion auf den Wechsel eines Eingangs von Hi nach Lo, sowie umgekehrt zu reagieren, unabhängig ob der Eingang gerade im Code abgefragt wird, dazu später.
Schaltplan
Aber eins nach dem anderen. Zuerst werden die ~12V mit Dioden gleichgerichtet. Richtet man Wechselspannung gleich, haben wir viele “kleine Berge”. Für das oben genannte “Dektieren” wäre das nicht von Vorteil, entweder ist der ESP32 zu langsam, oder zu schnell und es wird bei langem klingeln, mehrfach klingeln gemeldet. Was wir zum Gleichrichter also noch benötigen ist etwas, was die Spannung nach dem Gleichrichter stabilisiert, dazu verwende ich einen 22µF Kondensator. Um zu verhindern, dass sich hier ungewollt eine Spannung aufbaut, sowie der Kondensator nach dem Klingeln wieder zügig entlädt, habe ich zwischen dem Ausgang des Gleichrichters und Masse einen Widerstand mit 1kO verbaut.
Nachdem das Signal gleichgerichtet ist, müssen wir dafür sorgen, dass der Eingang des ESP32 maximal 3,3V erhält und keine Spannung darüber, dazu verwende ich einen BC547C Transistor als Schalter. Der Kollektor wird hierbei über einen Widerstand auf Hi gezogen, während am Kollektor der Eingang des ESP32 angeschlossen ist. Wird jetzt die Klingel aktiviert, liegt an der Basis des Transistors eine Spannung an, der Transistor wird leitend und der Eingang des ESP32 bzw. der Kollektor wird gegen Masse “gezogen”.
Schaltplan – ~1 sowie ~2 sind die Anschlüsse für den Klingeldraht – Schaltplan erstellt mit sPlan
Gehäuse für die Platine – Löcher für Kabel müssen gebohrt werdenDeckel für das Gehäuse mit Lüftungsschlitzen
Die erste Montage sieht wie folgt aus:
Montiert, ohne Deckel
Nach positivem Verlauf der Tests, habe ich die mittlerweile vergilbte Klingelabdeckung angeschliffen und mit Sprühlack lackiert, inklusive Klarlack.
Frisch lackiertes KlingelgehäuseFertig montierte Klingel mit Klingel Detector
Home Assistant
Wichtig ist, dass die Klingel proaktiv dem Home Assistant meldet, dass geklingelt wurde. Dafür muss im Home Assistant ein Template Sensor angelegt werden.
Auf die Statusänderung des Binary Sensor lässt sich dann ein Automatismus registrieren, der z.B. per Benachrichtigung an mobile Geräte das Klingeln meldet.
Software
Sobald die Türklingel gedrückt wurde und der GPIO Port des ESP32 auf Low geschaltet wird, soll dies an Home Assistant zurückgemeldet werden. Somit muss ein Handler auf das “to-low” bzw FALLING des GPIO Ports registriert werden, ein sogenannter Interrupt. Im Anschluss muss dann der Klingelstatus an den Home Assistant übermittelt werden, genauso wie einige Zeit später das Klingel Signal durch den ESP32 wieder resettet werden muss. Der Bearer ist ein Langzeittoken, dass als Admin erstellt werden muss.
Klingeldrähte sind meist ohne Abschirmung verlegt, das heißt wenn ein Elektromagnetischer Impuls durch z.B. das Abschalten einer LED Lampe oder schalten eines Relais in der Nähe der Klingelleitung vollzogen wird, meldet die Klingel ab und an (wenige Male pro Monat) fälschlicherweise klingeln. Wahrscheinlich würde sich das Problem durch das Ersetzen der Klingelleitung durch eine abgeschirmte Leitung, beispielsweise CAT7 lösen lassen.
Noch ein Hinweis: Wenn die Klingel gedrückt ist, der Trafo im Schaltschrank z.B. ~12V auf der Sekundärseite nominal aufweist, kann es sein, dass bei angeschlossener Klingel weniger als 12V direkt vor der Klingel messbar sind, das ist normal. Das kommt dadurch, weil die Klingel Strom braucht und der Trafo oft nur eine Begrenze menge Strom liefern kann.
Hinweis
Dieser Artikel dokumentiert lediglich meinen Aufbau. Für den Nachbau, die Nutzung einzelner Komponenten, die Platinen und den gesamten Inhalt wird die Haftung in jeglicher Form ausgeschlossen.
Ein Garagentor lässt sich in der Regel über eine Fernbedienung, sowie, falls montiert, über einen Taster im Inneren der Garage bedienen. Ist innen kein Schalter montiert, die Fernbedienung leer oder man möchte spontan von außen in die Garage, muss man oft lange Laufwege in Kauf nehmen.
Aus diesem Grund habe ich mich dazu entschlossen das Garagentor etwas smarter zu gestalten.
Hardware
Das Garagentor ist eine SupraMatic 2 von Hörmann. Dazu habe ich mir die passende Hörmann Universaladapterplatine UAP 1 Erweiterungsplatine besorgt.
ACHTUNG! Nicht jeder Garagentorantrieb von Hörmann und nicht jede Version der SupraMatic 2 bietet die Möglichkeit des Anschlusses einer Universaladapterplatine! Hierzu bitte den Hersteller oder entsprechende Fachbetriebe kontaktieren! Je nach Garagentorantrieb können anderen Platinen notwendig sein!
Wenn ich das richtig gelesen habe, dient das UAP 1 Modul dazu, das Garagentor von extern über eigene Komponenten zu schalten und entsprechende Status aus zu lesen oder andere Komponenten zu schalten. Dort sind drei Relais, die je nach dem geschlossen sind, wenn das Tor; Geschlossen, Offen ist, sowie das Licht aktiviert ist.
Um das Tor zu steuern, bedient der ESP32 die Eingangs-Kontakte, in dem er sie gegen Masse kurz schließt. Das lässt sich beispielsweise mit BC547C Transistoren realisieren.
Die Platine liefert 24V, sowie maximal 100mA. Damit lässt sich ein ESP32 mit einem effizienten, vorgeschalteten 5V StepDown Wandler versorgen.
Als Microcontroller habe ich mich für einen ESP32 mit 38 Pins entschieden.
Um die Temperatur, Luftfeuchtigkeit, sowie Luftdruck zu erfassen, verwende ich einen BME280 Sensor.
Damit das Garagentor nicht nur über das Webinterface schaltbar ist, gibt es auf der Platine weitere Pins, an die sich externe Schalter anschließen lassen.
Gehäuse
Praktischerweise besitzt der Garagentorantrieb oberhalb ein Blech, mit Loch, an dem ich das Gehäuse befestigt habe. Leider ist das Blech etwas innenliegend, somit muss das Gehäuse dort, wo es verschraubt wird, etwas dicker sein. Um es besser drucken zu können, habe ich das Gehäuse und den Abstandshalter separat gedruckt.
Handschaltbox mit montierten 12mm Tastern und Beschriftung.Montierter Aufbau am Garagentorantrieb, das Graue oben ist die Steuerleitung, die zur Handschaltbox führt.
Elektronik
Die UAP 1 liefert 24V, diese speisen den ESP32 inklusive der Komponenten, die auf der Platine montiert sind. Die Transistoren werden vom ESP32 entsprechend geschalten.
Links im Rahmen “Output” befinden sich die PINs, die beim Schalten des Garagentores durch den ESP32 entsprechend gegen Masse gezogen werden.
Die “Switch” Pins triggern das Schalten z.B. durch einen externen Schalter. Diese sind entsprechend entprellt durch das warten in der Software, sowie entsprechende Pull-Up Widerstände.
“Input State” sind die Anschlüsse für die Relais, mit denen das Garagentor den Status zurückmeldet.
Links oben befindet sich der I²C Anschluss, an diesen kann beispielsweise der BME280 Sensor angeschlossen werden.
Über V+ werden die Platine und der ESP32 bzw. zunächst der DC-Wandler mit Strom versorgt.
ACHTUNG! Wenn der Garagentorantrieb den Fehler zeigt, dass die Schlupftür im Garagentor noch geöffnet ist, muss man sicherstellen, dass alle Masseverbindungen der Eingänge an der UAP 1 entsprechend verbunden sind.
Bauteile
C1, C2, C3 : 10nF
L1 : 10 µH
R1, R3, R5, R7 : 1kO
R2, R4, R6, R8 : 2.2kO
R9, R10, R11, R12, R13, R14, R15 : 5.6kO
T1, T2, T3, T4 : BC547C
DC-Wandler: RECOM R-78E50-05
J-DC – Jumper; Ist dieser geschlossen, wird der ESP32 über den DC-Wandler versorgt, ist der Jumper nicht geschlossen, kann er beispielsweise zu Entwicklungszwecken über den PC versorgt werden.
Die Taster auf der rechten Seite der Platine sind optional.
Software
Der ESP32 besitzt eine JSON Schnittstelle mit dessen Hilfe er sich schalten lässt.
Um das Maß an Sicherheit zu erhöhen, wird OTP, also OneTimePassword, verwendet, ähnlich wie man es von der zwei Faktor Authentifizierung anderer Dienste kennt. Das soll verhindern, dass bei einem ungewollten Zugriff auf das Netzwerk, das Garagentor bedient werden kann.
Der ESP32 meldet aktiv den Status des Garagentors bei einer Änderung an den Home Assistant zurück. Ansonsten würde der Status erst dann aktualisiert werden, wenn Home Assistant die Daten via REST selbst abfragt. Dafür muss als Admin ein Dauer-Token erstellt werden und dieser der HTTP Anfrage im Header als “Bearer” beigefügt werden.
Über Disable Inputs lassen sich die Handschalter in der Garage deaktivieren.
Mit Disable Commands werden die Handschalter in der Garage und jegliche per JSON an das Gerät geschickte Commands deaktiviert.
Home Assistant
Das Garagentor habe ich in den Home Assistant integriert. Home Assistant unterstützt out-of-the-box die OTP Integration, auch für REST Kommandos.
Beim Token ist zu beachten, dass das “Secret” für das Hinterlegen im ESP32, sowie im Home Assistant BASE32 encodiert sein muss. Solche Konvertier gibt es unter anderem online. Wichtig ist, dass man von de Länge ein entsprechendes Secret wählt, dass am Ende keine Gleichzeiten im BASE32 stehen, da dies sonst zu Problemen führt.
Im ESP32 wird das BASE32 encodierte “Secret”, das für die OTP-Generierung benötigt wird als HEX hinterlegt.
Dieser Artikel dokumentiert lediglich meinen Aufbau. Für den Nachbau, die Nutzung einzelner Komponenten, die Platinen und den gesamten Inhalt wird die Haftung in jeglicher Form ausgeschlossen.
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional
Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.