Projekt 63: Luefersteuerung zur Raumentfeuchtung mit MSP430-Launchpads

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Autoren: Lena Gödeke | Nora Werner

Betreuer: Prof. Dr.-Ing. Mirek Göbel | Prof. Dr.-Ing. Ulrich Schneider


→ zurück zum Hauptartikel: Angewandte Elektrotechnik (WS 16/17)


In diesem Projekt werden ein Abluft- und ein Zuluftlüfter so gesteuert, dass ein Raum automatisch entfeuchtet wird, sobald dieses notwendig ist. Als Berechnungsgrundlage dient die absolute Feuchtigkeit, berechnet aus Temperatur und relativer Luftfeuchtigkeit. Die Regulation selbst wird über den Vergleich der absoluten Luftfeuchtigkeit innerhalb des Raums zur absoluten Luftfeuchtigkeit im Freien bzw. draußen vorgenommen.


Vorbereitung

Ablaufplan

Projektstrukturplan

Der Ablaufplan beinhaltet verschiedene Teilaufgaben:

  • Kickoff-Meeting mit Projektauswahl
  • grobe Umsetzungsindee entwickeln
  • Bill-of-Material erstellen
  • erste Konzeptionierung mit Fritzing
  • Softwareprogrammierung mit Energia
  • Simulation des Projektes
  • Erstellen des Shields
  • Dokumentation
  • Präsentation


benötigte Materialien

Um die Raumentfeuchtung zu realisieren, werden folgende Bauteile verwendet:

  • 2 x DHT22-Temperatur- und Feuchtigkeitssensor
  • 1 x MSP430-Launchpad
  • 1 x (Solid-State-)Relais-Karte
  • 1 x Shield für das Launchpad
  • 2 x Lüfter
  • 4 x 3er Schraubklemmenblock
  • 2 x 10er Buchsenleiste


Wissensgrundlage

DHT22-Sensors

DHT22-Temperatur- und Feuchtesensor

Der DHT22-Sensor ermittelt die Temperatur und die relative Luftfeuchtigkeit kapazitiv. Die physikalischen Größen werden in digitalen Signalen ausgegeben. Der Sensor übergibt ein Signal, das aus 40 Bits besteht, wovon 16 Bits die Feuchtigkeit angeben, weitere 16 Bits geben die Temperatur an und 8 Bits sind das Parasitätsbit. Im nachfolgenden Bild sind die drei Anschlusspins zu sehen. Bezeichnung von links nach rechts: "+, out und -", dementsprechend wird an "+" Vcc angeschlossen, "out " ist die Signalleitung und "-" ist Masse (Ground).


Beispiel Feuchtigkeitsmessung

Feuchtigkeit Temperatur Parasitätsbit
Code 0000 0010 1001 0010 0000 0001 0000 1101 1010 0010

Zunächst wird überprüft, ob die 32 übertragenen Bits dem Parasitätsbit entsprechen, indem alle übertragenen Bits, bis auf das Parasitätsbit, addiert werden.

Um die Feuchtigkeit zu messen, werden die 16 übertragenen Bits für die Feuchtigkeitsmessung vom Binärsystem in das Hexadezimalsystem umgewandelt, woraus sich dann das 10-fache der aktuellen relativen Luftfeuchte ergibt.

[1]

658 entspricht einer relativen Luftfeuchtigkeit von 65,8 %.


MSP-EXP430G2

MSP430 Launchpad-Serie

Die MSP430 Launchpad-Serie bezeichnet 16-Bit-RISC-Mikrocontroller von Texas Instruments, die in die Kategorie "low-power" und "low-cost MCUs" einzuordnen sind. Das nebenstehende Bild zeigt ein MSP-EXP430G2-Launchpad, in dem alle essentiellen Funktionen, sowie die Pinbelegung grafisch dargestellt sind. Es ist ein programmierbarer on-board-Button vorhanden, sowie mehrere LEDs. Zusätzlich können über die Stiftleisten diverse Shields für z.B. WLAN, Displays, etc. angeschlossen werden. Zudem ist die serielle Kommunikation mit verschiedenen Standards möglich, wie UART, I2C & SPI.[2][3]


Relais-Board

Relay-Board
SSR-Board

Relais sind elektromagnetische oder elektromechanische Schalter, die zum Ein-, Aus- und Umschalten verwendet werden. Das Relais wird über einen Steuerstromkreis aktiviert und kann einen Laststromkreis schalten. Das hier verwendete Relais-Board besitzt auf der Seite des Laststromkreises drei Anschlüsse: NC, C und NO. Es wird grundsätzlich "common connection" (C) benötigt, sowie einer der beiden anderen Anschlüsse. Soll das Relais beim Schaltsignal HIGH durchschalten, muss die zweite Verbindung über den "Normally Open" (NO) vorgenommen werden, ist das Schaltsignal LOW, ist der Laststromkreis unterbrochen. Wird die zweite Leitung mit "Normally Closed" (NC) verbunden, ist der Laststromkreis beim Schaltsignal HIGH geöffnet und beim Schaltsignal LOW geschlossen, das heißt beim Eingangssignal von 0 V ist der Lastkreis durchgeschaltet.


(Solid-State-)Relais-Board

Halbleiterrelais (engl. Solid-State-Relais) sind keine Relais im eigentlichen Sinn. Bei ihnen erfolgt die Schaltung nicht über einen Elektromagneten, sondern über einen Transistor. Vorteile solcher Halbleiterrelais sind ihre lange Lebensdauer, hohe Schalthäufigkeiten und kleine Abmessungen. Das Solid-State-Modul enthält zwei Relais von Omron (Typ G3MB-202P). Auf der Seite des Steuerstromkreises sind vier Eingänge vorhanden: VCC, GND und zwei Signalleitungen. Pro Relais sind für den Laststromkreis zwei Anschlüsse vorgesehen, die geschaltet werden können. [4]


Durchführung

Konzeptionierung mit Fritzing

Schaltplan Fritzing

Fritzing ist eine freie Software mit der elektrische Schaltungen aufgestellt werden können. Fritzing enthält einen Bauteilkatalog, der mit eigenen Bauteilen ergänzt werden kann. Zur Gestaltung einer Schaltung können die Bauteile aus dem Katalog per drag and drop in die Zeichnungen eingefügt werden. Da die Ergänzung des Bauteilkatalogs sehr aufwendig ist, wurden für die Konzeptentwicklung fehlende Bauteile durch Teile ersetzt, die den echten ähneln.

Verwendete Bauteile:

  • 2 x RHT 03 (Feuchtigkeits- und Temperatur Sensor, anstelle von DHT22)
  • 2 x Motor
  • 2 x s108t02 Solid-State-Relais (anstatt G3MB-202P Solid-State-Relais)
  • 1 x MSP430G2 LaunchPad


Softwareprogrammierung mit Energia

Die Energia-Plattform ist eine aus Soft- und Hardware bestehende Physical-Computing-Plattform. Sie ist der Arduino-Plattform ähnlich, unterscheidet sich in einigen Punkten aber doch relativ deutlich. Vor allem sind Unterschiede bei der Hardware zu sehen. Mit Energia können verschiedene Varianten der Launchpad (genannten "Eval-Boards") von Texas Instruments mit den Prozessorarchitekturen TI MSP430 und ARM Cortex-M4 genutzt werden. Die Programmierung erfolgt mit Wiring, einer Abwandlung von C oder Assembler. Nach Angaben von Energia sollen viele der in der Arduino IDE verankerten Libraries auch für die Programmierung mit Energia nutzbar sein. Aufgrund dieser Tatsache wurde zuerst ein Arduino Uno Board programmiert, da das Launchpad direkt zu Beginn noch nicht verfügbar war. Für die Umsetzung wurde die Math-Library und die DHT-Library verwendet. Bei der Überführung in Energia musste festgestellt werden, dass die verwendeten Libraries nicht nutzbar sind.

Für die DHT-Library gibt es äquivalenten Ersatz, für die Math-Library nur bedingt. Zwei wesentliche Unterschiede der DHT-Libraries bilden das Initialisieren und das anschließende Auslesen der Sensoren. Die Library für die Programmierung des Launchpads ist nur für den DHT22-Sensor geeignet, für das Arduino-Board sind mehrere DHT-Sensoren in der entsprechenden Library hinterlegt. Die Version für das TI-Launchpad liest alle Werte als Integer ein. Hierfür wird die eigentliche Temperatur bzw. relative Luftfeuchtigkeit um dem Faktor 10 vergrößert eingelesen. Beispielsweise wird eine Temperatur von 21.5 °C als 215 übertragen, die relative Luftfeuchtigkeit von z.B. 35.2 % als 352. Anschließend müssen die Integer-Werte in Float-Werte überführt werden und durch 10 dividiert werden. Mit dem Ardunio Board könnten die Werte direkt als Float eingelesen werden.

Die Math-Library selbst ist nicht für Energia verfügbar, viele ihrer Funktionen sind in dafür in der von Texas Instruments zur Verfügung gestellten Energia-Library hinterlegt. Für die Berechnung der absoluten Luftfeuchtigkeit wird mit Exponenten gearbeitet. In der Arduino IDE mit der Math-Library erfolgt dies über pow(base, exponent) mit jeweils zwei Float-Werten. In Energia erfolgt dieses standardmäßig mit powf(base, exponent), ebenfalls mit Float-Werten.


Programmablaufplan und Programmcode

Der nebenstehende Pogrammauflaufplan ist eine Zusammenfassung des nachstehenden Programmcodes und dient zum besseren Verständnis. Der gesamte Programmcode ist nochmal im HSHL-SVN https://svn.hshl.de/svn/Elektrotechnik_Fachpraktikum/trunk/Projekte/63_Lueftersteuerung_Raumentfeuchtung_MSP430/Programmcode/ zu finden, es sind Zugriffsrechte erforderlich.


Im Header sind eine kurze Zusammenfassung des Codes, Informationen zum Autor, sowie weitere wichtige Informationen, wie z.B. essentielle Hardwarekomponenten angegeben.

/*
 * This code is used to dehumidify a room by comparing inside and outside absolute humidity 
 * obtained by reading relative humidity [%] and temperature [°C] values of two sensors.
 
 * The control of two fans (connected directly or by solid-state relays) depends on the 
 * absolute humidity inside compared to the absolute humidity outside. Furthermore, if it is 
 * too cold outside (defined threshold) the fans will remain off.
 
 @ author: Lena Gödeke and Nora Werner
 @ Hamm-Lippstadt University of Applied Sciences
 @ Business and Systems Engineering (M.Eng.)
 @ Fundamentals of Electrical Engineering
 
 The circuit:
 * DHT22-Sensors (temperature and humidity) connected to pin P1_4 and P1_5
 * relays/fans connected to pin P2_1 and P2_2
 * small fans may be attached directly
 
 * Note: This program is using different libraries than the (almost similar) Arduino program!
 */


Zu Beginn werden die benötigten Libraries eingebunden und globale Variablen definiert.

Programmablaufplan zur Realisierung der Raumentfeuchtung
#include "Energia.h"    // Include application, user and local libraries
#include "DHT22_430.h"

#define DHT_Pin_outside P1_4    // define Pin for sensor outside
#define DHT_Pin_inside P1_5    // define Pin for sensor inside

DHT22 dhtOUT(DHT_Pin_outside);  // initialise sensor outside
DHT22 dhtIN(DHT_Pin_inside);    // initialise sensor inside

int fan1 = P2_1;                          // fan 1 connected to digital pin 4
int fan2 = P2_2;                          // fan 2 connected to digital pin 5

// variables to store sensor values
float rel_humidityOUT;
float temperatureOUT;
float rel_humidityIN;
float temperatureIN;

// physical constants to calculate absolute humidity
float parameter_a = 7.5;                // if temperature >= 0°C
float parameter_b = 237.3;              // if temperature >= 0°C

float gas_const = 8314.3;               // universal gas constant [J/(kmol*K)]
float mol_mass_water_vapour = 18.016;   // molare mass of water vapour [kg/kmol]

// variables to store calculated absolute humidity
float abs_humidityOUT;
float abs_humidityIN;

// variables used in function "calculate_abs_humidity(x, y)" only)
float saturated_vapour_pressure;
float vapour_pressure;
float abs_humidity;

float temperature_threshold = 4.0;      // above this temperature threshold fans may be turned on

int hold = 5000;                        // delay between cycles


Im Setup wird den digitalen Pins eine Input- bzw. Output-Funktion zugewiesen. Außerdem werden die Geschwindigkeit für die serielle Übertragung festgelegt und das Lesen der Sensoren initiiert.

void setup() {
  Serial.begin(9600);                   // transmission rate for serial communication (9600 bd)
  dhtOUT.begin();                       // begin transmission of sensor value (outside)
  dhtIN.begin();                        // begin transmission of sensor value (inside)

  pinMode(fan1, OUTPUT);                // digital fan pin 1 declared as output
  pinMode(fan2, OUTPUT);                // digital fan pin 2 declared as output
}


Der Loop wird kontinuierlich ausgeführt.

void loop() {

  // read relative humidity and temperature of both sensors (inside and outside)
  // library returns relative humidity and temperature each multiplied by 10 as integer to avoid float
  // -> therefore read values must be divided by 10 and saved as float afterwards
  dhtOUT.get();
  rel_humidityOUT = dhtOUT.humidityX10() / 10.0;
  temperatureOUT = dhtOUT.temperatureX10() / 10.0;

  delay(500);     // delay to ensure correct sensor reading

  dhtIN.get();
  rel_humidityIN = dhtIN.humidityX10() / 10.0;      
  temperatureIN = dhtIN.temperatureX10() / 10.0;

  if (temperatureOUT > temperature_threshold) {    // compare temperature outside with threshold temperature

    // call function to calculate absolute humidity outside
    abs_humidityOUT = calculate_abs_humidity(rel_humidityOUT, temperatureOUT);

    // call function to calculate absolute humidity inside
    abs_humidityIN = calculate_abs_humidity(rel_humidityIN, temperatureIN);

    if (abs_humidityIN > abs_humidityOUT) {
      // turn fans on
      digitalWrite(fan1, HIGH);
      digitalWrite(fan2, HIGH);
    } 
    else {
      digitalWrite(fan1, LOW);
      digitalWrite(fan2, LOW);
    }

  } 
  else {
    // turn fans off
    digitalWrite(fan1, LOW);
    digitalWrite(fan2, LOW);
  }

  // call void function to send status information via serial connection
  print_statements();

  // Warnings
  if (temperatureOUT <= temperature_threshold) {
    Serial.println("Warning: It's freezing outside!");
  } 
  else if (abs_humidityOUT > abs_humidityIN) {
    Serial.println("It is too humid outside!");
  }
  delay(hold-500);    // delay between cycles (cycle delay - delay between reading sensor values)
}


Unterprogramm: absolute Feuchtigkeit berechnen
Unterprogramm: Statusausgabe

Folgende Funktionen werden im Loop aufgerufen:

// function to calculate absolute humidity based on rel. humidity and temperature
float calculate_abs_humidity(float hum, float temp) {
  saturated_vapour_pressure = 6.1078 * powf(10, ((7.5 * temp) / (237.3 + temp)));                          // saturated vapour pressure [hPa]
  vapour_pressure = (hum / 100) * saturated_vapour_pressure;                                               // vapour pressure [hPa]
  abs_humidity = powf(10, 5) * (mol_mass_water_vapour / gas_const) * (vapour_pressure / (temp + 273.15));  // absolute humidity [g/m^3]

  return abs_humidity;
}



// void function to send status information via serial connection
void print_statements() {
  Serial.print("relative humidity outside: ");
  Serial.print(rel_humidityOUT);
  Serial.print(" %, temp.: ");
  Serial.print(temperatureOUT);
  Serial.print(" C");
  Serial.print(", absolute humidity outside: ");
  Serial.print(abs_humidityOUT);
  Serial.println(" g/m^3");

  Serial.print("relative humidity inside:  ");
  Serial.print(rel_humidityIN);
  Serial.print(" %, temp.: ");
  Serial.print(temperatureIN);
  Serial.print(" C");
  Serial.print(", absolute humidity inside:  ");
  Serial.print(abs_humidityIN);
  Serial.println(" g/m^3");
}

Die Funktion calculate_abs_humidity(float hum, float temp) berechnet anhand der übergebenen Parameter (relative Luftfeuchtigkeit und Temperatur) die absolute Feuchtigkeit und gibt diese über den return-Befehl als Ergebnis zurück. Das Ergebnis wird im Loop in einer Variable gespeichert.

Eine Funktion ohne Rückgabewert wird immer mit void gekennzeichnet und benötigt auch keine Eingabeparameter. Die Funktion print_statements() ist lediglich für die serielle Ausgabe von Statusmeldungen zuständig.


Aufbau Simulation

Simulation

Zum Testen der Software wird die Schaltung vereinfacht aufgebaut. Die Relais mit den Lüftern sind gegen LEDs ausgetauscht. Die DHT22-Sensoren werden natürlich beibehalten, damit die übermittelten Daten in der Software verarbeitet werden konnten. Verbunden werden die Bauteile über ein Steckbrett und Kabel (s. Aufbau Simulation).


Zur Funktionsüberprüfung können die Sensoren angehaucht werden, um eine Temperatur- und Feuchtigkeitsänderung nachzustellen. Zusätzlich kann die Temperaturschwelle variiert werden, die in der ersten if-Anweisung abgefragt wird. Die Schwelle selbst dient zur Minimierung des Wärmeverlustes von drinnen nach draußen.


Erstellen des Shields

Schaltplan
PCB Layout
3D Ansicht
Shield

Das PCB-Layout wurde mit der Programmkombination Multisim und Ultiboard von National Instruments erstellt.


Zusammenfügen von Shield und LaunchPad

Das Pad und das Shield werden mit zwei 10er Buchsenleisten verbunden. Die Buchsenleiste wird mit einer Lötverbindung an der Platine befestigt. Um die benötigten Bauteile anschließen zu können, werden zudem noch vier 3er Schraubklemmenblöcke an die Platine gelötet.


Anfertigung eines Gehäuses für das Launchpad aus Acrylglas

Gehäuse für die Platine

Das Gehäuse für das Launchpad ist aus Acrylglas und mit einem Lasercutter gefertigt. Die selbst erstellte Vorlage für den Lasercutter ist eine Vektorgrafik (SVG). Die Originaldatei ist im HSHL-SVN unter: https://svn.hshl.de/svn/Elektrotechnik_Fachpraktikum/trunk/Projekte/63_Lueftersteuerung_Raumentfeuchtung_MSP430/ zu finden (Zugriffsberechtigung erforderlich!).

Leider konnte die Vektorgrafik selbst nicht ins Wiki hochgeladen werden, da das Dateiformat beim Hochladen zwar unterstützt wird, aber aufgrund eines Konvertierungsfehlers keine Vorschau erzeugt werden kann. Aus diesem Grund ist der Gehäuseplan lediglich als PNG im Wiki verfügbar.


Präsentation

Die Präsentation des Projekts erfolgte auf der Messe "30 Mechatronik-Projekte zum Anfassen" am 09.01.2017 an der HSHL in Lippstadt. Vorgestellt wurden Projekte von Studierenden des Bachelorstudiengangs Mechatronik und des Masterstudiengangs Business and Systems Engineering. Zusätzlich wurde ein kurzer Youtube-Clip angefertigt: https://www.youtube.com/watch?v=vb17egO88wM

Messestand am 09.01.2017 im Mechatronik-Labor der HSHL

Alle Informationen rund um das Projekt sind im HSHL-SVN unter https://svn.hshl.de/svn/Elektrotechnik_Fachpraktikum/trunk/Projekte/63_Lueftersteuerung_Raumentfeuchtung_MSP430/ zu finden. Es sind Zugriffsrechte erforderlich.

Einzelnachweise

  1. Handbuch zum AM2302 Temperatur- und Feuchtigkeitsmodul, Manual von Aosong Electronics. Abgerufen am 6. Januar 2017.
  2. Guide to the MSP430 LaunchPad (MSP-EXP430G2), Website der Energia Plattform. Abgerufen am 5. Januar 2017.
  3. MSP430 LaunchPad Value Line Development kit, Website von Texas Instruments. Abgerufen am 3. Januar 2017.
  4. Relais, Website des Elektronik Kompendiums. Abgerufen am 6. Januar 2017.