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

材料
=
Arduino UNO R3 １つ

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

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

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

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

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

回路
=
（9Vバッテリーの絵は実は12V電源）
![回路.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3181208/6aef795b-ea76-d240-d137-075f9c6a43a3.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側のヒートーシンクは結露して水が発生したので、下に受け皿を入れて対策。