Smart Coaster: Unterschied zwischen den Versionen
Zeile 167: | Zeile 167: | ||
Der erste Struct wurde für die Temperatur angelegt und enthält den ADC Wert, die Temperatur in Celsius, den Pin an dem der Sensor angeschlossen ist und den Maximalen ADC Wert. | Der erste Struct wurde für die Temperatur angelegt und enthält den ADC Wert, die Temperatur in Celsius, den Pin an dem der Sensor angeschlossen ist und den Maximalen ADC Wert. | ||
/* Temperatur */ | |||
struct TEMP { | struct TEMP { | ||
uint16_t AdcValue = 0; | uint16_t AdcValue = 0; /* ADC Wert 0 bis 4096 */ | ||
float Celsius = 0; | float Celsius = 0; /* Temperatur in °C */ | ||
const uint8_t Pin = 4; | const uint8_t Pin = 4; /* Pin an dem der Temperatur Sensor angeschlossen ist */ | ||
const float Max = 4096.0; | const float Max = 4096.0; /* Maxmium des ADC (12bit Auflösung) */ | ||
} Temp; | } Temp; | ||
Der nächste Struct ist für die LED Steuerung. Wenn die FastLED Libary verwendet wird kann kein Struct verwendet werden, da die Libary mit diesem Typen nicht umgehen kann. | Der nächste Struct ist für die LED Steuerung. Wenn die FastLED Libary verwendet wird kann kein Struct verwendet werden, da die Libary mit diesem Typen nicht umgehen kann. | ||
Bei der NeoPixelBus Libary kann ein Struct verwendet werden. Dieser Struckt enthält die Anzahl der Leuchtdioden und den Pin an dem die Leuchtdioden angeschlossen sind. | Bei der NeoPixelBus Libary kann ein Struct verwendet werden. Dieser Struckt enthält die Anzahl der Leuchtdioden und den Pin an dem die Leuchtdioden angeschlossen sind. | ||
/* Leuchtdioden */ | |||
#ifdef FASTLED | #ifdef FASTLED | ||
const uint8_t Number = 4; | const uint8_t Number = 4; /* Anzahl der Leuchtdioden */ | ||
const uint8_t Pin = 16; | const uint8_t Pin = 16; /* Pin an dem der Leuchtdiodenstreifen angeschlossen ist */ | ||
CRGB leds[Number]; /* Wird von der FastLED Libary benötigt */ | |||
#else | #else | ||
struct LED { | struct LED { | ||
const uint8_t Number = 4; | const uint8_t Number = 4; /* Anzahl der Leuchtdioden */ | ||
const uint8_t Pin = 16; | const uint8_t Pin = 16; /* Pin an dem der Leuchtdiodenstreifen angeschlossen ist */ | ||
} Led; | } Led; | ||
NeoPixelBrightnessBus<NeoRgbFeature, Neo800KbpsMethod> strip(Led.Number, Led.Pin); /* Wird von der NeoPixelBus Libary benötigt */ | |||
RgbColor red(0, 255, 0); /* Sind GRB LEDs */ | |||
RgbColor violet(130, 238, 238); | |||
RgbColor blue(0, 0, 255); | |||
#endif | #endif | ||
Die nächsten Variable ist eine Konstante für die Baudrate der Seriellen Schnittstelle. | Die nächsten Variable ist eine Konstante für die Baudrate der Seriellen Schnittstelle. | ||
/* Serielle Schnittstelle */ | |||
#ifdef DEBUG | #ifdef DEBUG | ||
const uint16_t BaudRate = 115200; | const uint16_t BaudRate = 115200; /* Baudrate der Seriellen Schnittstelle */ | ||
#endif | #endif | ||
Deepsleep/Tiefschlaf länge des Mikrocontrollers wird als Konstante festgelegt. | |||
/* Deepsleep */ | |||
const uint32_t Delay = 1000000; /* Zeit zwischen Deepsleep Wakeup in us */ | const uint32_t Delay = 1000000; /* Zeit zwischen Deepsleep Wakeup in us */ | ||
===== Funktionen ===== | ===== Funktionen ===== | ||
Hier wurden die Funktionen definiert. | Hier wurden die Funktionen definiert. | ||
/* Funktionen */ | /* Funktionen */ | ||
float Calc_Temp(uint16_t Raw, float Max); | float Calc_Temp(uint16_t Raw, float Max); /* Berechnung der Temperatur aus dem ADC Wert */ | ||
void Set_LED(uint8_t Percent, uint8_t Threshold0, uint8_t Threshold1, uint8_t Brightness); | void Set_LED(uint8_t Percent, uint8_t Threshold0, uint8_t Threshold1, uint8_t Brightness); /* Farbe der Leuchtdioden einstellen */ | ||
===== Setup ===== | ===== Setup ===== | ||
Zeile 221: | Zeile 222: | ||
void setup() | void setup() | ||
{ | { | ||
/* | /* Seriale Schnittstelle initialisieren */ | ||
#ifdef DEBUG | #ifdef DEBUG | ||
Serial.begin(BaudRate); | Serial.begin(BaudRate); /* Start mit BaudRate */ | ||
#endif | #endif | ||
/* | /* Leuchtdiode initialisieren */ | ||
#ifdef FASTLED | #ifdef FASTLED | ||
FastLED.addLeds<WS2812B, Pin, GRB>(leds, Number); | FastLED.addLeds<WS2812B, Pin, GRB>(leds, Number); /* Leuchtdioden Streifen initialisieren */ | ||
FastLED.setBrightness(Brightness); | FastLED.setBrightness(Brightness); /* Helligkeit setzen */ | ||
FastLED.show(); /* Einstellungen an Leuchtdioden schicken */ | |||
#else | #else | ||
strip.Begin(); | strip.Begin(); /* Leuchtdioden Streifen initialisieren */ | ||
strip. | strip.SetBrightness(Brightness); /* Helligkeit setzen */ | ||
strip. | strip.Show(); /* Einstellungen an Leuchtdioden schicken */ | ||
#endif | #endif | ||
/* Deepsleep initialisieren */ | |||
#ifdef SLEEP | #ifdef SLEEP | ||
esp_sleep_enable_timer_wakeup(Delay); /* Aktiviert den Deepsleep Wakeup Timer */ | esp_sleep_enable_timer_wakeup(Delay); /* Aktiviert den Deepsleep Wakeup Timer */ | ||
Zeile 257: | Zeile 260: | ||
{ | { | ||
/* Temperaturmessung */ | /* Temperaturmessung */ | ||
Temp.AdcValue = analogRead(Temp.Pin); | Temp.AdcValue = analogRead(Temp.Pin); /* Spannung in ADC Wert umwandeln */ | ||
Temp.Celsius = Calc_Temp(Temp.AdcValue, Temp.Max); | Temp.Celsius = Calc_Temp(Temp.AdcValue, Temp.Max); /* ADC Wert in Temperatur umwandeln */ | ||
/* | /* Leuchtdiode einstellen */ | ||
Set_LED(Temp.Celsius, 15, 45, Brightness); | Set_LED(Temp.Celsius, 15, 45, Brightness); /* Leuchtdioden ansteuern */ | ||
/* | /* Seriale Übertragung (Debug) */ | ||
#ifdef DEBUG | #ifdef DEBUG | ||
Serial.print(Temp.AdcValue); | Serial.print(Temp.AdcValue); /* ADC Wert übertragen */ | ||
Serial.print("\t"); | Serial.print("\t"); /* Tab als Trennung */ | ||
Serial.println(Temp.Celsius); | Serial.println(Temp.Celsius); /* Temperatur übertragen */ | ||
#endif | #endif | ||
/* | /* Deepsleep */ | ||
#ifdef SLEEP | #ifdef SLEEP | ||
esp_deep_sleep_start(); | esp_deep_sleep_start(); /* Deepsleep starten */ | ||
#endif | #endif | ||
} | } | ||
Zeile 287: | Zeile 290: | ||
float Millivolt = 0; | float Millivolt = 0; | ||
float Celsius = 0; | float Celsius = 0; | ||
Millivolt = (Raw / Max) * 5000; | Millivolt = (Raw / Max) * 5000; /* Berechnung der Spannung */ | ||
Celsius = Millivolt / 10; | Celsius = Millivolt / 10; /* Berechnung der Temperatur */ | ||
return Celsius; | return Celsius; | ||
} | } | ||
Zeile 308: | Zeile 311: | ||
void Set_LED(uint8_t Data, uint8_t Threshold0, uint8_t Threshold1, uint8_t Brightness) | void Set_LED(uint8_t Data, uint8_t Threshold0, uint8_t Threshold1, uint8_t Brightness) | ||
{ | { | ||
if (Data < Threshold0) | /* Werte für die Übermittlung an die Leuchtdiode vorberieten */ | ||
if (Data < Threshold0) /* Kleiner erste Schwelle -> Leuchtdiode blau */ | |||
{ | { | ||
#ifdef FASTLED | #ifdef FASTLED | ||
fill_solid(leds, Number, CRGB::Blue); | fill_solid(leds, Number, CRGB::Blue); /* Alle Leuchtidoden blau */ | ||
#else | #else | ||
strip.SetPixelColor(0, blue); | strip.SetPixelColor(0, blue); /* Leuchtdiode 1 blau */ | ||
strip.SetPixelColor(1, blue); | strip.SetPixelColor(1, blue); /* Leuchtdiode 2 blau */ | ||
strip.SetPixelColor(2, blue); | strip.SetPixelColor(2, blue); /* Leuchtdiode 3 blau */ | ||
strip.SetPixelColor(3, blue); | strip.SetPixelColor(3, blue); /* Leuchtdiode 4 blau */ | ||
#endif | #endif | ||
} | } | ||
else if (Data < Threshold1) | else if (Data < Threshold1) /* Kleiner zweite Schwelle -> Leuchtdiode violet */ | ||
{ | { | ||
#ifdef FASTLED | #ifdef FASTLED | ||
fill_solid(leds, Number, CRGB::Violet); | fill_solid(leds, Number, CRGB::Violet); /* Alle Leuchtidoden violet */ | ||
#else | #else | ||
strip.SetPixelColor(0, violet); | strip.SetPixelColor(0, violet); /* Leuchtdiode 1 violet */ | ||
strip.SetPixelColor(1, violet); | strip.SetPixelColor(1, violet); /* Leuchtdiode 2 violet */ | ||
strip.SetPixelColor(2, violet); | strip.SetPixelColor(2, violet); /* Leuchtdiode 3 violet */ | ||
strip.SetPixelColor(3, violet); | strip.SetPixelColor(3, violet); /* Leuchtdiode 4 violet */ | ||
#endif | #endif | ||
} | } | ||
else | else /* Größer zweite Schwelle -> Leuchtdiode rot */ | ||
{ | { | ||
#ifdef FASTLED | #ifdef FASTLED | ||
fill_solid(leds, Number, CRGB::Red); | fill_solid(leds, Number, CRGB::Red); /* Alle Leuchtidoden rot */ | ||
#else | #else | ||
strip.SetPixelColor(0, red); | strip.SetPixelColor(0, red); /* Leuchtdiode 1 rot */ | ||
strip.SetPixelColor(1, red); | strip.SetPixelColor(1, red); /* Leuchtdiode 2 rot */ | ||
strip.SetPixelColor(2, red); | strip.SetPixelColor(2, red); /* Leuchtdiode 3 rot */ | ||
strip.SetPixelColor(3, red); | strip.SetPixelColor(3, red); /* Leuchtdiode 4 rot */ | ||
#endif | #endif | ||
} | } | ||
/* Eingestellte Werte an Leuchtdiode schicken */ | |||
#ifdef FASTLED | #ifdef FASTLED | ||
FastLED.setBrightness(Brightness); | FastLED.setBrightness(Brightness); /* Helligkeit der Leuchtdioden einstellen */ | ||
FastLED.show(); | FastLED.show(); /* Einstellungen übertragen */ | ||
#else | #else | ||
strip.SetBrightness(Brightness); | strip.SetBrightness(Brightness); /* Helligkeit der Leuchtdioden einstellen */ | ||
strip.Show(); | strip.Show(); /* Einstellungen übertragen */ | ||
#endif | #endif | ||
} | } |
Version vom 22. Dezember 2020, 15:56 Uhr
Autor: Michael Menke
Betreuer: Prof. Schneider
→ zurück zur Übersicht: WS 20/21: Angewandte Elektrotechnik (BSE)
Einleitung
Smart Coaster soll ein Bierdeckel sein, welcher Informationen über das darüber befindliche Getränk visuell an den Nutzer weitergibt.
Eine wichtige Information über ein Getränk ist die Temperatur, sowohl bei heißen wie auch bei kalten Getränken. Diese soll mit Hilfe einer mehr farbigen Leuchtdiode dem Nutzer angezeigt werden. Das System soll relativ kompakt sein und einen intern verbauten Akku haben.
Anforderungen
- Temperaturen von 0°C bis 70°C erkennen
- Mehrfarbige LEDs aufleuchten lassen
- Ein- und Ausschalter besitzen
- Stromversorgung über Akku
- Aufladen des Akkus über USB
- Spritzwassergeschützt
Funktionaler Systementwurf/Technischer Systementwurf
Komponentenspezifikation
Anzahl | Name | Link | Anmerkung | Vorhanden |
---|---|---|---|---|
1 | ESP32 D1 Mini | Link | Kompaktes Board mit Modulunterstützung | Ja |
1 | LiPo Batterie | Link | Schutzschaltung integriert | Ja |
1 | Batterie Shield | Link | D1 Mini Modul | Ja |
1 | Temperatur Sensor LM35CAZ | Link | TO-92-3 Gehäuse | Ja |
4 | Leuchtdiode WS2812B | Link | Strip mit 30 Led/m | Ja |
1 | Schiebschalter | Link | Zwei Positionen | Ja |
1 | 3D Gehäuse | Link | Wird von der Hochschule gedruckt | Ja |
Umsetzung (HW/SW)
Vorerst Ideen Sammlung für die Umsetzung! Wird noch bis zum Projekt Ende überarbeitet.
Hardware
Stückliste
Verdrahtung
Gehäuse
Zusammenbau
Software
Die Software für dieses Projekt wurde mit der Arduino IDE erstellt.
Einrichtung Arduino IDE
Bei der Einrichtung der Arduino IDE muss man den ESP32 und Libarys einbinden.
Arduino IDE für ESP32 vorbereiten
Man muss die Arduino IDE mit den Boardverwalter-URL von dem ESP32 erweitern. Dafür muss man unter Datei -> Voreinstellungen das Feld "Zusätzliche Boardverwalter-URLs" mit diesem Link erweitern. (Siehe Abb. 3 und Abb. 4)
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Weitere Informationen zu den Boardverwalter-URL gibt es hier.
Benötigte Libarys in die Arduino IDE einbinden
Um eine Libary in die Arudino IDE einzubinden geht man in das Menü "Bibliotheken verwalten..." unter Sketch -> Bibliothek einbinden -> Bibliotheken verwalten... (Siehe Abb. 5)
Nun öffnet sich der "Bibliotheksverwalter" mit dem man die Bibliotheken installieren kann. Für dieses Projekt wird FastLED 3.3.3 und NeoPixelBus 2.6.0 benötigt. (Siehe Abb. 6)
Porgrammablaufsplan
Das Programm besteht aus zwei Hauptfunktionen. Dieser Aufbau ist Typisch für Embedded Lösungen.
Die erste Funktion ist die Initialisierung des Systems und die Zweite Funktion die Endlosschleife Loop.
In dem Setup wird die Serielle Schnittstelle, die Leuchtdioden und der Deepsleep initialisiert.
Im Loop wird die Spannung des Temperatur Sensors gemessen, dann in Grad Celsius umgewandelt und dann die Leuchtdioden angesteuert. Danach verfällt der Mikrocontroller in einen Schlafzustand.
Der Programmablauf hat sich zum Systementwurf nicht verändert und wurde so in dem Quellcode umgesetzt.
Quellcode
Der Quellcode, welcher auf dem Mikrocontroller ausgeführt wird mit Erläuterungen.
Der Quellcode befindet sich im SVN.
Header
/* Datei: Smart_Coaster.ino Autor: Michael Menke michael.menke@stud.hshl.de Erstellung: 17.10.2020 Letzte Änderung: 06.12.2020 Implementation: Arduino Funktion: Ein Analoger Temperatur Sensor wird mit hilfe des ADCs eingelesen. Dieser Wert wird dann in eine Temperatur in Grad Celsius umgewandelt. Dieser Wert entscheidet, dann in welcher Farbe die LEDs leuchten. Hardware: Mikrocontroller: ESP32 Temperatur Sensor: LM35CAZ Leuchtdiode: WS2812b */
Preprocessor Defines
Mit diesen Defines kann man entscheiden, ob die Serielle Debug Schnittstelle eingeschaltet wird, welche LED Libary man verwendet und ob der Deepsleep verwendet wird.
Wenn DEBUG definiert ist wird die Serielle Schnittstelle mit einer Baudrate von 9600 initialisiert und bei jedem Loop wird eine Debug Nachricht ausgegeben.
Wenn FASTLED definiert ist wird die FastLED Libary zur Steuerung der Leuchtdioden verwenden. Falls dieses nicht definiert ist wird die NeoPixelBus Libary verwendet.
Wenn SLEEP definiert ist wird die Deepsleep Funktion des Mikrocontrollers verwendet.
/* PREPROCESSOR DEFINES */ #define DEBUG /* Serielle Ausgabe Baud 115200 */ #define FASTLED /* FastLED Lib verwenden -> Alternative NeoPixelBus Lib*/ #define SLEEP /* Deepsleep aktivieren */
Includes
Einbinden der Libarys für die Leuchtdioden Steuerung. Weitere Informationen zu den Libarys findet man hier:
/* Includes */ #ifdef FASTLED #include "FastLED.h" #else #include "NeoPixelBrightnessBus.h" #endif
Variablen
Hier werden die Variablen angelegt. Dabei wurden Structs verwendet, damit die Software übersichtlich bleibt.
Der erste Struct wurde für die Temperatur angelegt und enthält den ADC Wert, die Temperatur in Celsius, den Pin an dem der Sensor angeschlossen ist und den Maximalen ADC Wert.
/* Temperatur */ struct TEMP { uint16_t AdcValue = 0; /* ADC Wert 0 bis 4096 */ float Celsius = 0; /* Temperatur in °C */ const uint8_t Pin = 4; /* Pin an dem der Temperatur Sensor angeschlossen ist */ const float Max = 4096.0; /* Maxmium des ADC (12bit Auflösung) */ } Temp;
Der nächste Struct ist für die LED Steuerung. Wenn die FastLED Libary verwendet wird kann kein Struct verwendet werden, da die Libary mit diesem Typen nicht umgehen kann. Bei der NeoPixelBus Libary kann ein Struct verwendet werden. Dieser Struckt enthält die Anzahl der Leuchtdioden und den Pin an dem die Leuchtdioden angeschlossen sind.
/* Leuchtdioden */ #ifdef FASTLED const uint8_t Number = 4; /* Anzahl der Leuchtdioden */ const uint8_t Pin = 16; /* Pin an dem der Leuchtdiodenstreifen angeschlossen ist */
CRGB leds[Number]; /* Wird von der FastLED Libary benötigt */ #else struct LED { const uint8_t Number = 4; /* Anzahl der Leuchtdioden */ const uint8_t Pin = 16; /* Pin an dem der Leuchtdiodenstreifen angeschlossen ist */ } Led;
NeoPixelBrightnessBus<NeoRgbFeature, Neo800KbpsMethod> strip(Led.Number, Led.Pin); /* Wird von der NeoPixelBus Libary benötigt */ RgbColor red(0, 255, 0); /* Sind GRB LEDs */ RgbColor violet(130, 238, 238); RgbColor blue(0, 0, 255); #endif
Die nächsten Variable ist eine Konstante für die Baudrate der Seriellen Schnittstelle.
/* Serielle Schnittstelle */ #ifdef DEBUG const uint16_t BaudRate = 115200; /* Baudrate der Seriellen Schnittstelle */ #endif
Deepsleep/Tiefschlaf länge des Mikrocontrollers wird als Konstante festgelegt.
/* Deepsleep */ const uint32_t Delay = 1000000; /* Zeit zwischen Deepsleep Wakeup in us */
Funktionen
Hier wurden die Funktionen definiert.
/* Funktionen */ float Calc_Temp(uint16_t Raw, float Max); /* Berechnung der Temperatur aus dem ADC Wert */ void Set_LED(uint8_t Percent, uint8_t Threshold0, uint8_t Threshold1, uint8_t Brightness); /* Farbe der Leuchtdioden einstellen */
Setup
Die Setup Funktion, welche den Mikrocontroller initialisiert.
/* Wird bei start des Mikrocontrollers einmal ausgeführt und initialisiert die Leuchtdioden. Im Debug fall wird auch noch die Serielle Schnittstelle initialisiert. Input: - Output: - */ void setup() { /* Seriale Schnittstelle initialisieren */ #ifdef DEBUG Serial.begin(BaudRate); /* Start mit BaudRate */ #endif /* Leuchtdiode initialisieren */ #ifdef FASTLED FastLED.addLeds<WS2812B, Pin, GRB>(leds, Number); /* Leuchtdioden Streifen initialisieren */ FastLED.setBrightness(Brightness); /* Helligkeit setzen */ FastLED.show(); /* Einstellungen an Leuchtdioden schicken */ #else strip.Begin(); /* Leuchtdioden Streifen initialisieren */ strip.SetBrightness(Brightness); /* Helligkeit setzen */ strip.Show(); /* Einstellungen an Leuchtdioden schicken */ #endif /* Deepsleep initialisieren */ #ifdef SLEEP esp_sleep_enable_timer_wakeup(Delay); /* Aktiviert den Deepsleep Wakeup Timer */ #endif }
Loop / Endlosschleife
Der Loop/Endlosschleife, welche auf dem Mikrocontroller ausgeführt wird.
/* Wird nach setup() ausgeführt in form einer Endlosschleife. Es wird zyklisch die Spannung am ADC Eingang gemessen und in eine Temperatur in Grad Celsius umgewandlet. Danach werden die Leuchtdioden in den passenden Farben eingestellt. Falls Debug aktiviert ist werden noch über die serielle Schnittstelle der ADC Wert und die Temperatur ausgegeben. Nach diesem Vorgang wartet der Mikrocontroller bis zur nächsten Messung. Input: - Output: - */ void loop() { /* Temperaturmessung */ Temp.AdcValue = analogRead(Temp.Pin); /* Spannung in ADC Wert umwandeln */ Temp.Celsius = Calc_Temp(Temp.AdcValue, Temp.Max); /* ADC Wert in Temperatur umwandeln */ /* Leuchtdiode einstellen */ Set_LED(Temp.Celsius, 15, 45, Brightness); /* Leuchtdioden ansteuern */ /* Seriale Übertragung (Debug) */ #ifdef DEBUG Serial.print(Temp.AdcValue); /* ADC Wert übertragen */ Serial.print("\t"); /* Tab als Trennung */ Serial.println(Temp.Celsius); /* Temperatur übertragen */ #endif /* Deepsleep */ #ifdef SLEEP esp_deep_sleep_start(); /* Deepsleep starten */ #endif }
ADC Wert in Temperatur um wandeln
Die Funktion wandelt den ADC Wert in eine Temperatur in Grad Celsius um.
/* Wandelt den ADC Wert in eine Temperatur in Grad Celsius um. Diese Funktion ist für den Temperatur Sensor LM35CAZ. Input: uint16_t Raw -> ADC Wert float Max -> Maximale ADC Wert (12bit: 4096.0 10bit: 1024.0) Output: float Celsius -> Temperatur in Grad Celsius */ float Calc_Temp(uint16_t Raw, float Max) { float Millivolt = 0; float Celsius = 0; Millivolt = (Raw / Max) * 5000; /* Berechnung der Spannung */ Celsius = Millivolt / 10; /* Berechnung der Temperatur */ return Celsius; }
Leuchtdioden Steuerung
Diese Funktion entscheidet die Farbe der Leuchtdiode.
/* Stellt die Farbe und Helligkeit der Leuchtdioden ein. Wenn die Temperatur unter der ersten Schwelle ist sind die Leuchtdioden blau. Unter der zweiten Schwelle sind die Leuchtdioden lila und wenn sie über der zweiten Schwelle sind werden die Leuchtdioden rot. Input: uint8_t Data -> Temperatur uint8_t Threshold0 -> Erste Schwelle uint8_t Threshold1 -> Zweite Schwelle uint8_t Brightness -> Helligkeit der LEDs (0-255) Output: - */ void Set_LED(uint8_t Data, uint8_t Threshold0, uint8_t Threshold1, uint8_t Brightness) { /* Werte für die Übermittlung an die Leuchtdiode vorberieten */ if (Data < Threshold0) /* Kleiner erste Schwelle -> Leuchtdiode blau */ { #ifdef FASTLED fill_solid(leds, Number, CRGB::Blue); /* Alle Leuchtidoden blau */ #else strip.SetPixelColor(0, blue); /* Leuchtdiode 1 blau */ strip.SetPixelColor(1, blue); /* Leuchtdiode 2 blau */ strip.SetPixelColor(2, blue); /* Leuchtdiode 3 blau */ strip.SetPixelColor(3, blue); /* Leuchtdiode 4 blau */ #endif } else if (Data < Threshold1) /* Kleiner zweite Schwelle -> Leuchtdiode violet */ { #ifdef FASTLED fill_solid(leds, Number, CRGB::Violet); /* Alle Leuchtidoden violet */ #else strip.SetPixelColor(0, violet); /* Leuchtdiode 1 violet */ strip.SetPixelColor(1, violet); /* Leuchtdiode 2 violet */ strip.SetPixelColor(2, violet); /* Leuchtdiode 3 violet */ strip.SetPixelColor(3, violet); /* Leuchtdiode 4 violet */ #endif } else /* Größer zweite Schwelle -> Leuchtdiode rot */ { #ifdef FASTLED fill_solid(leds, Number, CRGB::Red); /* Alle Leuchtidoden rot */ #else strip.SetPixelColor(0, red); /* Leuchtdiode 1 rot */ strip.SetPixelColor(1, red); /* Leuchtdiode 2 rot */ strip.SetPixelColor(2, red); /* Leuchtdiode 3 rot */ strip.SetPixelColor(3, red); /* Leuchtdiode 4 rot */ #endif } /* Eingestellte Werte an Leuchtdiode schicken */ #ifdef FASTLED FastLED.setBrightness(Brightness); /* Helligkeit der Leuchtdioden einstellen */ FastLED.show(); /* Einstellungen übertragen */ #else strip.SetBrightness(Brightness); /* Helligkeit der Leuchtdioden einstellen */ strip.Show(); /* Einstellungen übertragen */ #endif }
Komponententest
Akku
Bei diesem Test wurde sowohl der Akku als auch die Deepsleep Funktion des Mikrocontrollers. Vor dem Test wurde der Akku vollgeladen und der Test bestand daraus, dass das System durchgehend betrieben wurde bis der Akku leer gegangen ist. Dabei wurde die Zeit gestoppt, wie lange dieser Prozess dauerte.
Der Test wurde mit einem Zeitraffer Video dokumentiert.
Das Testprotokoll wurde im SVN hier abgelegt.
Der Test war XXX
Temperatur Sensor
Bei diesem Test wurde überprüft ob der Temperatur Sensor die richtige Temperatur ermittelt. Dafür wurde eine Referenz mit einem Multimeter und einem Temperaturfühler genommen und mit dem Ergebnis des Systems vergleichen. Dafür wurde die Serielle Debug Schnittstelle verwendet. Die Messung wurde mit unterschiedlichen Temperaturen wiederholt durch geführt.
Die ermittelten Werte wurden in einer Excel Tabelle gesammelt und mit einander Verglichen.
Das Testprotokoll wurde im SVN hier abgelegt.
Der Test war XXX
Leuchtdiode
Bei diesem Test ging es darum ob die Leuchtdioden die drei verschiedenen Farben dargestellt haben. Der Test wurde so durch geführt, dass der Temperatur Sensor erhitzt oder abgekühlt wurde um den Wechsel in den verschiedenen Farben zu erzwingen.
Das Testprotokoll wurde im SVN hier abgelegt.
Der Test war XXX
Ergebnis
Zusammenfassung
Dieses Projekt erfüllt alle am Anfang festgelegten Anforderungen.
Bei diesem Projekt wurden alle Teilbereiche der Systementwicklung abgedeckt. Also der Systementwurf, die Planung, die Hardware und Software Entwicklung, die Komponententests und die Dokumentation.
Für eine kommerzielle Nutzung fehlen noch eine bestimmte Anzahl an Erweiterungen. Wenn aus der Gastronomie ein Interesse besteht könnten diese Erweiterungen ohne Probleme eingefügt werden.
Lessons Learned
Während der Durchführung dieses Projektes gab es nur ein Problem und zwar hatten die verwendten Bauteile keine Befestigungsmöglichkeiten (Bohrlöcher oder vergleichbares) und mussten deswegen verklebt werden. Für einen ersten Prototypen ist dies ausreichend, aber nicht für eine Kommerzielle Nutzung.
Dieses Projekt kann noch umfangreich erweitert werden. Vorschläge zur Erweiterung:
- Übergangseffekt für die Farben
- nur 3 Farben sondern ein Verlauf
- Smarthome / IoT Integration
- Der verwendete ESP32 ist Wlan und BT fähig und könnte in ein Smarthome / IoT Netzwerk integriert werden
- Kommerzielle Nutzung in Gaststätten um Eiswürfel anzubieten oder das Getränk direkt zu tauschen.
- Induktives Laden
- Smart Coaster Wasserdicht machen und den Akku über Induktion Laden
- Lade Spule in den Boden des Smart Coasters
- Taster zum Kellner rufen
- Kleiner Taster an der Seite
- Diebstahl Sicherung
- Buzzer der angeht sobald die Verbindung zum Heimat Wlan Netzwerk unterbrochen wird
- Boden des Smart Coasters ohne Schrauben verschließen
- Entweder gar keinen einzelnen Boden mehr und alles Wasserdicht verpacken (siehe 3.)
- Clips verwenden
- Wasserdichtes Gehäuse
- O-Ring im Boden zur Abdichtung
- Vergießen des Gehäuses
Projektunterlagen
Projektplan
Projektdurchführung
Die vollständigen Unterlagen zu der Durchführung befinden sich im SVN
YouTube Video
Weblinks
Literatur
→ zurück zur Übersicht: WS 20/21: Angewandte Elektrotechnik (BSE)