Smart Coaster

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

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

Abb. 1: Funktionaler Systementwurf



















Abb. 2: Programmablaufsplan




































Komponentenspezifikation

SVN-Link

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

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
Abb. 3: Voreinstellugen öffnen



















Abb. 4: Boardverwalter-URL in den Voreinstellungen eintragen


























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

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.

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.

Abb. 2: Programmablaufsplan



































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:

FastLED

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.

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.

 struct TEMP {
   uint16_t AdcValue = 0;
   float    Celsius  = 0;
   const uint8_t Pin = 4;
   const float   Max = 4096.0;
 } 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.

 #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

Die nächsten Variable ist eine Konstante für die Baudrate der Seriellen Schnittstelle.

 #ifdef DEBUG
 const uint16_t BaudRate = 115200;
 #endif

Die nächsten Variablen sind auch Konstanten und beschreiben die Helligkeit und die Farben der Leuchtdioden.

 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

SVN-Link

Abb. 3: Gantt-Projektplan vom 18.10.2020





































Projektdurchführung

YouTube Video

Weblinks

Literatur


→ zurück zur Übersicht: WS 20/21: Angewandte Elektrotechnik (BSE)