Smart Coaster: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
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.


=== HW ===
=== Hardware ===


System braucht einen Ein/Ausschalter! '''In Stückliste vorhanden'''
==== Stückliste ====


Verteiler Platine oder direkte Verdrahtung? -> Wie groß wird das Gehäuse werden? Ist dort ein Platz für eine Platine? '''Keine Verteiler Platine'''
==== Verdrahtung ====


Wie einen Schutz vor Wasser gewährleisten? -> Tauchlack, Plastikspray, Vergussmasse (könnte ich bei der ME kostenlos machen lassen) oder Silikon?
==== Gehäuse ====


Gehäuse sollte so groß sein wie ein Bierdeckel -> 93mm x 93mm Gehäuse in SolidWorks erstellen und dann bei der Hochschule drucken lassen.
==== Zusammenbau ====


=== SW ===
=== Software ===


In Arduino C programmieren. '''Fertig'''
==== Porgrammablaufsplan ====


ADC Auslesen -> In °C umwandeln -> In Farbe umwandeln (blau kalt, rot warm, lila dazwischen) '''Fertig'''
==== 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.


Strom sparen -> Deepsleep? Helligkeit der LEDs gering halten? ADC selten abfragen? '''Fertig'''
  /* 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, 17: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

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

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.

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

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)