마음 속 하늘은 항상 맑음~!
아두이노를 이용한 쿨링팬 컨트롤. 본문
간단하게 아두이노를 이용한 쿨링팬 컨트롤. 센서로는 NTC-502F397을 사용한다고 가정하고, 써미스터는 접지쪽에 연결하고 저항 2.2k를 VCC쪽에 연결하는 방식을 택했다.
저항을 계산해내는 방식에 전압에 의지하는 공식은 오차를 동반하는 것 같아 저항을 기준으로 하는 공식으로 변경했다. 이 공식을 사용하면 전압의 변화와 상관없이 저항을 제대로 산출할 수 있다. 저항은 1%오차의 푸르딩딩한 저항을 사용하면 좋다.
/*
Fan PWM Control by Temperature for arduino uno.
*/
int PinFanPWM=9;
int Pinanalog=0;
int Temp_low=20,Temp_high=30; // min, max
long x=0, Resister_temp=2200; // 2.2k upper resister with thermistor
long th=0;
float ce=0;
int FanPWMBase=77; // 30% in 255;
int FanPWMInc=(255-FanPWMBase)/(Temp_high-Temp_low)+1; // (255-77)/10
int TempVal;
int FanPWM;
void setup()
{
pinMode(PinFanPWM,OUTPUT);
Serial.begin(9600);
}
void loop()
{
// get temperature from your sensor
TempVal=analogRead(Pinanalog);
th = Resister_temp * TempVal / (1024-TempVal); // get resister value.
// ntc-502F397 formula
ce = ((log(4.0*th - 3000.0) / (-0.024119329) + 473)-32.0)/1.8;
// calc PWM Value
TempVal=(int)ce;
Serial.println(TempVal);
if (TempVal<Temp_low) {
FanPWM=FanPWMBase;
} else {
FanPWM=FanPWMBase+(TempVal-Temp_low)*FanPWMInc;
if (FanPWM>255) {
FanPWM=255;
}
}
analogWrite(PinFanPWM,FanPWM);
//Serial.println(FanPWM);
}
아직 실험해보지 않은 코드로 PWM값과 온도값이 시리얼포트로 전송된다. 이것은 실험후 지워질 예정.
20도에서 30도의 영역으로 20도에서는 30%PWM으로 30도에서는 풀로드가 된다. 트랜지스터 등을 이용해서 12V를 공급하는 방식으로 하면 된다.
코드에 실수가 있어서 약간의 변경. ce를 TempVal로 변환하도록 조정.
테스트를 해본 결과. 아두이노가 온도가 더 정확. 브레드보드의 접점의 금속탓인가. 여튼 더 정확해보이는 값이 나오는 것 같다. 아날로그 온도계만 있어서 정확한 온도는 모르겠다. PIC의 테이블 연산치보다는 정확한 듯 싶다.
PWM도 정상적으로 값이 뜨는 것을 확인.
아두이노의 온도관련 실험은 이걸루 끝 =_=;
'하드웨어' 카테고리의 다른 글
12F675에 대한 이야기 더하기 아두이노 전원부 이야기. (0) | 2014.08.14 |
---|---|
Code Block for arduino. (0) | 2014.08.09 |
아두이노 우노와의 만남. (0) | 2014.08.07 |
12F675로 만든 쿨링팬 컨트롤러. (2) | 2014.07.29 |
만든게 다른 Joule Thief 였었다니. (0) | 2014.07.18 |