Projekt 91: Decimal Clock Tower: Unterschied zwischen den Versionen
Zeile 245: | Zeile 245: | ||
Die Außenstation | Die Außenstation | ||
Die Außenstation verwendet zwei Sensoren. Einen DHT22 für die Temperatur- und Luftfeuchtigkeitsmessung, und einen BMP180 für die Druckmessung. Da die Außenstation Mit Batterien betrieben wird, bedarf es der Deep-Sleep Funktion, die die Peripherie und die beiden Xtensa-Prozessoren abschaltet. Im wachen Zustand verbring die Station nur wenige Sekunden. Dabei werden Daten von den Sensoren gelesen und via des ESP-Now Protokolls an die Innenstation verschickt. Wie oft die Daten Transferiert werden sollen, kann man im Programm-Code definieren. Die Daten werden als Byte-Päckchen verschickt. Jeder andere Typ muss somit zunächst als ein Byte-Array definiert werden. | Die Außenstation verwendet zwei Sensoren. Einen DHT22 für die Temperatur- und Luftfeuchtigkeitsmessung, und einen BMP180 für die Druckmessung. Da die Außenstation Mit Batterien betrieben wird, bedarf es der Deep-Sleep Funktion, die die Peripherie und die beiden Xtensa-Prozessoren abschaltet. Im wachen Zustand verbring die Station nur wenige Sekunden. Dabei werden Daten von den Sensoren gelesen und via des ESP-Now Protokolls an die Innenstation verschickt. Wie oft die Daten Transferiert werden sollen, kann man im Programm-Code definieren. Die Daten werden als Byte-Päckchen verschickt. Jeder andere Typ muss somit zunächst als ein Byte-Array definiert werden. | ||
== Ergebnis == | == Ergebnis == |
Version vom 18. Januar 2019, 05:06 Uhr
Autoren: Eugen Preger, Rudi Sugandi
Betreuer: Daniel Klein
→ zurück zur Übersicht: WS 18/19: Angewandte Elektrotechnik (BSE)
Thema
Der Rheinturm bildet eine Dezimaluhr mit Hilfe von LEDs ab. Darüber hinaus soll die Uhr um Funktionen einer Wetterstation erweitert werden. Dazu werden Temperatur, Luftdruck und Luftfeuchtigkeit gemessen. Ein LED-Streifen dient hierbei als Anzeige der Uhr.
Aufgabe
Konstruktion einer Uhr mit Wetterstation in der Form des Rheinturms
Erwartungen an die Projektlösung
- Technische Recherche zur Lösungskonzeptionierung
- Planung der Wetterstation bestehend aus Außen- und Innenstation
- Drahtlose Kommunikation der Außensensoren und Wetterstation
- Außensensoren: Temperatur, Feuchtigkeit, Luftdruck
- Die Außenstation ist wetterfest
- Innensensoren: Temperatur, Feuchtigkeit
- Bestellung der Bauteile (Miniaturisierung z.B. Arduino Nano)
- Konstruktion des Rheinturms mit der Konstruktionssoftware SolidWorks
- Platinenlayout mit Multisim/Ultiboard
- Platinenfertigung auf dem Fräsbohrplotter
- Softwareprogrammierung: Uhrzeit, Temperatur, Luftfeuchtigkeit, Druck, Messdatenaufzeichnung, Wetterprognose anhand der Sensordaten
- Fertigung und Montage der Bauteile
- Machen Sie ein tolles Videos, welches die Funktion visualisiert.
- Test und wiss. Dokumentation der Lösung
- Live Vorführung während der Abschlusspräsentation
Kür: Zugriff auf die Wetterdaten via Web-Seite
Einleitung
Das Internet der Dinge oder IoT ist das neue Trendwort, welches in den letzten Jahren das Internet erobert. Das IoT beschreibt eine Technologie der kommunikativen Vernetzung von physischen und virtuellen Gegenständen, die dadurch eine gemeinsame Arbeit erfüllen können. Der Decimal Clock Tower beschreibt den miniaturisierten Rheinturm, der sich dieser Technologie bedient. Er stellt nicht nur, wie sein großes Original, die Uhrzeit mit Hilfe einer Dezimal-Uhr dar, dieser misst zudem Wetterdaten aus. Mit Hilfe von Sensorik werden Messdaten, wie Temperatur, Luftfeuchtigkeit und Luftdruck gemessen und drahtlos auf einen eigens dafür erstellten oder von einem host bereitgestellten Webserver versendet. Eine einfache Außenstation, bestückt mit einem kleinen Computer und Sensorik, bietet die Außen-Wetterwerte an. Die Kommunikation zwischen dem Rheinturm und der Außenstation erfolgt ebenfalls drahtlos mit Hilfe eines Protokolls, welcher vom Hersteller der Mikrokontroller bereitgestellt wurde.
Verwendete Hardware
- Entwicklungsboard SBC-NodeMCU-ESP32
- Programmierbare RGB-LED-Streife WS2812B
- Digitaler Temperatur- und Feuchtigkeitssensor DHT22
- Digitaler Luftdruck Sensor BMP180
- Steckernetzteil, 15 W, 5 V, 3 A
Hardwarebeschreibung
SBC-NodeMCU-ESP32
Wie der Abbildung 1 zu entnehmen, besitzt das Entwicklungsboard ESP32 ein internes WLAN-Funkmodul, welches im Projekt für die Kommunikation zwischen der Innen- und Außenstation sowie zur Datenübertragung an den Webserver verwendet wird. Die beiden Xtensa-Prozessoren werden für das Multithreading verwendet. Ein Prozessor der Innenstation wird zur Darstellung der Zeit verwendet. Der zweite Prozessor steuert die Kommunikation. Mit Hilfe des Co-Prozessors, welcher einen sehr niedrigen Stromverbrauch hat, wird die Deep-Sleep-Funktion der Außenstation, da diese mit Batterien betrieben wird, realisiert. Das Entwicklungsboard ist nach dem Zusatz des Espressif IoT Development Framework mit der Arduino IDE kompatibel. Der Microkontroller arbeitet mit einer Spannung von 3,3 V. Ein Spannungsregler sorgt dafür, dass das Board mit einer Spannung von 3,3 V bis 10 V an Vin betrieben werden kann.
Technische Daten
- Anschluss: Micro-USB, Vin
- Prozessoren:
- 2x Xtensa LX6, 160 MHz - 240 MHz
- Co-Prozessor mit sehr niedrigem Stromverbrauch
- Interner RAM: 520 kB
- Interner ROM: 448 kB
- Flash-Speicher: 4 MB
- Internes Bluetooth-Modul
- Internes WLAN-Modul mit Antenne
- Integrierter Hall-Senso
- Integrierter Temperatursensor
Digitaler Temperatur- und Feuchtigkeitssensor DHT22
Das digitale Temperatur- und Feuchtigkeitsmodul DHT22 (AM2302) gibt ein kalibriertes digitales Signal durch eine Ein-Adrige Verbindung (Single-Bus) aus, welches bis zu einer Entfernung von max. 20 m übertragbar ist. Der Sensor kann mit 3,3 V oder 5 V betrieben werden.
Technische Daten:
- Betriebsspannung: 3,3 V oder 5 V
- Temperatur:
- Messbereich: -40 °C bis 80 °C
- Genauigkeit: +- 0,5 °C bis +- 1,0 °C
- Wiederholgenauigkeit: +- 0,2 °C
- Auflösung 0,1 °C
- Luftfeuchtigkeit:
- Messbereich: 0 % bis 99,9 %
- Genauigkeit: +- 2 % (bei 25 °C)
- Wiederholgenauigkeit: +- 0,3 %
- Auflösung 0,1 %
Digitaler Luftdruck Sensor BMP180
Der BMP180 ist ein präziser digitaler Drucksensor für Verbraucheranwendungen. Der Sensor ist stromsparend und für den Einsatz von Outdoor-Geräten optimiert.
Technische Daten:
- Anschluss: I2C
- Betriebsspannung 1,8 V bis 3,6 V
- Messbereich: 300 hPa bis 1100 hPa
- Rauschen: 0,06 hPa
Projekt
Das Projekt bildet eine Grundlage einer vernetzten Einheit zur Automatisierung von Aufgaben in einem Umfeld bis zu einem Umkreis von einigen km an. Eine zentrale Einheit kommuniziert hierbei mit einer weiteren Station. Daten werden von der zweiten Station der zentralen Einheit übergeben, die diese verarbeitet und einem Webserver zur Verfügung stellt. Mit Hilfe des V-Modells nach VDI 2206 wurde das Projekt realisiert. Dabei wirde die Hauptfunktion in Teilfunktionen zerlegt. Die Teilfunktionen werden analysiert und dabei Problemlösungen definiert. Mit Hilfe eines morphologischen Kastens werden die Lösungen gruppiert. Anschließend wird eine Nutzwertanalyse zur Bewertung der einzelnen Problemlösungen herangeführt und daraus die Lösung generiert.
Projektplan
Der Abbildung 4 kann der Projektplan entnommen werden. Dieser beschreibt den Arbeitsablauf zu diesem Projekt und lässt sich folgendermaßen gliedern:
- Phase 1: Planung und Vorbereitung
- Recherche möglicher Konzepte und Teillösungen: Mit Hilfe von Literatur und Internet werden Ideen generiert, die zur Haupt- und Teilfunktionsbeschreibung führen. Aus den Teilfunktionen werden Problemlösungen generiert.
- Vorläufige Konzepterstellung: Die Teillösungen werden gruppiert und bewertet. Die höchst-bewerteten Teillösungen fließen in das Konzept ein.
- Stücklistenerstellung und Bestellung: Nach der Erstellung des Konzeptes, werden Bauteile gesucht. Eine Liste wird zum fixen Termin ausgehändigt.
- Phase 2: Durchführung
- Software-Recherche: Benötigte Bibliotheken werden gesucht und analysiert. Im Internet bestehende Beispiele helfen bei der Analyse der Bibliotheken.
- Softwaregenerierung: Implementierung und Evaluation der Software wird nacheinander durchgeführt. Fehler werden analysiert und behoben. Mit fortschreitender Implementierung generieren sich neue wechselwirkende Fehler, die zur Softwareanpassungen führen.
- Konstruktion der Bauteile: Mit Hilfe von SolidWorks werden Bauteile konstruiert und in einer Baugruppe zusammengefügt. Hierbei werden die Möglichkeiten des 3D-Drucks beachtet.
- Layout der Schaltung: Nach umfassender Analyse und Simulation auf dem Steckbrett hat sich herausgestellt, dass die Schaltung sehr einfach ist und daher auch ohne großen Aufwand in die Konstruktion implementiert wurde.
- Fertigung der Platine: Es wurde von dem Plot der Platine abgesehen, da der Aufwand bei der einfachen Schaltung größer gewesen wäre. Eine Streifenraster-Platine im passenden Zuschnitt wurde eingesetzt.
- Bestückung der Platine und Verkabelung:
- Fertigung der Bauteile: Die eigens konstruierten Bauteile wurden mit Hilfe von additiven Verfahren erstellt. Dabei wurde ein 3D-Drucker und das PLA-Filament verwendet.
- Phase 3: Evaluation
- Testung der Schaltung: Die Schaltung wurde für eine längere Zeit in Betrieb genommen.
- Testung der Software: Die Software wurde für eine längere Zeit in Betrieb genommen
- Dokumentation: Die Dokumentation wurde nach wissenschaftlichen Maßstab durchgeführt und liegt im SVN-Ordner vor.
Projektdurchführung
Die Projekte werden in Gruppen bearbeitet. Aufgaben werden auf die Team-Mitglieder aufgeteilt. Dieses Projekt wurde in die Bereiche Hardware und Software aufgeteilt. Nachfolgend werden diese beschrieben
Hardware
Software
Die Software, geschrieben in C und C++ mit Hilfe der Arduino IDE und externen Bibliotheken, beschreibt zwei Teile. Ein Teil implementiert die Steuerung der Innenstation, bestehend aus dem Rheinturm. Die Funktionen der Außenstation werden mit dem zweiten Teil erreicht. Folgend werden einige wichtige Abschnitte der Programmierung beschrieben.
Innenstation: Die Innenstation benutzt beide Kerne. Mit Hilfe des folgenden Code-Abschnittes kann das Multithreading implementiert werden:
//global:
TaskHandle_t Task1, Task2; // Task-Handle
SemaphoreHandle_t baton; // Typ zur Übergaberegulierung
// in void Setup():
baton = xSemaphoreCreateMutex();
xTaskCreatePinnedToCore( // Gebe Aufgabe an definierten Kern:
weatherStation, // Functionname
"weatherStation", // taskName
2000, // Stack-Größe
NULL, // Parameter
1, // Priorität
&Task1, // Task-Handle
1); // CORE 1
// LOOP #2
void weatherStation( void * parameter ) // weatherStation wird, wie void loop in Kern 1 bearbeitet
{
for (;;) // Dauerschleife
{
xSemaphoreTake(baton, portMAX_DELAY); // Nimm den Übergabetypen
xSemaphoreGive(baton); // Gebe den Übergabetypen direkt ab.
//… Weiterer Code
}
}
Die Methode xTaskCreatePinnedToCore kreiert einen Aufgabenabschnitt für einen definierten Kern. Welche Aufgabe und welcher Kern, sowie, wieviel Speicherplatz und Funktionsparameter sowie die Priorität werden der Parameterliste, wie zu sehen, hinzugefügt. Der Übergabetyp reguliert, ob die Kerne gleichzeitig oder nacheinander arbeiten sollen. In diesem Beispiel arbeiten die Kerne gleichzeitig, da der Übergabetyp direkt zurückgegeben wird. Damit die Kerne nacheinander arbeiten, muss der Übergabetyp am Ende der Funktionen überegeben werden. Der Task weatherStation widmet sich der Auslesung des DHT22-Sensors, des Startens einer Verbindung zur Außenstation, der Verbindung mit WiFi nachdem die Werte der Außenstation empfangen wurden und dem Senden der Wetterdaten an einen Webserver.
Programmierung der Sensorik:
// includes
#include <DHT.h> // Bibliothek des Sensors (zu finden: Github)
//defines und globals
#define DHTPIN 15 // Angabe des digitalen Inputs für den Single-Bus
#define DHTTYPE DHT22 // Typdefinition für die Bibliothek
DHT dht(DHTPIN, DHTTYPE); // Konstruktor des Sensors
// Setup
dht.begin(); // Initialisierung des Sensors
// Auslesung
temp = dht.readTemperature(); // Auslesen der Temperatur (float)
hum = dht.readHumidity(); // Auslesen der Luftfeuchtigkeit (float)
Mit gegebener Bibliothek lässt sich die Sensorik einfach implementieren. Auf gleiche Art wird auch der Drucksensor der Außenstation programmiert. Dabei wird nur eine andere Bibliothek verwendet.
Verbindung zur Außenstation:
// includes
#include <esp_now.h>
// defines
#define CHANNEL 1 // Gleiches Channel wird bei der Innen- und Außenstation verwendet.
// Init-Methode
void InitESPNow() // Initialisierung des ESP-Now Protokolls mit Fallback
{
WiFi.disconnect();
if (esp_now_init() != ESP_OK)
{ ESP.restart(); } // Wenn Initialisierung fehlgeschlagen, Neustart
// Konfigurieren der Verbindung
void configDeviceAP() // config AP SSID
{
char* SSID = "Slave_1"; // der von der Außenstation (master) gesuchter Name ist diese SSID
bool result = WiFi.softAP(SSID, "Slave_1_Password", CHANNEL, 0);
…
// Datenempfangen
esp_now_register_recv_cb(OnDataRecv); //OnDataRecv ist hierbei der Callback.
// Von master empfangene Daten sind in der Parameterliste gelistet
void OnDataRecv(const uint8_t *mac_addr, const uint8_t *data, int data_len)
{ …… }
Das ESP-NOW Protokoll wird von dem WiFi gestört und muss daher für die Zeit der Kommunikation mit der Außenstation getrennt werden. Nach dem Empfang wird wieder eine WiFi-Verbindung erstellt. Nach der Initialisierung erfolgt ein ähnliches Vorgehen, wie bei der Erstellung einer WiFi-Verbindung. Der wichtige Part hierbei ist die Definition der SSID, die der Außenstation bekannt sein muss. Der Callback ist eine Funktion, die die Daten der Außenstation, als Parameter übergeben bekommt. data zeigt dabei auf die Wetterdaten und kann auch auf den Anfang eines Arrays zeigen.
Hiernach wird die WiFi Verbindung aufgebaut, mit dessen Hilfe ein html-Code geschrieben werden kann, der den Webserver beschreibt.
client.print("<html><head><title> ESP32 Weather Station</title>");
client.print("<meta http-equiv=\"refresh\" content=\"15\">\";</head></html>");
client.print("<body bgcolor=\"#E6E6FA\"><h1 style=\"text-align: center; color: blue\"> ESP32 Weather Station </h1>");
client.print("<p style=\"text-align: center; font-size:150% \">Zeitstempel: ");
client.print(formattedTime);
Der Client ist hierbei ein Objekt der Klasse WiFiClient der Bibliothek WiFi. Mit Hilfe einer Präprozessor-Direktive wird jedoch in dem Bereich Webserver ein Unterschied realisiert. Im obigen Beispiel wird auf einfachste Weise ein Webserver selbst geschrieben. Für Anwendungen, wie eine Wetter Station gibt es Möglichkeiten einen host, also einen bereitgestellten Webserver mit einem schönem Design zu verwenden, wie Abbildung 5 zeigt.
Die Zeit wird einem NPT-Server entnommen. NPT-Server können über das Internet erreicht werden. Sie kommunizieren mit vielen Systemen die Systemzeit.Die Zeitdarstellung erfolgt mit Hilfe der Bibliothek FastLED. Nach eine Initialisierung des LED-Objektes, kann der Datenbus, als ein Array des LED-Objektes aufgenommen werden wobei die LED-Position der Array-Position gleicht und folgendermaßen geschrieben werden kann: leds[2] = CRGB(48, 48, 48);. Dieses Beispiel gibt dem LED-Streifen an, dass seine zweite LED weiß, mit einer gedimmten Helligkeit leuchten soll.
Die Außenstation Die Außenstation verwendet zwei Sensoren. Einen DHT22 für die Temperatur- und Luftfeuchtigkeitsmessung, und einen BMP180 für die Druckmessung. Da die Außenstation Mit Batterien betrieben wird, bedarf es der Deep-Sleep Funktion, die die Peripherie und die beiden Xtensa-Prozessoren abschaltet. Im wachen Zustand verbring die Station nur wenige Sekunden. Dabei werden Daten von den Sensoren gelesen und via des ESP-Now Protokolls an die Innenstation verschickt. Wie oft die Daten Transferiert werden sollen, kann man im Programm-Code definieren. Die Daten werden als Byte-Päckchen verschickt. Jeder andere Typ muss somit zunächst als ein Byte-Array definiert werden.
Ergebnis
Zusammenfassung
Lessons Learned
Projektunterlagen
YouTube Video
Weblinks
Literatur
--- → zurück zur Übersicht: WS 18/19: Angewandte Elektrotechnik (BSE)