마음 속 하늘은 항상 맑음~!

아두이노를 이용한 쿨링팬 컨트롤. 본문

하드웨어

아두이노를 이용한 쿨링팬 컨트롤.

파르셀수스 2014. 8. 8. 23:50

 간단하게 아두이노를 이용한 쿨링팬 컨트롤. 센서로는 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도 정상적으로 값이 뜨는 것을 확인.


 아두이노의 온도관련 실험은 이걸루 끝 =_=;