材料
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
回路
コード
#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側のヒートーシンクは結露して水が発生したので、下に受け皿を入れて対策。