Climate Chamber System

Climate Chamber System © CC BY

Control and maintain stable relative humidity and temperature states to simulate natural conditions for experimental testing in the lab.

  • 262 views
  • 0 comments
  • 1 respect

Components and supplies

Apps and online services

About this project

The story

Being ecologists, we investigate organisms and their responses to natural conditions, such as variations in temperature (T) and relative humidity (RH). Sometimes it is unfavorable or simply impossible to conduct experiments on site. Additionally, it is advantageous to be able to simulate whatever conditions are desired, regardless of a right timing; as changing seasons or weather conditions might foil a plan. Also, this system could be used to pretest to know what to expect as an outcome or to validate the functionality of materials, which will be used in field. Planned experiments can be performed withoutdelay.

Our system is constructed on low-costs and could be recreated by anyone. We set the skill level to advance, because assembly requires manual dexterity and more than basic household tools, especially wiring also requires solid knowledge of electrical engineering. In contrast the coding for this project is quiet simple.

Here, we present the prototype of a climate chamber system, which was designed and constructed to perform gravimetric experiments under differing humidity conditions. So far, the option to manipulate the temperature state wasn't used, neither tested. Nonetheless, we include the devices of temperature control in our system description and the wiring.

System description and structure

The main structure is a second-hand aquarium, of the size of 49 cm x 34 cm x 25 cm. It is positioned upright, so that the aquarium bottom corresponds to the posterior wall of the chamber. Following, the named posterior wall and bottom of the chamber were each replaced by a 3 mm metal plate. Since metal has a higher thermal diffusivity, the metal plates should accelerate the distribution of cold and warmth inside the chamber, when cooling or heating is activated. The glass pane that originally served as the bottom of the aquarium was converted into a door to allow the chamber to be opened and closed. The climate chamber is positioned on top of a 10 cm high metal frame to enable positioning of devices with moisture sensitive electronics outside the system. To reach the interior of the chamber a metal pipe is integrated in the construction of the bottom plate (see detailed view above).

The electronic components include three ultrasonic nebulisers placed on the bottom as humidity sources and two peltier elements integrated into the posterior wall, as well as two heat beds installed at the bottom, to regulate temperature. For air circulation throughout the chamber, two fans are placed at the top of the anterior plane.

System circuit and connections

All of the electronics are wired on top of the machinery. The small MOSFETs are actuated by the control signal (5V) of the Arduino microcontroller, which then forward the signal (12V) to the high power MOSFETs, while one triggers the fans directly. In the latter case, the signal originating from the microcontroller uses Pulse Width Modulation (PWM) to regulate the revolutions per minute of the fan (750-3000 rpm). The high power MOSFETs are powered by the Power Adapter and are used for switching the subsequent devices, such as the peltier elements, the heat beds and the nebulisers. In the circuit of the nebulisers, two transformers are connected between the power supply and the high power MOSFETs to reduce the voltage from 12V (30A) to 24V (1A). The thermistors, display, encoder and T/RH sensor are powered directly by the power of the microcontroller, which itself is powered by the power adapter.

Programming

Again, we didn't use temperature control yet. That's why our code only includes switching of the nebulisers.

We use an Arduino Uno R3 to handle the climate control. To program the Arduino microcontroller as a controller for the climate chamber, we need to install special header files:

First, we decide for a desired relative humidity level between 30-100% humidity, using the rotary encoder. With each clockwise rotation the value changes +5, counterclockwise -5, pressing confirms the value shown in the display as the desired one. Be aware, we can only increase humidity inside the chamber by switching on the nebulisers, thus we cannot achieve values lower than those in the surrounding environment.

Our set point is then compared to the actual relative humidity level measured by the DHT22 inside the chamber. If the measured level is lower the nebulisers are switched on to moisten the air. The fans are running permanently to assure air circulation, allowing for distribution of the water droplets throughout the chamber. When the desired humidity level is reached, the program logic continues reading the actual humidity level, while the nebulisers stay off.

You can find our code for humidity control in the Code Section below.

Code

Code HumidityArduino
This is our code used to handle the switching of the nebulisers in order to maintain stable humidity conditions at a desired level.
// load libraries
#include "DHT.h"
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);

//set Pin for T/RH Sensor and specify type, give character string for output
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
char str [10];

//Hardware Pins
const int Fog = 3; //nebulisers
const int Fan = 6; //CPU Fans for air circulation
const int OK = 7;  //rotary encoder push
const int CCW = 8; //rotary encoder counterclockwise
const int CW = 9;  //rotary encoder clockwise

//Global Variables
int ack = 0;
int RH_set = 35; //start value for setting
int SET = 0;
int Direction = 0;
boolean T_condition = true;
boolean RH_condition = true;
long previousMillis = 0;
long interval = 2000;

void setup()
{
  pinMode(Fog, OUTPUT);
  pinMode(Fan, OUTPUT);
  pinMode(OK, OUTPUT);
  pinMode(CCW, OUTPUT);
  pinMode(CW, OUTPUT);

  digitalWrite(Fog, LOW);
  digitalWrite(OK, HIGH);
  digitalWrite(CCW, HIGH);
  digitalWrite(CW, HIGH);

  Serial.begin(9600);
  dht.begin();
  
  // show start page on OLED display; delay for 1.5s
  u8g.firstPage();
  do
  {
    u8g.setFont(u8g_font_helvB14);
    u8g.drawStr(10, 20, "Climate");
    u8g.drawStr(10, 40, "Chamber");
  } while (u8g.nextPage());

  delay(1500);
}

void loop()
{
  if (SET == 0)
  {
    float T = dht.readTemperature();
    float RH = dht.readHumidity();
    
    // show setting menu on OLED display
    u8g.firstPage();
    do
    {
      u8g.setFont(u8g_font_helvB08);
      u8g.drawStr(10, 20, "Set Humidity:");
      u8g.setPrintPos(20, 40);
      u8g.print(RH_set);
      u8g.drawStr(40, 40, "%");
    } while (u8g.nextPage());
    delay(100);
    
    
    while (RH_condition)
    {
      // +5 when encoder is rotated clockwise; set upper-limit to 100
      if (digitalRead(CW) == LOW)
      {
        RH_set = RH_set + 5;
        if (RH_set > 100)
        {
          RH_set = 100;
        }
        
        // show value changes on OLED display
        u8g.firstPage();
        do
        {
          u8g.setFont(u8g_font_helvB08);
          u8g.drawStr(10, 20, "Set Humidity:");
          u8g.setPrintPos(20, 40);
          u8g.print(RH_set);
          u8g.drawStr(40, 40, "%");
        } while (u8g.nextPage());
        delay(100);
      }
      
      // -5 when encoder is rotated counterclockwise; set lower-limit to 30
      if (digitalRead(CCW) == LOW)
      {
        RH_set = RH_set - 5;
        if (RH_set < 30)
        {
          RH_set = 30;
        }
        
        // show value changes on OLED display
        u8g.firstPage();
        do
        {
          u8g.setFont(u8g_font_helvB08);
          u8g.drawStr(10, 20, "Set Humidity:");
          u8g.setPrintPos(20, 40);
          u8g.print(RH_set);
          u8g.drawStr(40, 40, "%");
        } while (u8g.nextPage());
        delay(200);
      }
      if (digitalRead(OK) == LOW)
      {
        delay(100);
        RH_condition = false;
      }
    }
    
    // confirm setting to don't repeat this process
    SET = 1;
  }
  
  // continously read actual conditions via the DHT22 every 2 seconds:
  //if the difference between the current time and last time the DHT22        was read is bigger than the interval at which you want it to be read      -> read DHT22
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis > interval)
  { 
    // save the last time you read the DHT22 
    previousMillis = currentMillis;
    
    float RH = dht.readHumidity();
    float T = dht.readTemperature();
    
    // show DHT22 reading on OLED display
    u8g.firstPage();
    do
    {
      float T = dht.readTemperature();
      float RH = dht.readHumidity();
      u8g.setFont(u8g_font_helvB08);
      u8g.drawStr( 2, 20, "Temperature:");
      u8g.setPrintPos(80, 20);
      u8g.print(T);
      u8g.drawStr( 110, 20, "*C");
      u8g.drawStr( 3, 50, "Humidity:");
      u8g.setPrintPos(80, 50);
      u8g.print(RH);
      u8g.drawStr( 112, 50, "%");
    } while (u8g.nextPage());
    
    //humidity control: 
    //if humidity equal to or above set point -> nebulisers stay off
    if (RH  >= RH_set)
    {
      delay(3000);
      if (RH >= RH_set)
      {
        digitalWrite(Fog, LOW);
        analogWrite(Fan, 180);
      }
    }
    
    //if humidity below set point -> nebulisers turn on for 2s; 
    if (RH < RH_set)
    {
      delay(3000);
      if (RH < RH_set)
      {
        digitalWrite(Fog, HIGH);
        analogWrite(Fan, 180);
        delay(2000);
        digitalWrite(Fog, LOW);
      }
    }
  }
}

Comments

Similar projects you might like

Arduino Plant Water Management System w/ BME280

Project tutorial by Kutluhan Aktar

  • 9,343 views
  • 1 comment
  • 15 respects

Sun Tracking Solar System

Project tutorial by Mayur Rabadiya

  • 15,344 views
  • 8 comments
  • 27 respects

Solar-Powered Compost Monitoring System and Database

Project showcase by kaylakim20

  • 13,636 views
  • 17 comments
  • 67 respects

Hot Air Balloon or Weather Satellite Navigation System

Project tutorial by Patel Darshil

  • 3,715 views
  • 0 comments
  • 16 respects

Fire and Smoke Alarm

Project showcase by ayanfeoluwaadekanye1

  • 5,902 views
  • 10 comments
  • 8 respects
Add projectSign up / Login