Skocz do zawartości
qbas0600

Komora klimatyczna

Pomocna odpowiedź

Napisano (edytowany)

   DSC_3515.thumb.JPG.7085abd4ec44d564b5897e7221c5f966.JPG       

 Komory klimatyczne, to urządzania, które umożliwiają wytworzenie w ich wnętrzu klimatu o ściśle określonych parametrach. Badanie próbek materiałowych oraz organizmów żywych, używając tych urządzeń, pozwala na szybkie sprawdzenie jak zachowa się badany obiekt w zmiennych warunkach klimatycznych, jak również przy długotrwałym niekorzystnym oddziaływaniu zjawisk atmosferycznych. Konstrukcja przemysłowych komór pozwala na osiągnięcie temperatur nawet w granicach od  -90°C do +180°C

Powodem budowy komory klimatycznej jest chęć stworzenia przy wykorzystaniu powszechnie dostępnych materiałów, konstrukcji innej niż istniejące obecnie. Dostępnych jest wiele urządzeń komercyjnych jednak ich cena sprawia, że grono użytkowników jest bardzo niewielkie. Choć prezentowana komora klimatyczna nie posiada parametrów pracy takich jak komory wykorzystywane w przemyśle, to opracowanie to zawiera rozwiązania pozwalające na przeprowadzanie testów w kontrolowanych warunkach.

Jako materiał na konstrukcje komory zostało wybrane szkło jako materiał obojętny chemicznie i łatwy w czyszczeniu. Podstawą konstrukcji jest stare akwarium, w którym częściowo zostały usunięte ścianki i wklejone nowe. Na konstrukcję wentylacji i nagrzewnicy wybrałem popularne i łatwe w obróbce PCV. Pokrywę komory wykonałem z sklejki zabezpieczonej przed wilgocią lakierem akrylowym. Całość komory została zaprojektowana w oprogramowaniu Autodesk Inventor.

edesf.thumb.jpg.fe3e444881183d6b8b746bf44fc78541.jpgeeeee.thumb.jpg.8fd1056bcbdb0335bdd92b0ce9d443c5.jpg

W konstrukcji wykorzystano gotowe moduły co ułatwiło wykonanie prototypu jak i później gotowego urządzenia.

Do mierzenia czasu wykorzystano moduł zegara DS3231, który posiada wewnętrzny termometr oraz wewnętrzny kwarc, przez co nie jest wrażliwy na zmiany temperatury otoczenia. Komunikuję się on z Arduino poprzez magistrale i2c. Na początku używałem zegar DS1302 jednak potrafił się on rozjechać nawet 8 minut na tydzień.

Kolejnym modułem korzystającym z tej magistrali jest wyświetlacz LCD 4x20 z adapterem na i2c:

DSC_3290.thumb.JPG.073690da7cc63fede8427ad2057589c5.JPG

Dzięki wykorzystaniu tej magistrali oba moduły do komunikacji i przesyłania danych wykorzystują tylko dwa porty w Arduino dzięki czemu nie blokujemy i tak małej ilości portów.

Kolejnym modułem jest czujnik wilgotności DHT22. Jest to zintegrowany miernik temperatury i wilgotności z zakresem 0-100% wilgotności oraz temperatury z przedziału -40/+80 stopni Celsjusza. Jego dokładność to 0,5 stopnia w przypadku temperatury i 2% w przypadku wilgotności. Tak jak w przypadku zegara tak i w tym na początku używałem DHT11 jednak nie sprawdził się on tak jak chciałem.

Do mierzenia zewnętrznej temperatury wykorzystałem cyfrowy termometr DS18B20. Elementem odpowiedzialnym za utrzymanie temperatury są dwa ogniwa Peltiera o poborze prądu 6A przy napięciu 12V.

Nie jest to wyjątkowo wydajny element i potrzeba do zasilenia go dość wydajnego źródła prądowego jednak spełnia swoje zadanie. Ogniwa z racji wytwarzanego ciepła zostały zamontowane wewnątrz komory wymiennika ciepła na płycie wykonanej z teflonu.

Całość zasilana jest z zasilacza impulsowego do oświetlenia LED o wydajności 15A.

W celu utrzymania stałej wilgotności wykorzystałem pompę wibracyjną ULKA:

DSC_3259.thumb.JPG.d8966410cb912826e2296518992aaee6.JPGdwadawd.thumb.jpg.f40db15d61a05c5fc1bdc57be7ee203a.jpg

podpiętą do dyszy zamgławiającej. Jest to pompa wytwarzająca ciśnienie do 14 barów. W moim przypadku zmierzony przepływ wyniósł 100ml w minutę co według wykresu producenta odpowiada ciśnieniu 12 barów. Jest to wystarczające ciśnienie do wytworzenia mgły z wody która równomiernie rozchodzi się wewnątrz komory.

Do oświetlenia komory wykorzystałem paski LED. Kolor biały to pasek o wysokim współczynniku CRI, który odpowiada za prawdziwe odzwierciedlenie barw.

Jako układ sterujący zostało wykorzystany klon Arduino ProMini a algorytm sterowania napisany w środowisku Arduino IDE. Kod programu powstawał dość długo i w trakcie jego pisania doszło kilka pomysłów a inne zostały odrzucone. W wyniku takiego pisania tak się zamieszałem, że musiałem zacząć pisać program od nowa bazując na starym kodzie. Jestem świadomy, że kod nie jest idealny a nawet skuszę się na określenie go słowem „trywialny”, jednak działa wiec dla mnie jest spoko 🙂.

/***********************************************

 Sterowanie terrarium
 Komora klimatyczna
 Stefan v2.0
                                                          
 
*************************************************/

#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Time.h>
#include <DS3231.h>
#include <OneWire.h>
#include <DS18B20.h>

const char* miesiac[] =
 { "12", "01", "02", "03", "04", "05", "Cz", "07", "08", "09", "10", "11"}; //miesiące

byte zmierzch_znak[8] =               //stworzenie grafik na wyswietlacz
{
    B00111,
    B01110,
    B11100,
    B11100,
    B11100,
    B01110,
    B00111,
    B00000,
};

byte swit_znak[8] =                         
{
    B00000,
    B10101,
    B01110,
    B11111,
    B01110,
    B10101,
    B00000,
    B00000,
};

byte kropla[8] = 
{
    B00100,
    B00100,
    B01110,
    B01110,
    B11111,
    B11111,
    B11111,
    B01110,
};

byte termometr[8] =                         
{
    B00100,
    B01010,
    B01010,
    B01010,
    B01110,
    B11111,
    B11111,
    B01110,
};

byte stopienC[8] = 
{
    B01100,
    B10010,
    B10010,
    B01100,
    B00000,
    B00000,
    B00000,
    B00000,
}; 

byte pusty[8] = 
{
    B00000,
    B00000,
    B00000,
    B11111,
    B00000,
    B00000,
    B00000,
    B00000,
}; 

int i = 1;                                                          //licznik to przewijania ekranu
int swit;                                                           //zmienna zamiany czasu switu na minuty
int zmierzch;                                                       //zmienna zamiany czasu zmierzchu na minuty
int noc;                                                            //zmienna zamiany czasu nocy na minuty
int w_rano;                                                         //zmienna zamiany czasu wietrzenia rano na minuty
int w_wiecz;                                                        //zmienna zamiany czasu wietzrenia wieczorem na minuty
int czas_m;                                                         //zmienna zamiany godziny na minuty
int czas_s;                                                         //zmienna zamiany godziny na sekundy

///////////////////////////////////////////////////////////////////PARAMETRY KOMORY KLIMATYCZNEJ//////////////////////////////////////////////////////////////////////////////////////

float termostat = 30.0;                                             //ustawienie temperatura
float higrometr = 20.0;                                             //ustawienie wilgotności
float swit_h = 8.0;                                                 //godzina switu
float swit_m = 30.0;                                                //minuta switu
float zmierzch_h = 19.0;                                            //godzina zmierzchu
float zmierzch_m = 1.0;                                             //godzina zmierzchu
float noc_h = 22.0;                                                 //godzina nocy
float noc_m = 20.0;                                                 //minuta nocy
int przew_rano_h = 8.0;                                             //przewietrzanie rano
int przew_rano_m = 30.0;                                            //minuta wietrzenia rano
int przew_wieczorem_h = 20.0;                                       //przewietrzanie wieczorem
int przew_wieczorem_m = 10.0;                                       //minuta wietrzenia wieczorem
int za_mokro = 80;                                                  //wymuszenie wentylacji gdy zbyt duza wilgotnosc

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

DS3231 clock;
RTCDateTime dt;

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);      //adresowanie wyswietlacza

DHT dht;                                                            //deklaracja czujnika
                                                
#define ONEWIRE_PIN 15                                              // komikacja one wire pin D15
byte address[8] = {0x28, 0xEE, 0x14, 0x6F, 0x1F, 0x16, 0x2, 0xA2};  // Adres czujnika
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

#define PWM_PIN 6                                                   //PWM do peltiera na pin 6

void setup()                                                        /*setup tylko raz*/
{
  Wire.begin();
  lcd.begin(20,4);
  //lcd.noBacklight();                                                 // inicjalizacja ekranu, podswietlenia i
  lcd.backlight();                                                  // znakow urzytkownika
  lcd.clear();
  lcd.createChar(1,pusty);
  lcd.createChar(2,stopienC);
  lcd.createChar(4,zmierzch_znak);
  lcd.createChar(5,swit_znak);
  lcd.createChar(6,termometr);
  lcd.createChar(7,kropla);

  dht.setup(2);                                                      // data pin 2

  sensors.begin(9);                                                  // start dallasa
  sensors.request(address);
  
  clock.begin();
  //clock.setDateTime(__DATE__, __TIME__);                          //czas kompilacji jako czas zegara
                                                              
  pinMode(13, OUTPUT);                                              //pin do zraszacza
  pinMode(12, OUTPUT);                                              //pin do zewnetrznego wentylatora
  pinMode(8, OUTPUT);                                               //pin do schladzania
  pinMode(9, OUTPUT);                                               //pin do podgrzewania
  pinMode(5, OUTPUT);                                               //wolny pin 230V~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  pinMode(7, OUTPUT);                                               //pin do wentylatora peltiera i mieszania
  pinMode(PWM_PIN, OUTPUT);                                         //pin PWM do peltiera
  analogWrite(PWM_PIN, 255);                                        //PWM peltiera wypełnienie 0->0% 127->50% 255->100% 
  pinMode(11, OUTPUT);                                              //pin PWM do LED bialy
  pinMode(10, OUTPUT);                                              //pin PWM do LED czerwony
  pinMode(15, INPUT);                                               //DALLAS 18B20
}
void loop()                                                         /*petla glowna*/
{
   oblicznia();                                                     //obliczenia na potrzeby czasowek
   wilgotnosc_temperatura_WSKAZNIKI();                              //wyswietlanie temp i wilg
   swit_zmierzch_czas();                                            //wyswietlanie czas, swit i zmierzch
   termostat_higrostat();                                           //uruchomienie termostatu i higrostatu
   sterowanie_swiatlem();                                           //uruchomienie sterowania oswietlenia
   przewietrzanie();                                                //przewietrzanie komory
}
void wilgotnosc_temperatura_WSKAZNIKI() 
{       
       float humidity = dht.getHumidity();
       float temperature = dht.getTemperature();
       float temperatureDALLAS = sensors.readTemperature(address);
       
       lcd.setCursor(0, 2);
       lcd.print("I:");
       lcd.write(6);  
       afisare2cifre(temperature);
       lcd.write(2);
       lcd.print("C ");

       lcd.write(7);
       afisare2cifre(humidity);
       lcd.print("%  ");
       
       lcd.setCursor(14, 2);
       lcd.print("O:");
       afisare2cifre(temperatureDALLAS);                     //CZUJNIK DALLAS analog 1 -> digital 15
       lcd.setCursor(18, 2);
       lcd.write(2);
       lcd.print("C");
       

       lcd.setCursor(0, 3);
       lcd.print("SET");
       lcd.print(":");
       lcd.write(6);
       afisare2cifre(termostat);
       lcd.write(2);
       lcd.print("C ");

       lcd.write(7);
       afisare2cifre(higrometr);
       lcd.print("%");

       sensors.request(address);
}
void swit_zmierzch_czas()
{ 
       dt = clock.getDateTime();
              
       lcd.setCursor(0, 0);
       afisare2cifre(dt.hour);
       lcd.print(":");
       afisare2cifre(dt.minute);
       lcd.print(":");
       afisare2cifre(dt.second);
       
       lcd.setCursor(9,0);
       afisare2cifre(przew_rano_h);
       lcd.print(":");
       afisare2cifre(przew_rano_m);
       lcd.setCursor(15,0);
       afisare2cifre(przew_wieczorem_h);
       lcd.print(":");
       afisare2cifre(przew_wieczorem_m);

       lcd.setCursor(0,1);
       lcd.write(5);
       afisare2cifre(swit_h);
       lcd.print(":");
       afisare2cifre(swit_m);
       lcd.setCursor(7,1);
       lcd.write(4);
       afisare2cifre(zmierzch_h);
       lcd.print(":");
       afisare2cifre(zmierzch_m);
       lcd.setCursor(14,1);
       lcd.print("X");
       afisare2cifre(noc_h);
       lcd.print(":");
       afisare2cifre(noc_m);
}
/******************************TERMOSTAT + HIGROSTAT***************************/
void termostat_higrostat()              
{
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
    
if(temperature > termostat + 2 | temperature < termostat - 2 )
  {
  digitalWrite(7, HIGH);                                            //wentylator pieltiera i mieszania
  lcd.setCursor(15,3);
  lcd.print("M");
  }
  else
  {
  digitalWrite(7, LOW);                                             //wylaczenie wentylatora peltiera i mieszania
  lcd.setCursor(15,3);
  lcd.write(1); 
  }
if(humidity < higrometr + 5)
  {
  digitalWrite(13, HIGH);                                           //wlaczenie zraszacza    
  lcd.setCursor(16,3);
  lcd.print("Z");
  }
  else
  {
  digitalWrite(13, LOW);                                            //wylaczenie zraszacza
  lcd.setCursor(16,3);           
  lcd.write(1);
  }  
if(temperature > termostat + 2 )                                    //schladzanie terrarium
  {                              
  digitalWrite(8, HIGH);                                            //zamiana polaryzaji i podanie napiecia na ogniwo 2
  lcd.setCursor(17,3);
  lcd.print("C");
  }  
  else
  {
   digitalWrite(8, LOW);                                            //polaryzacja startowa
   lcd.setCursor(17,3);
   lcd.write(1);
  }

if(temperature < termostat - 2 | temperature > termostat + 2 )     //podgrzewanie terrarium
  {
  digitalWrite(9, HIGH);                                           //podanie zasilania do ogniwo 1
  }
  else
  {
   digitalWrite(9, LOW);                                           //odciecie zasilania od ogniwa 1
  }
if(temperature < termostat - 2)
  {
  lcd.setCursor(18,3);
  lcd.print("G");
  }
  else
   {
    lcd.setCursor(18,3);
    lcd.write(1);
   }
}
/****************************STEROWANIE OSWIETLENIEM*********************************/
void sterowanie_swiatlem()
{  
  if(czas_m >= swit && czas_m < zmierzch)
    {
      digitalWrite(11, HIGH);
    }
    else
      {
        digitalWrite(11, LOW);
      }
  if(czas_m >= zmierzch && czas_m < noc)
    {
      digitalWrite(10, HIGH);
    }
    else
      {
        digitalWrite(10, LOW);
      }
}
/***************************PRZEWIETRZANIE***********************************/
void przewietrzanie()                                              
{ 
  float humidity = dht.getHumidity();
  float temperatureDALLAS = sensors.readTemperature(address);
       
  if(humidity > za_mokro)                                           //gdy wlgotnosc za wysoka -> wietrzenie
    {
      digitalWrite(12, HIGH);                                       //przewietrzanie na ON
      lcd.setCursor(19,3);
      lcd.print("W");
    }
    else
      {  
      if(temperatureDALLAS < 30)                                    //warunek odnosnie 30* zewnetrznej
        {
        if(czas_m == w_rano || czas_m == w_wiecz)
          {
            digitalWrite(12, HIGH);
            lcd.setCursor(19,3);                                   
            lcd.print("W");
          }
          else
            {
              digitalWrite(12, LOW);
              lcd.setCursor(19,3);
              lcd.write(1);
            }
        }
      }

    sensors.request(address);
}
/****************************OBLICENIA*****************************/
void oblicznia()
{
 dt = clock.getDateTime();
 
 czas_m = dt.hour * 60 + dt.minute;                                //zamiana godziny na minuty
 czas_s = 100 * dt.hour + 10 * dt.minute + dt.second;              //zamiana godziny na zmienna z sekundami
 swit = swit_h * 60 + swit_m;                                      //zamiana godziny switu na minuty
 zmierzch = zmierzch_h * 60 + zmierzch_m;                          //zamiana godziny zmierzchu na minuty
 noc = noc_h * 60 + noc_m;                                         //zamiana godziny nocy na minuty
 w_rano = przew_rano_h * 60 + przew_rano_m;                        //zmienna godziny przewietrzania rano na minuty
 w_wiecz = przew_wieczorem_h * 60 + przew_wieczorem_m;             //zmienna godziny przewietrzania na minuty
}
/*****************************************************************/
void afisare2cifre(int numar)                                       //Funkcja odpowiedzialna za wyswietlanie zer na pozycji poprzedzającej jesli cyfra jest mniejsza od 10
{ 
         if (numar >= 0 && numar < 10) 
          {
           lcd.write('0');
          }
         lcd.print(numar);
}

Schemat jak i płytkę PCB zaprojektowałem w EAGLE. Wykonana w domu metodą termotransferu. Kilkukrotnie planowałem przejść na metodę fotochemiczna jednak jakoś cena termotransferu bardziej mi odpowiada. W pierwszej wersji zastosowane były same tranzystory, jednak scenariusz przełączania polaryzacji ogniw (zamiana strony ciepłej i zimnej) nie był tak niezbędny jak na początku planowałem i kolejna wersja PCB została przerobiona na przekaźniki. Zostały jedynie tranzystory do sterowania PWM modułów Peltiera, sterujące wentylacją oraz sterujące oświetleniem. Dodatkowo dzięki przekaźnikom można podpiąć urządzenia o różnym napięciu co daje możliwość rozbudowy komory. Sterowanie urządzeniami zasilanymi napięciem AC230V odbywa się poprzez triaki. Jeden wykorzystany jest do sterowania pompka ciśnieniową a jeden pozostał w zapasie. Sterownik został wykonany w formie kanapki aby zminimalizować jego rozmiary. Do górnej płytki podpięte są układy odpowiedzialne za pomiar parametrów komory, czasu, wyświetlacz. Do dolnej natomiast wszystkie urządzenia, które są sterowane.

DSC_3391.thumb.JPG.f339892935bf4d888bdb1f366d9c0427.JPGwadawd.thumb.jpg.963029f8f45cd78dfffc4482b360bb7c.jpgwadawdawd.thumb.jpg.d917f3a6fda6270754e1cc8f50b728a8.jpg

Prezentowana komora powstała jaka praca inżynierska na kierunku mechatronika. Docelowym przeznaczeniem komory było nowe mieszkanie dla mojego gekona, jednak przerabianie na terrarium nie doszło jeszcze do końca.

DSC_3062.JPGDSC_3106.JPGDSC_3164.JPGDSC_3242.JPG

 

komora.rar

Edytowano przez qbas0600
  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

@qbas0600, właśnie zaakceptowałem opis. Dziękuję za przedstawienie ciekawego projektu, zachęcam do prezentowania kolejnych DIY oraz aktywności na naszym forum 😉

Udostępnij ten post


Link to post
Share on other sites

Do jakiej minimalnej temperatury jesteś w stanie zejść?

Udostępnij ten post


Link to post
Share on other sites

Maksymalnie udało mi się zejść 5 stopni poniżej temperatury otoczenia. Ogniwa peltiera nie nadają się do chłodzenia takiego "pojemnika". Zbyt kiepska izolacja. Dla porównania w lodówce samochodowej spisują się świetnie a pojemność podobna.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

A nie myślałeś o dodaniu wentylatorów? Szybsze odprowadzanie ciepła może poprawić ich działanie, bo zdawanie się na samą konwekcję może faktycznie dużo nie dać. No i przy słabej izolacji to nawet system chłodzenia z lodówki zwykłej dużo ci nie da. No i PTFE jest raczej słabym przewodnikiem cieplnym, lepiej użyć płyty aluminiowej.

Edytowano przez szczawiosław

Udostępnij ten post


Link to post
Share on other sites

-5*C to faktycznie tylko do terrarrium się nada 😄 Jestem ciekaw do ilu zejdzie gdy zastosuje się dobrą izolację. Fajnie byłoby potestować budowane układy w ekstremalnych warunkach 🙂

Udostępnij ten post


Link to post
Share on other sites
6 minut temu, szczawiosław napisał:

A nie myślałeś o dodaniu wentylatorów? Szybsze odprowadzanie ciepła może poprawić ich działanie, bo zdawanie się na samą konwekcję może faktycznie dużo nie dać. No i przy słabej izolacji to nawet system chłodzenia z lodówki zwykłej dużo ci nie da. No i PTFE jest raczej słabym przewodnikiem cieplnym, lepiej użyć płyty aluminiowej.

Co do wymuszenia wentylacji to są zamontowane wentylatory na każdy radiator po jednym. W srodku wymiennika, dwa radiatory mają jeden wentylator zamontowany w celu mieszania powietrza w komorze i odbierają zimne lub ciepłe powietrze z ogniw. Co to plyty z PTFE to zamontowana jest ona jako jedna scianka wymiennika oraz jako mocowanie do radiatorów i ustabilizowanie ogniw termoelektrycznych. Jakos musiałem uszczelnić komore wymiennika ciepła a ogniwa potrafią się dobrze nagrzać co mogło by spowodować deformacje scianki gdy była by zrobiona z PCV.

@msalamon to schładzanie zostało dodane jako "bajer" bo nie spodziewałem się oszałamiającego efektu. Nie będzie ono używane w terrarium. Jak bym miał testować układ w niskich temperaturach to bym do zamrażarki go wsadził 🙂

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Faktycznie wentylatory przegapiłem 🙂 Rozumiem że peltiery masz zamocowanie po obu stronach bezpośrednio do radiatorów? A o paście nie zapomniałeś (wiem że pytanie głupie, ale bywa i tak 🙂 )?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@szczawiosław z konstrukcja jest dokładnie tak jak piszesz. Radiatory są skręcone ze sobą na sprężynach tak jak to sie robi w radiatorach do PC. Zapewnia to dobry i równy docisk do ogniw. A co pasty to jest, a nawet wykosztowałem się w taką o lepszych parametrach niż silikonowa.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×