Projekt 63: Luefersteuerung zur Raumentfeuchtung mit MSP430-Launchpads

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen


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

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 DHT22 Sensoren
  • 1 Texas Instruments MSP430 Launchpad
  • (Solid-State-)Relais-Karte
  • Shield für das Launchpad
  • 2 Lüfter
  • 4 3er Schraubklemmenblöcke
  • 2 10er Buchsenleiste

DHT22

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

Pinbelegung des DHT22

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.

MSP-EXP430G2

(Solid-State-)Relais-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.

Solid- State- Relais

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 Sensoren
  • 10 3er Schraubklemmen
  • 1 36er Buchsenleiste

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.

Programmablaufplan

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

Programmablaufplan

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

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)