Projekt 63: Luefersteuerung zur Raumentfeuchtung mit MSP430-Launchpads: Unterschied zwischen den Versionen
Zeile 73: | Zeile 73: | ||
=== (Solid-State-)Relais-Karte === | === (Solid-State-)Relais-Karte === | ||
[[Bild:Foto 17.12.16, 11 00 12.jpg|thumb|right| | |||
[[Bild:Foto 17.12.16, 11 00 12.jpg|thumb|100px|right|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. | 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. | ||
Version vom 3. Januar 2017, 20:07 Uhr
Bei diesem Projekt werden ein Ab- und ein Zuluftlüfter so gesteuert, dass ein Raum automatisch entfeuchtet wird, wenn es notwendig ist.
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
![](/wiki/images/thumb/0/0e/Projektstrukturplanneu.jpg/300px-Projektstrukturplanneu.jpg.png)
Der Ablaufplan wurde zu Beginn des Projektes festgelegt, um den Überblick über einzelne Teilprojekte zu behalten. Der Plan besteht aus den 8 Teilaufgaben:
- Kickoff- Meeting
- BOM erstellen
- erste Konzeptzierung mit Fritzing
- Software Programmierung 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
![](/wiki/images/thumb/c/cb/Dht22_800_pinbelegung.jpg/300px-Dht22_800_pinbelegung.jpg)
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
Das MSP430 ist ein 16- Bit- RISC- Microcontroller der Firma Texas Instruments. Das LaunchPad ist mittels Compiler (Energia) in der Programmiersprache C oder Assembler programmierbar. Das Bild MSP-EXP430G2 zeigt die Module, die Pinbelegung und die serielle Schnittstellen des Boards.
![](/wiki/images/thumb/a/a4/LaunchPadMSP430G2553-v1.4.jpg/300px-LaunchPadMSP430G2553-v1.4.jpg)
(Solid-State-)Relais-Karte
![](/wiki/images/thumb/3/38/Foto_17.12.16%2C_11_00_12.jpg/100px-Foto_17.12.16%2C_11_00_12.jpg)
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.
Lüfter
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
![](/wiki/images/thumb/9/99/Raumentfeuchtung_Schaltplan.png/300px-Raumentfeuchtung_Schaltplan.png)
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
![](/wiki/images/thumb/c/cf/Hauptprogramm1.png/300px-Hauptprogramm1.png)
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).
![](/wiki/images/thumb/0/03/Foto_17.12.16%2C_10_08_34.jpg/300px-Foto_17.12.16%2C_10_08_34.jpg)
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
![](/wiki/images/thumb/c/c0/Ultiboard_Layout.png/300px-Ultiboard_Layout.png)
![](/wiki/images/thumb/8/81/Ultiboard_3D_Ansicht.png/300px-Ultiboard_3D_Ansicht.png)
Das PCB-Layout wurde mit der Programmkombination Multisim und Ultiboard von National Instruments erstellt.