Smart Coaster: Unterschied zwischen den Versionen
Zeile 58: | Zeile 58: | ||
Vorerst Ideen Sammlung für die Umsetzung! Wird noch bis zum Projekt Ende überarbeitet. | Vorerst Ideen Sammlung für die Umsetzung! Wird noch bis zum Projekt Ende überarbeitet. | ||
=== | === Hardware === | ||
==== Stückliste ==== | |||
==== Verdrahtung ==== | |||
==== Gehäuse ==== | |||
==== Zusammenbau ==== | |||
=== | === Software === | ||
==== Porgrammablaufsplan ==== | |||
==== Quellcode ==== | |||
Der Quellcode, welcher auf dem Mikrocontroller ausgeführt wird mit Erläuterungen. | |||
===== Header ===== | |||
/* | |||
Datei: Smart_Coaster.ino | |||
Autor: Michael Menke | |||
michael.menke@stud.hshl.de | |||
Erstellung: 17.10.2020 | |||
Letzte Änderung: 22.10.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 Debug Schnittstelle eingeschaltet wird, welche LED Libary man verwendet und ob der Deepsleep verwendet wird. | |||
/* PREPROCESSOR DEFINES */ | |||
//#define DEBUG /* Serielle Ausgabe Baud 9600 */ | |||
//#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: | |||
[https://github.com/FastLED/FastLED FastLED] | |||
[https://github.com/Makuna/NeoPixelBus NeoPixelBus] | |||
/* 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. | |||
/* Variablen */ | |||
struct TEMP { | |||
uint16_t AdcValue = 0; | |||
float Celsius = 0; | |||
const uint8_t Pin = 4; | |||
const float Max = 4096.0; | |||
} Temp; | |||
#ifdef FASTLED | |||
const uint8_t Number = 4; | |||
const uint8_t Pin = 16; | |||
#else | |||
struct LED { | |||
const uint8_t Number = 4; | |||
const uint8_t Pin = 16; | |||
} Led; | |||
#endif | |||
#ifdef DEBUG | |||
const uint16_t BaudRate = 115200; | |||
#endif | |||
const uint8_t Brightness = 25; /* Helligkeit der Leuchtdioden 0-255 */ | |||
const uint32_t Delay = 1000000; /* Zeit zwischen Deepsleep Wakeup in us */ | |||
#ifdef FASTLED | |||
CRGB leds[Number]; | |||
#else | |||
NeoPixelBrightnessBus<NeoRgbFeature, Neo800KbpsMethod> strip(Led.Number, Led.Pin); | |||
RgbColor red(0, 255, 0); /* Sind GRB LEDs */ | |||
RgbColor violet(130, 238, 238); | |||
RgbColor blue(0, 0, 255); | |||
#endif | |||
===== Funktionen ===== | |||
Hier wurden die Funktionen definiert. | |||
/* Funktionen */ | |||
float Calc_Temp(uint16_t Raw, float Max); | |||
void Set_LED(uint8_t Percent, uint8_t Threshold0, uint8_t Threshold1, uint8_t Brightness); | |||
===== 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() | |||
{ | |||
/* Serial */ | |||
#ifdef DEBUG | |||
Serial.begin(BaudRate); | |||
#endif | |||
/* LED */ | |||
#ifdef FASTLED | |||
FastLED.addLeds<WS2812B, Pin, GRB>(leds, Number); | |||
FastLED.setBrightness(Brightness); | |||
#else | |||
strip.Begin(); | |||
strip.Show(); | |||
strip.SetBrightness(Brightness); | |||
#endif | |||
#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); | |||
Temp.Celsius = Calc_Temp(Temp.AdcValue, Temp.Max); | |||
/* LED */ | |||
Set_LED(Temp.Celsius, 15, 45, Brightness); | |||
/* Serial */ | |||
#ifdef DEBUG | |||
Serial.print(Temp.AdcValue); | |||
Serial.print("\t"); | |||
Serial.println(Temp.Celsius); | |||
#endif | |||
/* Sleep */ | |||
#ifdef SLEEP | |||
esp_deep_sleep_start(); | |||
#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; | |||
Celsius = Millivolt / 10; | |||
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) | |||
{ | |||
if (Data < Threshold0) | |||
{ | |||
#ifdef FASTLED | |||
fill_solid(leds, Number, CRGB::Blue); | |||
#else | |||
strip.SetPixelColor(0, blue); | |||
strip.SetPixelColor(1, blue); | |||
strip.SetPixelColor(2, blue); | |||
strip.SetPixelColor(3, blue); | |||
#endif | |||
} | |||
else if (Data < Threshold1) | |||
{ | |||
#ifdef FASTLED | |||
fill_solid(leds, Number, CRGB::Violet); | |||
#else | |||
strip.SetPixelColor(0, violet); | |||
strip.SetPixelColor(1, violet); | |||
strip.SetPixelColor(2, violet); | |||
strip.SetPixelColor(3, violet); | |||
#endif | |||
} | |||
else | |||
{ | |||
#ifdef FASTLED | |||
fill_solid(leds, Number, CRGB::Red); | |||
#else | |||
strip.SetPixelColor(0, red); | |||
strip.SetPixelColor(1, red); | |||
strip.SetPixelColor(2, red); | |||
strip.SetPixelColor(3, red); | |||
#endif | |||
} | |||
#ifdef FASTLED | |||
FastLED.setBrightness(Brightness); | |||
FastLED.show(); | |||
#else | |||
strip.SetBrightness(Brightness); | |||
strip.Show(); | |||
#endif | |||
} | |||
== Komponententest == | == Komponententest == |
Version vom 5. Dezember 2020, 18:50 Uhr
Autoren: Michael Menke Martin Glennemeyer
Betreuer: Prof. Schneider
→ zurück zur Übersicht: WS 20/21: Angewandte Elektrotechnik (BSE)
Einleitung
Smart Coaster soll ein Bierdeckel sein, welcher Informationen über das dadrü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 | Nein (wird noch geprüft) |
1 | 3D Gehäuse | TBD (SVN zur .step) | Wird von der Hochschule gedruckt | Nein |
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
Porgrammablaufsplan
Quellcode
Der Quellcode, welcher auf dem Mikrocontroller ausgeführt wird mit Erläuterungen.
Header
/* Datei: Smart_Coaster.ino Autor: Michael Menke michael.menke@stud.hshl.de Erstellung: 17.10.2020 Letzte Änderung: 22.10.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 Debug Schnittstelle eingeschaltet wird, welche LED Libary man verwendet und ob der Deepsleep verwendet wird.
/* PREPROCESSOR DEFINES */ //#define DEBUG /* Serielle Ausgabe Baud 9600 */ //#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.
/* Variablen */ struct TEMP { uint16_t AdcValue = 0; float Celsius = 0; const uint8_t Pin = 4; const float Max = 4096.0; } Temp; #ifdef FASTLED const uint8_t Number = 4; const uint8_t Pin = 16; #else struct LED { const uint8_t Number = 4; const uint8_t Pin = 16; } Led; #endif #ifdef DEBUG const uint16_t BaudRate = 115200; #endif const uint8_t Brightness = 25; /* Helligkeit der Leuchtdioden 0-255 */ const uint32_t Delay = 1000000; /* Zeit zwischen Deepsleep Wakeup in us */ #ifdef FASTLED CRGB leds[Number]; #else NeoPixelBrightnessBus<NeoRgbFeature, Neo800KbpsMethod> strip(Led.Number, Led.Pin); RgbColor red(0, 255, 0); /* Sind GRB LEDs */ RgbColor violet(130, 238, 238); RgbColor blue(0, 0, 255); #endif
Funktionen
Hier wurden die Funktionen definiert.
/* Funktionen */ float Calc_Temp(uint16_t Raw, float Max); void Set_LED(uint8_t Percent, uint8_t Threshold0, uint8_t Threshold1, uint8_t Brightness);
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() { /* Serial */ #ifdef DEBUG Serial.begin(BaudRate); #endif /* LED */ #ifdef FASTLED FastLED.addLeds<WS2812B, Pin, GRB>(leds, Number); FastLED.setBrightness(Brightness); #else strip.Begin(); strip.Show(); strip.SetBrightness(Brightness); #endif #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); Temp.Celsius = Calc_Temp(Temp.AdcValue, Temp.Max); /* LED */ Set_LED(Temp.Celsius, 15, 45, Brightness); /* Serial */ #ifdef DEBUG Serial.print(Temp.AdcValue); Serial.print("\t"); Serial.println(Temp.Celsius); #endif /* Sleep */ #ifdef SLEEP esp_deep_sleep_start(); #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; Celsius = Millivolt / 10; 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) { if (Data < Threshold0) { #ifdef FASTLED fill_solid(leds, Number, CRGB::Blue); #else strip.SetPixelColor(0, blue); strip.SetPixelColor(1, blue); strip.SetPixelColor(2, blue); strip.SetPixelColor(3, blue); #endif } else if (Data < Threshold1) { #ifdef FASTLED fill_solid(leds, Number, CRGB::Violet); #else strip.SetPixelColor(0, violet); strip.SetPixelColor(1, violet); strip.SetPixelColor(2, violet); strip.SetPixelColor(3, violet); #endif } else { #ifdef FASTLED fill_solid(leds, Number, CRGB::Red); #else strip.SetPixelColor(0, red); strip.SetPixelColor(1, red); strip.SetPixelColor(2, red); strip.SetPixelColor(3, red); #endif } #ifdef FASTLED FastLED.setBrightness(Brightness); FastLED.show(); #else strip.SetBrightness(Brightness); strip.Show(); #endif }
Komponententest
Ergebnis
Zusammenfassung
Lessons Learned
Projektunterlagen
Projektplan
Projektdurchführung
YouTube Video
Weblinks
Literatur
→ zurück zur Übersicht: WS 20/21: Angewandte Elektrotechnik (BSE)