0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Arduinoとペルチェ素子でデグーの空調を工作

Last updated at Posted at 2023-05-28

材料

Arduino UNO R3 1つ

18B20 1つ :RoomTemp 大気温を図るための1 wire通信定番の温度センサーこれを使って、エアコンのON/OFFを制御する

NTC 3950 10k サーミスタ2つ: ①TempHearter熱い側の温度,②TempCooler冷たい側の温度。この2つの温度を測定しながら、エアコンON/OFFを制御する

5V制御 10A リレーモジュール1つ: ①RelayHearter 熱い側のFanとペルチェを制御するリレー、②RelayCooler ペルチェ冷たい側のFanを制御するリレー

ペルチェ素子 TEC1-12706  1つ:空調本体
ペルチェ素子は、ある方向に直流電流を流すと、素子の片面で吸熱(冷却)し、片面で発熱(加熱)する。今回は発熱側を冷やしながら(冷やさないと壊れるので)、冷却側の冷気をFanで冷房を作ることにする。

Fan 2つ:①ペルチェ素子の熱い側は大きめのFan、②ペルチェ素子の冷たい側は小さめのFan

回路

(9Vバッテリーの絵は実は12V電源)
回路.PNG

コード

#include <DallasTemperature.h>
#define pin_ONE_WIRE 11
OneWire oneWire(pin_ONE_WIRE);       
DallasTemperature sensors(&oneWire); 
DeviceAddress temp; 

#define pin_RelayHeater 12
#define pin_RelayCooler 13
#define RelayHeater_OFF  digitalWrite(pin_RelayHeater, 0)
#define RelayCooler_OFF  digitalWrite(pin_RelayCooler, 0)
#define RelayHeater_ON  digitalWrite(pin_RelayHeater, 1)
#define RelayCooler_ON  digitalWrite(pin_RelayCooler, 1)
#define pin_HeaterTemp A0
#define pin_CoolerTemp A2
#define pin_RoomTemp 3
float B  = 3950;   
float T0 = 298.15; 
float R0 = 10000;  
float R1 = 10000;  
int HeaterTemp = 25;
int CoolerTemp = 25;
int RoomTemp = 25;
float flag_RelayHeater;
float flag_RelayCooler;

int read_ThermistorVale(int pin_Analog){
  int ReadVal = analogRead(pin_Analog);         
  float vout = (float)ReadVal / 1024.0f * 5.0f; 
  float rth = ( 5.0f / vout -1 ) * R1;          
  float tempK = 1 / ( 1/B * log( rth / R0 ) + ( 1/T0 )); 
  float tempC = tempK -273.15;
  tempC = round(tempC);
  return tempC;
}

void Get_Temp(){
    HeaterTemp = read_ThermistorVale(pin_HeaterTemp);
    CoolerTemp = read_ThermistorVale(pin_CoolerTemp);
    sensors.requestTemperatures(); //リアルタイム性求めないから、応答待ちにする
    RoomTemp = sensors.getTempC(temp);           
}

void setup()
{
    Serial.begin(9600);
    sensors.begin(); 
    pinMode(pin_RelayHeater, OUTPUT );
    pinMode(pin_RelayCooler, OUTPUT );
    RelayCooler_OFF;
    RelayHeater_OFF;
    flag_RelayHeater = 0;
    flag_RelayCooler = 0;

    int j=0;
    do{
        Get_Temp();
        j++;
        delay(200);
    } while(j<20);
}

boolean Req_HearterRelay = 0;
boolean Req_CoolerRelay = 0;
boolean sta_HearterRelay = 0;
boolean sta_CoolerRelay = 0;

void loop()
{
    Get_Temp();
    Req_HearterRelay = Decide_HearterRelay();
    if (sta_CoolerRelay != Req_CoolerRelay){
        sta_CoolerRelay = Req_CoolerRelay ;
        if (Req_CoolerRelay == 1) RelayCooler_ON;
        if (Req_CoolerRelay == 0) RelayCooler_OFF;
    }
    Req_CoolerRelay = Decide_CoolerRelay();
    if (sta_HearterRelay != Req_HearterRelay){
        sta_HearterRelay = Req_HearterRelay ;
        if (sta_HearterRelay == 1) RelayHeater_ON;
        if (sta_HearterRelay == 0) RelayHeater_OFF;
    }
    delay(200);
}

boolean Decide_HearterRelay(){
    if (RoomTemp < 25 || HeaterTemp > 50 || CoolerTemp < 20){
        return 0;
    }
    if (RoomTemp > 28 && HeaterTemp < 40 ){
        return 1;
    }
}

boolean Decide_CoolerRelay(){
    if (CoolerTemp < RoomTemp - 4){
        return 1;
    }
    if(CoolerTemp + 3 >= RoomTemp){
        return 0;
    }
}

テスト結果

室温が27の環境下でHearter側は大体40度くらい保持していて、Coolerが大体23度くらいキープした感じ。Cooler側のヒートーシンクは結露して水が発生したので、下に受け皿を入れて対策。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?