Projekt 91: Decimal Clock Tower

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Abbildung 1: Rheinturm in Düsseldorf, Quelle: https://fi.wikipedia.org/wiki/Rheinturm#/media/File:Rheinturm_uhrzeit.jpg

Autoren: Eugen Preger, Rudi Sugandi
Betreuer: Daniel Klein

→ zurück zur Übersicht: WS 18/19: Angewandte Elektrotechnik (BSE)

Thema

Das Model des Rheinturms aus Abbildung 1 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

Abbildung 2: Blockschaltbild des ESP32, Quelle: http://esp32.net/

Wie der Abbildung 2 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

Abbildung 3: Technische Darstellung des DHT22, Quelle: https://akizukidenshi.com/

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. Abbildung 3 stellt den Sensor dar.

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

Abbildung 4: Draufsicht BMP180, Quelle: https://www.amazon.com/

Der BMP180 aus Abbildung 4 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

Abbildung 5: Projektablaufplan für Projekt 91

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


Konstruktion

Abbildung 6: CAD-Konstruktion des Decimal Clock Towers nach Vorbild des Rheinturms

Die Konstruktion des Decimal Clock Towers erfolgt mit Solidworks. Als Vorlage dient der in Düsseldorf stehende Rheinturm. Dieser wird möglichst Maßstabsgetreu verkleinert. Dabei ist ein Mindestquerschnitt und Mindestlänge des Turmschaftes zu berücksichtigen, der ein LED Stripe mit 44 LEDs, sowie Versorgungsleitungen beherbergt. Die Kontur der Antennenplattformen und sonstige Wandstärken dürfen ebenfalls nicht zu dünn werden, um spätere Stabilitätsprobleme zu vermeiden. Die in diesem Projekt aufzubauende Wetterstation soll ebenfalls nach Möglichkeit in der Turmkanzel untergebracht werden. Entschieden wurde sich für einen Maßstab von ca. 1:455. Die Gesamthöhe des Turmes beträgt bei gewähltem Maßstab ca. 53 cm. Da die Fertigung mit einem 3D-Drucker geplant ist und der maximale Bauraum begrenzt ist, wird der Turm in mehreren Segmenten geteilt. Ein weiterer Grund zur Teilung des Turmes stellen die Überhänge an der Konstruktion dar. Die Teilstücke sind so zu konstruieren, dass sie sich nach der Fertigung einfach zusammenfügen lassen. Für den 3D-Druck geeignetes Dateiformat ist das STL-Format. Hierbei handelt es sich um ein reines Volumenmodell, ohne jegliche Information über die verwendeten Skizzen und Features bei SolidWorks. Da dieses Projekt eine Wetterstation mit Außeneinheit beinhaltet, wird ein weiteres Gehäuse für die Außeneinheit benötigt. Auf der Seite thingiverse.com findet man zahlreiche vorkonstruierte Gehäuse, welche direkt gedruckt werden können.

Fertigung

Die Fertigung des Decimal Clock Towers erfolgt mit einem 3D-Drucker. Vor dem eigentlichen Druckvorgang muss die zuvor erstellte STL-Datei mit einer Slicer-Software geöffnet werden. In dieser Software wird der Bauraum des verwendeten 3d-Druckers dargestellt. Das Volumenmodell kann innerhalb des Bauraums beliebig positioniert und gedreht werden. Bei der Ausrichtung des Volumenmodells sind Überhänge und Auskragungen nach Möglichkeit zu vermeiden. Neben der Ausrichtung des Modells kann u.a. die Schichtdicke und der Füllungsgrad des Körpers eingestellt werden, was großen Einfluss auf Qualität, Materialverbrauch und Druckzeit hat. Schließlich wird eine Datei im GCODE-Format erzeugt, welche vom 3d-Drucker verarbeitet werden kann. Im GCODE sind sämtliche Informationen enthalten über zu befahrene Koordinatenpunkte, Fahrgeschwindigkeit des Druck-Schlittens, Temperatur des Extruders, Temperatur der Druckplatte und Lüftergeschwindigkeit. Zum Ausdrucken des Decimal Clock Towers wird ein Flyingbear P905X eingesetzt. Durch seinen relativ großen Bauraum von 280 * 240 * 350 mm kann der Turmschaft in einem Stück gedruckt werden.

Platinenlayout

Abbildung 7: Schaltplan des Decimal Clock Towers
Abbildung 8: Platinenentwurf des Decimal Clock Towers

Für die Beleuchtung des Turmschaftes, sowie für den Betrieb der Wetterstation ist eine elektronische Schaltung aufzubauen. Um den Aufbau zu dokumentieren, wird ein Schaltplan erstellt. Zum Schaltplan wird eine Platine gelayoutet. Da ausschließlich THT-Bauteile zum Einsatz kommen, lohnt sich das individuelle Layouten mit Multisim/Ultiboard und anschließendes Fräsen oder Ätzen der Platine nicht. Darum wird klassisch eine Streifenrasterplatine passend zugeschnitten und für die Verdrahtung der Bauteile verwendet. Der Schaltplan sowie der Platinenentwurf wird mit der Software Fritzing erstellt.

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 9 zeigt.

Abbildung 9: Beispiel einer Webserver Vorlage BMP180, Quelle: https://thingspeak.com/

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 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

Das Projektergebnis war es eine Wetterstation in Form des Rheinturms darzustellen. Dieses wurde in sofern erfüllt, dass es den Erwartungen entspricht. Mit weiterer Entwicklungszeit kann daraus ein Verkaufsfertiges Produkt generiert werden.

Zusammenfassung

Zunächst wurde ein Projektplan erstellt. Es folgte ein Konzept. Bauteile wurden mit Hilfe von SolidWorks konstruiert und mit dem 3D-Drucker gedruckt. Die Software wurde mit Hilfe der Arduino IDE auf den ESP32 gespielt. Die Platinen wurden gefertigt und im Anschluss wurde alles zusammengefügt und evaluiert.

Lessons Learned

Im Verlauf des Projektes kam es zu einigen unvorhergesehenen Problemen, die einen immer mehr gefordert haben. In der Software hat das Zusammenspiel der Funktionen, die im einzeln problemlos funktionierten, nicht immer geklappt sodass weitere Analyse und das Debugen von Programmcode nötig waren. Die Sensorik bekommt im Zusammenspiel mit dem WLAN einen Messausfall. Ein Hardwareproblem, bei der Außenstation hat zum Ausfall geführt. Diese Problematik wurde als Herausforderung angesehen und damit das Verhalten bei Problemen geübt. Das Programmieren sowie das 3D-Drucken wurde im Laufe der Arbeit vertieft. Diese Projekt fast sehr praxisnah die Aufgaben eines Ingenieurs zusammen.

Projektunterlagen

YouTube Video

Weblinks

http://esp32.net/ https://akizukidenshi.com/download/ds/aosong/AM2302.pdf https://www.amazon.com/Barometric-Pressure-Compatible-Atomic-Market/dp/B00TMJP4JC https://github.com/benwaa/Arduino/blob/master/moisture_to_thingspeak/moisture_to_thingspeak.ino https://github.com/HarringayMakerSpace/ESP-Now https://www.instructables.com/id/ESP32-With-ESP-Now-Protocol/ https://weblogs.asp.net/dwahlin/creating-a-line-chart-using-the-html-5-canvas https://thingspeak.com/ https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/network/esp_now.html https://github.com/HarringayMakerSpace/ESP-Now https://github.com/G6EJD/ESP32-Weather-Forecaster/blob/master/ESP32_WX_FORE_SCROLL_096_SSD1306_01.ino https://www.instructables.com/id/ESP32ESP8266-Weather-ForecasterPredictor/ https://cdn-shop.adafruit.com/datasheets/BST-BMP180-DS000-09.pdf https://lastminuteengineers.com/esp32-dht11-dht22-web-server-tutorial/

Literatur


→ zurück zur Übersicht: WS 18/19: Angewandte Elektrotechnik (BSE)