RoomOwl

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche


In diesem Artikel wird Ihnen das Projekt "RoomOwl" vorgestellt, welches einen Beitrag zur Einhaltung der Beschränkungsmaßnahmen und optimaler Raumbedingungen leisten soll. Mithilfe von zwei verschiedenen Stationen werden zwei seperate Probleme gelöst. Die erste Station soll den Zugang beschränken und bei einer maximalen Personenanzahl den Raum für weitere Personen unzugänglich machen. Die zweite Station überwacht die Luftqualität und gibt eine Warnung bei überschrittenen Grenzwerten aus, sodass beauftragte Personen z.B. Lüften. Die Daten werden mittels einer Datenbank zentral gespeichert.

Das Projekt entstand im Rahmen des Wahlmoduls "Embedded Systems" im Wintersemester 2020/2021, in welchem die Gruppen mithilfe des Arduino Starterkits und einigen Sonderkomponenten ein geschlossenes, "eingebettetes System" erschaffen.


RoomOwl

RoomOwl Logo 2500x2500.png

Entwickler

Leopold Bletgen, Marius Schmidt, Denis Wilk, Oliver Witzke

Verwendete Programmiersprache

Arduino C/C++

Eingesetzte Software

Arduino IDE, Cinema 4D, SolidWorks 2021 Visual Studio Code

Quellcode

Türsensor, Messstation

Gehäuse

Gehäuse Messstation

Eingesetzter Microcontroller

TTGO T-Display ESP32


Projektidee[Bearbeiten]

In Zeiten des Coronavirus wurde das Thema der Zutrittsbeschränkung in öffentlichen Räumen weitgehend präsent. Da die Lösung, mittels Sicherheitspersonals eine Kontrolle zu schaffen, personalintensiv ist, soll mithilfe des Projekts "RoomOwl" eine effiziente, moderne Lösung geschaffen werden, überflüssiges Personal zu ersetzen. Vorrangig soll mithilfe unserer Idee die Zugangskontrolle in Büros, Universitäten oder Schulen automatisiert gesteuert werden. Des Weiteren wird mit einer Messstation überprüft, ob der überwachte Raum ausreichend durchlüftet ist, oder ob das Fenster erneut geöffnet werden sollte.

Die Daten sollen zentral gespeichert sein und für den Nutzer leicht zugänglich gemacht werden, damit das gesamte System ohne Probleme von jedem benutzt werden kann. Somit soll insgesamt ein Produkt entstehen, welches sowohl eine Zugangskontrolle, als auch eine Messstation enthält.

Projektumsetzung[Bearbeiten]

Aufgrund der Modularität des Projektes und der verteilten Hardware, wurden die Aufgaben aufgeteilt und in Teilprojekte zerlegt. Die erste Aufgabe war die Planung und Umsetzung der "Türsteuerung" oder auch Einlasskontrolle. Da diese Aufgabe eine der Hauptkomponenten darstellt, hatte dies für uns eine höhere Priorität. Die zweite Aufgabe bestand aus der Entwicklung einer Messstation. Die dritte Aufgabe bestand aus der Implementierung der Datenbank und der Website, um die gewonnenen Daten abzurufen und die einzelnen Komponenten zu verknüpfen. Des Weiteren soll auf der Website die Steuerung und Konfiguration der Komponenten stattfinden. Zur Konfiguration gehört beispielsweise das Festlegen der Menge an Personen, die gleichzeitig in dem überwachten Raum sein dürfen.

Hardware[Bearbeiten]

Kern der Hardware ist ein TTGO T-Display ESP32. Dabei handelt es sich um einen Microcontroller auf Basis eines ESP32 der mit einem 1,14Zoll Display ausgestattet ist. Auerdem besitzt dieser einen eingebauten WIFI & Bluetooth Chip, mit dem die Konnektivität untereinander und zum Internet erreicht werden kann. Diese Verbindung ist wichtig für die Software, welche für die Steuerung der Einlasskontrolle und Messstation verwendet wird.

Teileübersicht[Bearbeiten]

Materialliste
Beschreibung Stückpreis Anzahl
TTGO T-Display ESP32 ca. 10€ 3
I²C-Display ca. 7€ 2
RFID-Reader ca. 3€ 2
Piezo Buzzer ca. 1€ 2
Lautsprecher ca. 0,50€ 2
LED-Ampel ca. 2€ 2
BME680 ca. 20€ 1
3,7V 1100mAh Lithium Akku ca. 4€ 3
Kabel - -
Gesamt ca. 89€ -

Einlasskontrolle[Bearbeiten]

Zur eigentlichen Einlasskontrolle wird ein RFID Reader verwendet. Dieser ermöglicht eine Nachverfolgung, welche Person sich zu welcher Zeit im Raum befunden hat. Dies lässt sich über die RFID-Seriennummer realisieren. Wird ein RFID-Transponder auf das Feld des Readers gelegt, gibt die Box via eines Piezo-Speakers ein audiovisuelles Feedback. Auf dem LCD Display wird eine Nachricht angezeigt, die entweder zum Eintreten oder zum Warten auffordert, je nachdem wie viele Leute bereits im Raum sind. Auf dem Display des TTGO wird die Anzahl der Personen angezeigt, die sich zurzeit im Raum befinden. Eine Ampel aus LEDs unterstützt die Aufforderung des LCD Displays entweder mit einem grünen Licht (eintreten) oder einem roten Licht (warten). Zuletzt wird ein akustisches Signal gegeben. Ein Lautsprecher erzeugt ein positives Signal, wenn die Person zum eintreten aufgefordert wird, oder ein negatives Signal, wenn die Person warten soll.

RFID-RC522[Bearbeiten]

Um den RFID-Reader nutzen zu können, wurde die MFRC522.h Bibliothek von André Balboa verwendet. Diese ermöglicht es leicht die Daten aus einem RFID-Transponder auszulesen und zu verarbeiten. Des weiteren wurde die Bibliothek SPI.h verwendet. SPI.h ist eine Standard Bibliothek von Arduino die es ermöglicht mit SPI Geräten zu kommunizieren.

Bevor man den RFID-Reader nutzen kann, muss eine Verbindung zwischen ESP32 und den RFID-RC522 instanziiert werden.

Der Schaltplan für die Zugangskontrolle.
#include <MFRC522.h>
#include <SPI.h>

MFRC522 mfrc522;
void setup()
{
    Serial.begin(9600);
    while (!Serial)
        ;
    Serial.printf("\n\n\n> Serial setup finished!\n");

    // MFRC522 setup
    SPI.begin(PIN_SCK, PIN_MISO, PIN_MOSI, PIN_SS);
    mfrc522.PCD_Init(PIN_SS, PIN_RST);
    mfrc522.PCD_DumpVersionToSerial();
}

Anmerkung: Da standardmäßig die Pins, die der RFID-RC522 benötigt werden, am TTGO-ESP32 entweder fehlen oder bereits belegt sind, muss man die Pins mit den Befehl SPI.begin() ummappen. Wir haben uns für diese Pinbelegung entschieden:

Pin Belegung
Bezeichnung Pin
SCK 27
MISO 32
MOSI 33
SS 25

Hat man die Verbindung richtig instanziiert, dann kann man ganz leicht, mit den Folgenden Code, die RFID aus einen RFID-Transponder auslesen.

Die Einlasskontrolle, wenn man einen RFID-Chip an den Sensor hält.
void loop()
{
    // Look for new cards
    if (!mfrc522.PICC_IsNewCardPresent())
    {
        return;
    }
 
    // Select one of the cards
    if (!mfrc522.PICC_ReadCardSerial())
    {
        return;
    }
  
    // Get RFID from RFID-Transposer
    char buffer[8];
    sprintf(buffer, "%02X%02X%02X%02X", mfrc522.uid.uidByte[0], mfrc522.uid.uidByte[1], mfrc522.uid.uidByte[2], mfrc522.uid.uidByte[3]);
    Serial.printf("> RFID: %s\n", buffer);
}

I2C LCD-Display[Bearbeiten]

Den I2C LCD-Display kann man mit der LiquidCrystal_I2C.h Bibliothek von Marco Schwartz ansteuern und Ausgaben tätigen. Das LCD-Display hat eine Auflösung von 16x2. Das heißt, dass einem 16 Zeichen in der Breite zur Verfügung stehen, a 2 Zeilen. Da es sich bei den Display um ein I2C Display handelt muss die I2C Schnittstelle an den TTGO ESP32 registriert werden. Dazu kann man die Bibliothek Wire.h verwenden. Bei der Bibliothek Wire.h handelt es sich um eine Standard Bibliothek von Arduino. Das bedeutet, dass diese nicht explizit installiert werden muss.

Bevor man den I2C LCD-Display nutzen kann, muss eine I2C Verbindung mit dem TTGO ESP32 instanziiert werden.

Die Innenansicht der Zugangskontrolle.
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
...
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
    ...

    // I2C LCD display setup
    Wire.begin(PIN_LCD_SDA, PIN_LCD_SCL);
 
    lcd.init();
    lcd.backlight();

    ...
}

Anmerkung: Für die I2C Verbindung können die Standard Pins, Pin SDA = 21 und Pin SCL = 22, verwendet werden.

Wenn eine Verbindung erfolgreich aufgebaut werden konnte, ist es möglich mit den folgenden Zeilen Code eine Ausgabe auf dem I²C LCD-Display zu tätigen. Konkret soll in diesem Projekt auf dem LCD-Display ausgegeben werden, ob eine Person den Raum betreten darf oder nicht. Dies wird mit den Schlagwörtern "Bitte Eintreten!" und "Nicht eintreten!" signalisiert.

Die Außenansicht der Holzbox mit der Einlasskontrolle.
void loop()
{
    ...
    if(hat_betretenRFIDCount > hat_verlassenRFIDCount)
    {
        ...
    }
    else
    {
        // A user can only enter a room when the max. person threshhold is not exceedet
        if (m_room.getPersonCount() < m_room.getMaxPersonAmount())
        {
            ...
            lcd.setCursor(0, 0);
            lcd.printf("Bitte Eintreten!");
        }else
        {
            ...            
            lcd.setCursor(0, 0);
            lcd.printf("Nicht eintreten!");
        }
    }
    ...
}

TTGO Display[Bearbeiten]

Der TTGO ESP32 kommt mit einem eingebauten Display. Dieses Display kann über die Bibliothek TFT_eSPI.h angesteuert werden, so dass man einfache und auch komplexe Ausgaben tätigen kann. Das Display hat eine Auflösung von 135x240 Pixel (1.14 Zoll) und ist nicht nur dazu imstande einfache Texte, sondern auch Grafiken darzustellen.

Eine Verbindung zwischen dem TTGO ESP32 und dem Display wird folgendermaßen aufgebaut.

#include <TFT_eSPI.h>
...

// TTGO Display
TFT_eSPI tft = TFT_eSPI();
void setup()
{
     ...
     // Verbindung aufbauen
     tft.init(); 
     
     // Darstellung konfigurieren
     tft.setRotation(1);
     tft.setTextColor(TFT_WHITE, TFT_BLACK);
     tft.fillScreen(TFT_BLACK);
     ...
}

Wurde die Verbindung erfolgreich aufgebaut, dann kann man auf dem Display eine einfache Textausgabe tätigen. In diesem Fall soll auf dem Display die Anzahl der Personen angezeigt werden, die sich aktuell im Raum befinden.

void loop()
{
     ...
     tft.fillScreen(TFT_BLACK);
     tft.setCursor(28, 50);
     tft.setTextColor(TFT_WHITE, TFT_BLACK);
     tft.setTextSize(4);
     tft.printf("%3d/%3d\n", (int)m_room.getPersonCount(), (int)m_room.getMaxPersonAmount());
     tft.printf("%d", m_room.getPersonCount());
     ...
}

Messstation[Bearbeiten]

Die Außenansicht der Messstation (vorne).
Die Außenansicht der Messstation (hinten).

Die Messtation sollte möglichst flexibel in jedem Raum eingesetzt werden, weshalb es für uns wichtig war ein tragbares System zu entwickeln. Die Messtation selber sollte Temperatur, Luftdruck und die Luftqualität messen. Der BME680 bott dafür alle möglichkeiten, das ganze System über eine I2C Schnittstelle zu ermögichen.Aufgrund des Boarddesgins, ist es nicht immer möglich I2C Geräte gleichzeitig mit dem Display zu betreiben, wie es hier der Fall ist, weshalb der Sensor mittels SPI angeschlossen werden musste. Da der TTGO über ein integriertes Display verfügt, sollte dieses auch in der Messstation eine Funktion behalten. Da das Display mit 240x110 px nicht hoch aufgelöst ist, musste die Anzeige besonders genau geplant werden, damit die angezeigten Informationen lesbar sind. Außerdem ist es für die Nutzer noch interessant einen Verlauf der Temperatur zu sehen weshalb auch ein Graph dargestellt werden kann.

BME 680[Bearbeiten]

Für den BME 680 Sensor wurde die Libary von Bosch selber gewählt, da die Messung von AQI (Air Quality Index) nur durch eine komplizierte Umrechnung der Werte möglich ist. Die Daten werden in regelmäßigen Abständen von 15 Minuten ausgelesen und in einer Datenbank gespeichert.

Damit der Sensor seine volle Genauigkeit erreicht, muss dieser für jeden Raum neu kalibriert werden weshalb beim ersten Start der Messstation eine Funktion eingebaut wurde, die diese Kalibrierung vornimmt und in den EEPROM des TTGO speichert. Sollte der Sensor für einen längeren Zeitraum im gleichen Raum eingesetzt werden, wird die Kalibrierung nicht neugestartet.

Der Air Quality Index (AQI) gibt in einer Punkteskala von 0 bis 500 Punkten an, wie sich die Luftqualität einordnen lässt. Dafür gibt es eine international gültige Skala inklusive Farbcode. Im Quellcode wird dieser Farbcode auch zusätlich genutzt, um den Wert einzufärben und so schon aus größerer Entfernung anzuzeigen, wie die Qualität ist.

Der Schaltplan für die Messstation.
  if (aqi <= 50)
  {
    tft.setTextColor(TFT_GREEN, TFT_BLACK);
    tft.print("AQI: ");
    tft.print(aqi);
    tft.print(" GOOD");
  }
  else if (aqi > 50 && aqi <= 100)
  {
    tft.setTextColor(TFT_YELLOW, TFT_BLACK);
    tft.print("AQI: ");
    tft.print(aqi);
    tft.print(" Moderate");
  }
  else if (aqi > 100 && aqi <= 150)
  {
    tft.setTextColor(TFT_ORANGE, TFT_BLACK);
    tft.print("AQI: ");
    tft.print(aqi);
    tft.print(" Unhealthy Sensitiv");
  }
  ...

Sollte der Sensor einen Wert von 100 oder höher ausgeben wird zusätzlich noch von unserem TelegramBot eine Warnung geschickt und geraten den Raum zu lüften. Die Benachrichtigung durch den TelegramBot, wird durch das Senden einer HTTP Get-Nachricht ausgelöst. Wie hier beispielsweise für die Temperatur zu sehen

String url = "https://api.telegram.org/bot" + token + "/sendMessage?chat_id=" + chatId + "&text=" + "Temperatur im Raum bei: " + String(temperature) + "c";
  http.begin(url); //Specify the URL
Die erzeugte Ausgabe im Telegram-Bot.

Verlaufs Graph[Bearbeiten]

Den Graphen zu implementieren hat eine gewisse Vorüberlegung gebraucht, bei der das Display unterteilt wurde. Die Daten für den Graphen werden aus der DB abgerufen. Dieses Array wird dann durchiteriert. Bei der Planung vorher wurde festgelegt, dass 1°C genau 3 px entsprechen. Um die y-Koordinate zu berechenen, wird der Temperatur-Wert * 3 gerechnet wird und dann von 105 (0 Punkt der y-Achse) abgezogen.

Die Außenansicht der Messstation (innen).
for (int i = 0; i <= valueCounter; i++)
  {
    int value = values[i];
    //height from temperature and subtract from actual height
    y = 105 - value * 3;

Die x-Koordinate wird initial auf 30 festgesetzt und am Ende der Funktion um 10 erhöht, da das den Abstand zwischen den Punkten darstellt. Mit der x-&y-Koordinate wird dann an diese Stelle ein grüner Kreis mit einem Radius von 2 gezeichnet. Danach wird der Punkt mit dem vorangegangenen Punkt verbunden. Dafür wird als Start Punkt die aktuellen x-&y-Koordinaten ausgewählt und für den zweiten Punkt x um 10 minimiert und die yOld Variabel abgerufen.

    //circle at temperature
    tft.drawCircle(x, y, 2, TFT_GREEN);
    //connect points
    //if x>30 subtract 10 to get old x axis else x for first circle
    tft.drawLine(x, y, x > 30 ? x - 10 : x, yOld, TFT_GREEN);
    //move x position by 10
    x = x + 10;
    //save old y-coordinate
    yOld = y;
  }

Die Planung und das Ergebnis, wie der Graph dann ausschaut kann man in diesen Bildern sehen.

  • Der Graph, der auf dem Display des TTGO angezeigt werden soll.
  • Der tatsächliche Graph auf dem Display, welches bereits in der 3D-gedruckten Box integriert ist.

DeepSleep und Akku[Bearbeiten]

Um eine lange Laufzeit zu gewährleisten und den Akku zu schonen, damit auch längere Laufzeiten möglich sind, wird der DeepSleep Modus des TTGO-T1 verwendet. Der Stromverbrauch der einzelnen Komponenten wird wie folgt in den Datenblättern der Hersteller angegeben:

Verbrauchsübersicht
Modul Verbrauch Betrieb Verbrauch DeepSleep
ESP32 TTGO-T1 67 MA = 0,067A 350μA = 0.00035A
BME 680 3.7μA (Temperatur, Luftdruck, Feuchtigkeit & 12mA für Gas = 0,0000037A + 0,012A = 0,0120037A 0.15 μA = 0,00015mA
Gesamt = 0,0680037A

Der Akkku sollte möglichst kompakt sein und den TTGO mit Messungen durch einen normalen Tag mit ca. 12 Stunden bringen. Die Entscheidung ist auf einen Akku mit 1100mAh Kapazität und 3,7V Ausgangsspannung gefallen.

Infografik nach Knopfdruck.

Wenn jede Minute gemessen wird und das Display aktiv wären: 1,1Ah/ 0,068A * 60 = 16 Stunden Betrieb. Mit dem Einsatz des DeepSleep Modus bei dem sich der Verbrauch des TTGO auf 350μA und vom BME680 auf 0.15 μA damit kann die StandBy und Betriebsdauer auf mehrere Tage angehoben werden, bevor die Messtation geladen werden muss.

Buttons[Bearbeiten]

Sollte sich der TTGO gerade im DeepSleep Modus befinden, besteht die Möglichkeit, mit dem unteren Buton, der am TTGO angebracht ist, diesen wieder aus dem DeepSleep Modus aufzuwecken. Mit dem oberen Knopf können die Ansichten umgeschaltet werden. Standardmäßig wird erst eine Übersicht über die vier Werte geliefert und danach der Graph angezeigt. Nach dem ersten Druck auf den Knopf, wird dann zukünftig nurnoch der Graph angezeigt. Nach einem weiteren Druck nurnoch die Kurzinfo und nach einem weiteren Druck wieder auf dem Default.

Entwicklung der Gehäuse[Bearbeiten]

Damit die Hardware nicht von außen sichtbar ist, war es uns wichtig, diese mithilfe von Gehäusen zu verstecken. Da zwei verschiedene Aufgaben mit unterschiedlichen Boxen haben, wollten wir zwei vollkommen verschiedene Herangehensweisen wählen. So wurde sich für ein Holz-Gehäuse entschieden, welche die Einlasskontrolle umhüllt und ein 3D gedruckes Gehäuse für die Messstation. Da jedes Material seine Vor- und Nachteile hat, wurden unterschiedliche Herangehensweisen gewählt. Da das Projekt auch Anwendung in der Praxis haben soll und dabei eine ansprechende Optik ein entscheidener Faktor sein kann, wenn ein potentieller Kunde unterschiedliche Produkte vergleicht. Des Weiteren wird mithilfe der Gehäuse eine erhöhte Benutzerfreundlichkeit geschaffen, sodass ein Anwender zu jeder Zeit verstehen kann, was er/sie zu tun hat.

Gehäuse für die Messstation[Bearbeiten]

Modell in SolidWorks 2020.

Für die Messtation wurde 3D-Druck gewählt, um möglichst flexibel nach Kundenanforderungen Farben oder Design-Aspekte beachten können. Die Anforderung an uns selber war es, das das Gehäuse möglichst kleine Abmessungen hat und noch das Display abgelesen, sowie die Knöpfe auf der vorderseite benutzt werden können. Konstruiert wurde das 3D-Modell in SolidWorks 2020. Dafür wurden die einzelnen Komponenten (TTGO,BME & Akku) ausgemessen und modelliert, damit ein möglichst genaues Gehäuse erstellt werden kann. Der erste Protoyp hatte zwei Design Fehler, so waren die Knöpfe durch einen Messfehler nicht erreichbar. Der TTGO hat zwar gepasst saß aber mit zu viel Druck in der Halterung weshalb diese nachbearbeitet werden musste. Hier Foto von altem Generell war das Gehäuse in der Form nur als Prototyp anzusehen der in einem weiteren Schritt dahingehend angepasst wurde.

Die zweite Version wurde dann aus den Erfahrungen angepasst, so wurde die Anschlusssektion für den TTGO-T1 angepasst. Aber auch das generelle Design des Gehäuses wurde etwas "schlanker" gestalltet. Bild vom zweiten Gehäuse.


Aus dem erstellten SolidWorks Modell wurde dann eine .STL Datei erstellt, die dann mit CURA gesliced wurde. Gedruckt wurde das Gehäuse dann mit einem Ender 3 v2 in Anthrazit V2 Filament. Die Dateien für das Gehäuse werden unter https://www.thingiverse.com/thing:4818175 zur Verfügung gestellt.

Gehäuse für die Einlasskontrolle[Bearbeiten]

Die fertige Zeichnung, um die Holzbox genau sägen zu können.

Bevor wir ein Gehäuse aus Holz sägen und zusammenkleben konnten, mussten ein 3D-Modell erstellt werden, um die exakten Maße festzustellen. Dazu war es zuerst wichtig, alle Komponenten im Vorhinein auszumessen und ein grobes Konzept aufzustellen. Danach wurde das Modell in der 3D-Software "Cinema 4D" grundlegend erstellt und die einzelnen Komponenten implementiert. Damit eine realistischere Darstellung des Modells bereits in der Modellierungsphase gerendert werden konnten, wurde die Render-Engine "RedShift" verwendet, welche den Renderer in Cinema 4D, welcher mittels CPU-Leistung rendert, ersetzt und einen GPU-Renderer verwendet. Somit erhalten wir nicht nur realistisch berechnete Modelle, diese werden zusätzlich auch noch fast in Realtime erstellt. Gemäß der zuvor angelegten Skizze konnte das Modell nun verfeinert werden. Nachdem dies geschehen ist, mussten einige Feinheiten ausgebessert werden. Ein Problem war beispielsweise das Kabelmanagement, welches überraschend viel Platz einnimmt, da die Kabel nicht unnötig viel geknickt werden sollten. Gleiches gilt auch für die Stromzufuhr, welche der ESP-32 benötigt. Des Weiteren musste sichergestellt werden, dass die einzelnen Komponenten fest im Gehäuse drinstecken oder festgeklebt sind. Auch war es ein wichtiges Anliegen, dass die Teile nicht allzu fein konstruiert sind, um zum einem Stabilität und zum anderen eine realistische Umsetzung garantieren kann. Wären die Teile beispielsweise zu dünn gewesen, hätte man diese nicht nur schlecht sägen können, sie wären vermutlich auch in der finalen Version zusammengefallen. Somit mussten schon in der Entwicklungsphase des 3D-Modells erste Testläufe durchgeführt werden, damit das Design umsetzbar bleibt.

Entwicklung des Designs in Cinema 4D.

Ein weiteres Problem war die Integration des RFID-Reader. Da die Pins teilweise nach außen zeigen, wäre eine "gut aussehende" Lösung kaum möglich gewesen. Wie sich aber zeigte, kann ein RFID-Chip auch durch die Holzfassade hindurch erkannt werden, somit ist der Reader in der Box und wird nur durch ein eingelasertes RFID-Symbol auf der Holzbox signalisiert. Somit sieht die Box sehr sauber aus und bietet eine sehr gute Usability.

Nachdem das Modell in Cinema 4D verfeinert und für die praktische Umsetzung vorbereitet wurde, musste eine finale Zeichnung vorbereitet werden. Mithilfe dieser konnten dann die einzelnen Holzstücke gesägt und später zusammengeschraubt werden. Die Hardware wurde bereits vor dem Entwicklungsprozess des Gehäuses fertiggestellt, sodass das Zusammenführen dieser keine Herausforderung mehr darstellte. Voerst blieb die Rückseite der Holzbox geöffnet, damit Änderungen ohne Probleme vorgenommen werden konnten. Auch wurden die Komponenten an die Box geklebt, damit diese leicht wieder abgenommen und verändert werden konnten.

Fazit[Bearbeiten]

Beide Boxen haben Vor- und Nachteile. Mithilfe des 3D-Druckers ist es vorrangig möglich, kleine Konstruktionen möglichst genau zu erstellen. Die Holzbox ist im Verhältnis die etwas gröbere Variante, ist aber mit steigender Größe definitiv einfacher und schneller konstruiert. Es war definitiv angebracht, das wir die Zugangskontrolle aufgrund der Größe mit einer Holzbox ummantelt haben, und die Messstation konnte sehr klein und handlich in die 3D-gedruckte Box eingefügt werden.

Abhängig von Zweck, den man verfolgt, muss man die Vor- und Nachteile abwägen. Für eine Box, die 3D-gedruckt ist, benötigt man logischerweise einen 3D-Drucker, der in den meisten Haushalten nicht üblich ist. Sobald es wieder möglich ist, im Fablab zu agieren, ist dieser Nachteil natürlich obsolet. Bei der Holzbox ist zu beachten, dass es notwendig ist Grundkenntnisse in der Holzbearbeitung haben sollte, damit das Endprodukt entsprechend qualitativ aussieht.

Die Modellierung der Boxen läuft gleich ab. Welche Software man dabei verwendet, ist irrelevant. Cinema 4D schafft mit einigen Plug-Ins die Basis für die Erstellung eines Objekts, welches für den 3D-Druck bereit ist. Das selbe gilt auch für andere Produkte, welche kostenfrei (auch nicht als Student) erhältlich sind. Das bekannteste Beispiel ist Blender, welches komplizierter zu verstehen ist, aber ähnliche Funktionalitäten mit sich bringt. Bei der Entwicklung einer Holzbox braucht man kein Plug-In, da das Modell nicht exakt so verwendet wird, sondern nur als "Bauplan" für die tatsächliche Box dient.

Abschließend ist zu sagen, dass die Entwicklung einer Box immer aufwendig ist. Egal auf welche Art man es schaffen will, es ist mit einer Menge Zeitaufwand verbunden. Deshalb stellt sich eher die Frage, ob man eine Box für die Hardware benötigt und nicht wie man diese konstruiert.

Software[Bearbeiten]

In diesem Abschnitt wird ihnen die verwendete Software beschrieben, die das System zusammenführt. Dazu gehört einerseits die Datenbank, auf der die RFIDs und die Messdaten von der Luftüberwachungsstation gespeichert werden und andererseits die Webpage, auf der die Konfiguration für die Einlasskontrolle vorgenommen werden kann.

Datenbank[Bearbeiten]

Das ER-Modell für die Datenbankstruktur.

Die Daten die die Messstation und die Einlasskontrolle erzeugen werden in einer Datenbank gespeichert. Es handelt sich dabei um eine einfache MySQL MariaDB Datenbank. Das entsprechende Entity-Relationship-Modell(ER-Modell) zu der Datenbank wird in der rechten Abbildung gezeigt. Für die Einlasskontrolle sind die Tabellen hat_betreten und hat_verlassen besonders wichtig, da das Gerät durchgehend mit diesen Tabellen kommuniziert und an diese Tabellen entsprechende Einträge schickt. Die Tabelle hat_temperaturwert_aufgenommen wird hauptsächlich von der Messstation verwendet.

Wie man es in den ER-Modell sieht, besteht die Datenbank aus drei Hauptentitäten(Raume, Nutzer, Geraete) und aus drei, der Hauptentitäten abgeleiteten, Entitäten(hat_betreten, hat_verlassen, hat_temperaturwert_aufgenommen).

Datenbank Entitäten
Entität Beschreibung
Nutzer In dieser Tabelle werden alle Nutzer mit der entsprechenden RFID gespeichert.
Raume Die Tabelle Raume enthält alle wichtigen Informationen der Räume.
Geraete Die Geräte Tabelle Speichert alle RoomOwl geräte(Messstation, Einlasskontrolle)
hat_betreten Enthält eine Liste, wo und zu welchen Zeitpunkt ein Nutzer einen Raum, durch welches Gerät, betreten hat.
hat_verlassen Enthält eine Liste, wo und zu welchen Zeitpunkt ein Nutzer einen Raum, durch welches Gerät, verlassen hat.
hat_temperaturwert_aufgenommen In dieser Tabelle wird Raumtemperatur, Luftfeuchtigkeit und Luftdruck gespeichert. Außerdem wird festgehalten im welchen Raum diese werde aufgenommen wurden, von welchen Gerät, zu welchen Zeitpunkt.

Damit die Einlasskontrolle und die Messstation mit einer Datenbank kommunizieren können, wurde die MySQL Connector Arduino Bibliothek von Dr. Charles Bell verwendet. Wir haben uns für diese Bibliothek entschieden, da diese den Verbindungsaufbau mit einer Datenbank sehr vereinfacht und die Datenübertragung so weit abstrahiert, dass man einfach nur die SQL Befehle an die Datenbank schicken kann und man darauf folgend die erwarten Ergebnisse von der SQL Datenbank geliefert bekommt.

Dazu ein Beispiel:

...
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <WiFi.h>
...

// WiFi
WiFiClient espClient;

// SQL
MySQL_Connection conn((Client *)&espClient);
MySQL_Curso* cursor = new MySQL_Cursor(&conn);

IPAddress& ip(192, 168, 178, 3);      // Database ip
const char* username = "esp32user";   // Database user name
const char* password = "password";    // Password

void setup()
{
    ...
    // Establish the database connection
    std::string database_name = "es_datenbank";

    Serial.printf("\n> Try to connect with:\n\t-> IP: %s\n\t-> Username: %s\n\t-> Password: %s\n", ip.toString().c_str(), username, password);

    while (!conn.connect(ip, 3306, const_cast<char *>(username), const_cast<char *>(password), const_cast<char *>(database_name.c_str())))
    {
        delay(1000);
    }
    Serial.println("> Connection to database established!");
    ...
}

void loop()
{
    // Send data to database
    if(conn.connected())
    {
         // Insert user Malfred Olav with the RFID AC:67:B2:2A:EF:70 and status 0 to the database.
         cursor->execute("INSERT INTO es_datenbank.nutzer(RFID, Vorname, Nachname, Satus) VALUES ("AC:67:B2:2A:EF:70", "Malfred", "Olav", "0")");
    }
}

Webpage[Bearbeiten]

Die Konfigurationsseite der Webpage.

Die Einlasskontrollen oder die Messstationen müssen einfach für die Nutzer zu konfigurieren sein. Da die Nutzer möglicherweise nicht über das nötige Grundwissen über das Programmieren von Mikrokontrollern verfügen, ist es wichtig, dass wir den Nutzern eine möglichst einfache Möglichkeit bieten, die Geräte einzustellen. Um das Problem zu lösen haben wir uns für eine Webseite entschieden, die von den entsprechenden Geräten gehostet wird. Damit der Nutzer die Website erreichen kann, muss er die folgenden Schritte befolgen:

  • 1) Bevor man sich mit der Website verbinden kann, muss man sicherstellen, dass das Gerät eingeschaltet ist.
  • 2) Wenn das Gerät an ist, dann eröffnet das Gerät ein eigenes Netzwerk mit dem man sich über WLAN verbinden kann. Das Netzwerk heißt immer "RoomOwl" gefolgt von dem Namen des Gerätes und seiner MAC-Adresse. (z.B.: "RoomOwlTuerensensorAC:67:B2:2A:EF:70")
  • 3) Hat man sich mit den richtigen Netzwerk verbunden, dann kann man sich über die IP-Adresse, die auf dem LCD Display angezeigt wird, mit der Seite verbinden.
  • 4) Wenn man die Seite erreicht hat, dann wird man um einen Nutzernamen und ein Password gebeten. Standartmäßig lautet der Nutzername "admin" und das Password "012345678", wenn die Login-Daten nicht von den Nutzer selber geändert wurden.
  • 5) Hat man alle Schritte erfolgreich befolgt, dann wird man zu einer Konfigurationsseite weitergeleitet mit der man das Gerät einstellen kann.

Nice to Know[Bearbeiten]

I2C[Bearbeiten]

Die ersten Versuche den Sensor mit dem TTGO über I2C anzusprechen sind gescheitert, da in der TTGO Libary in der pins_arduino.h für das TTGO T1 Board folgendes steht:

static const uint8_t SDA = 21;
// Despite the many diagrams from TTGO showing SCL on pin 22, due to the on-board LED
// also on this pin it is better to shift to 23 instead to avoid issues.
static const uint8_t SCL = 22;

Der Pin 23 wird allerdings nicht aus dem Gerät geführt weshalb wir den Pin 15 genommen haben. Eine andere alternative wäre die Wahl des ESP 32 Dev Modul als Board auf das der Sketch geladen wird.

BME680[Bearbeiten]

Das Einbinden der BSEC Libary in die Arduino IDE ist nicht ohne einen kleinen Aufwand verbunden. So muss die platform.txt angepasst werden, die unter "C:\Users\%username%\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.5 liegt abgeändert werden. Unter Visual Studio Code mit der Erweiterung "PlatformIO" läuft die Libary sofort.

I2C LCD-Display[Bearbeiten]

Problem: Es gab ein Problem, bei dem einprogrammierten Ausgaben nicht auf dem I2C Display erschienen sind und das Display nur hell leuchtete.
Lösung: Hinter dem I2C Display befindet sich eine Schraube mit der man die Helligkeit einstellen kann. Aus irgendeinem Grund ist diese Standardmäßig auf die höchste Helligkeit eingestellt. Damit wurde unser Problem gelöst.

TFTe_SPI.h[Bearbeiten]

Problem: Das TTGO-Display leuchtet Schwartz, gibt aber nichts aus.
Lösung: Die TFTe_SPI Bibliothek muss richtig konfiguriert werden. Dazu muss man in der User_Setup_Select.h die Zeile 22 (#include <User_Setup.h>) kommentieren und dann das entsprechende Display unkommentierten. Bei den ESP32 TTGO ist es die Zeile 53(#include <User_Setups/Setup25_TTGO_T_Display.h> ).

Plakat[Bearbeiten]

RoomOwlPoster.png