Projekt 63: Luefersteuerung zur Raumentfeuchtung mit MSP430-Launchpads

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen


In diesem Projekt werden ein Abluft- und ein Zuluftlüfter so gesteuert, dass ein Raum automatisch entfeuchtet wird, sobald dies 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.


Aufgabe

  • Erstellung eines Konzeptes
  • Entwurf des Schaltplans
  • Erstellung der Platine als MSP430-Launchpad-Shield
  • Programmierung mit C mit energia
  • Ansteuern/Auslesen der Aktoren/Sensoren


Ablaufplan

Projektstrukturplan

Der Ablaufplan beinhaltet acht Teilaufgaben:

  • Kickoff-Meeting
  • BOM erstellen
  • erste Konzeptionierung mit Fritzing
  • Softwareprogrammierung mit Energia
  • Simulation des Projektes
  • Erstellen des Shields
  • Dokumentation
  • Präsentation

Aufbau

Um die Raumentfeuchtung zu Realisieren, werden folgende Bausteine verwendet:

  • 2 x DHT22 Sensoren
  • 1 x Texas Instruments MSP430 Launchpad
  • 1 x (Solid-State-)Relais-Karte
  • 1 x Shield für das Launchpad
  • 2 x Lüfter
  • 4 x 3er Schraubklemmenblöcke
  • 2 x 10er Buchsenleiste


DHT22-Sensor

DHT22-Sensors

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 [[1]]. Im nachfolgenden Bild sind die drei Anschlusspins zu sehen. Bezeichnung von links nach rechts: " ", dementsprechend wird an "" Vcc angeschlossen, " " 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 außer das Parasitätsbit addiert werden.

0000 0010 + 1001 0010 + 0000 000 + 0000 1101 = 1010 0010

Um die Feuchtigkeit zu messen, werden nun die 16 übertragenen Bits für die Feuchtigkeitsmessung von einem Dualsystem in ein Hexadezimalsystem umgewandelt, woraus sich dann das 10 fache der aktuellen relativen Luftfeuchte ergibt.

0000 0010 1001 0010= 0292 (Hexadezimal) = 0*4096 + 2*256 + 9*16 + 2*1 = 658

658 entspricht einer relativen Luftfeuchte von 65,8%.


MSP430 Launchpad-Serie

MSP-EXP430G2

Die MSP430 Launchpad-Serie bezeichnet 16-Bit-RISC-Mikrocontroller von Texas Instruments, die in die Kategorie "low-power" und "low-cost MCUs" einzuordnen sind. Die LaunchPads sind mit Hilfe der IDE "Energia" in der Programmiersprache C oder Assembler programmierbar. 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.


(Solid-State-)Relais-Karte

SSR-Karte

Relais sind elektromagnetische oder elektromechanische Schalter, die zum Ein-, Aus- und Umschalten verwendet werden. Das Relais wird über einen Steuerstromkreis aktiviert und kann weitere Stromkreise schalten. Halbleiterrelais (engl. Solid-State-Relais) sind allerdings keine eigentlichen Relais. Unterschied ist, dass die Schaltung im Relais meist nicht über einen Elektromagneten erfolgt, sondern über einen Transistor. Vorteile solcher Halbleiterrelais sind ihre lange Lebensdauer, hohe Schalthäufigkeiten und kleine Abmessungen. In dem hier beschriebenen Projekt wurde ein Solid-State-Relais-Modul verwendet. Die Karte enthält zwei Relais vom Typ G3MB-202P der Firma Omron und vier Anschlüsse an beiden Seiten, sowie weitere Bauteile wie LED's oder Widerstände.


Durchführung

Kickoff- Meeting

Beim Kickoff- Meeting am 19.9.2016 wurden Aufgaben vorgestellt und eingeteilt.


BOM

Bevor am 07.10.2016 die BOM (Bill Of Material) abgeschickt wurde, mussten wir uns parallel Gedanken zu dem späteren Aufbau des Projekts machen. Daher wurden die Konzepterstellung mit Fritzing und die Erstellung der BOM gleichzeitig durchgeführt. Die Stückliste enthält:

  • 2 DHT22 Sensor-Module
  • 10 3er Schraubklemmen RM 5 mm
  • 1 36er Buchsenleiste RM 2,54 mm


Konzeptzierung mit 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 RHT 03 (Feuchtigkeits- und Temperatur Sensoren, anstelle von DHT22)
  • 2 Motoren
  • 2 s108t02 Solid-State-Relais (anstatt G3MB-202P Solid-State-Relais)
  • 1 MSP430G2 LaunchPad
  • 5 Volt Spannungsversorgung
Schaltplan_Fritzing

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 des Herstellers Texas Instruments mit den Prozessorarchitekturen TI MSP430 und ARM Cortex-M4 genutzt werden. 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 späteren Überführung in Energie musste festgestellt werden, dass die verwendeten Libraries nicht nutzbar sind.

Für die DHT-Library gibt es äquivalenten Ersatz, für die Math-Library leider nicht. 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.

Für die Math-Library wird kein Ersatz benötigt, da eine Library für Rechenoperationen sich als überflüssig herausstellte. 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 ohne die entsprechende Library erfolgt dies standardmäßig mit powf(base, exponent), ebenfalls mit Float-Werten.


Programmablaufplan

Programmablaufplan

Um den Überblick bei der Programmierung zu behalten, wurde vor dem Programmieren ein Programmablaufplan, welcher im unteren Bild zu sehen ist, aufgestellt.


Programmcode

/*
 * 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
 * alternative: use solid-state relays 
 
 * Note: This program is using different libraries than the (almost similar) Arduino program!
 */


#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



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
}



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



// 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");
}


Problematik mit Energia

Simulation

Zum Testen der Software haben wir eine vereinfachte Schaltung aufgebaut. Dafür haben wir die Lüfter gegen LED's ausgetauscht und die Relais weg gelassen. Die DHT22 Sensoren mussten natürlich beibehalten werden, damit die übermittelten Daten in der Software verarbeitet werden konnten. Verbunden wurden die Bauteile über ein Steckbrett und Kabel (s. Aufbau Simulation).

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

Ultiboard Layout
Ultiboard Layout

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


Zusammenfügen von Shield und LaunchPad

Präsentation

Quellen

  1. https://de.wikipedia.org/wiki/Relais#Halbleiterrelais
  2. http://energia.nu/Guide_MSP430LaunchPad.html
  3. http://www.elektronik-kompendium.de/sites/bau/0207211.htm
  4. http://akizukidenshi.com/download/ds/aosong/AM2302.pdf
  5. https://de.wikipedia.org/wiki/Energia_(Plattform)