#define Thermistor_R 100000 //써미스터가 상온(25도)일때의 저항값 #define Temp_Norm 25 //상온 기준 #define Num_Samples 3 //평균할 샘플링 반복 수 #define B_Coeffecient 3950 //써미스터의 베타계수(usually 3000-4000) #define S_Resitor 100000 //써미스터와 연결한 저항의 저항값 //Attiny 85 기준으로 설정함. // ┍━━━━━┑ // RESET ┥1 8┝ 5V // A3/D3 ┥2 7┝ D2/A1/SCK/SCL // PWM4/A2/D4 ┥3 6┝ D1/PWM1/MISO // GND ┥4 5┝ D0/PWM0/MOSI/SDA/Aref // ┕━━━━━┙ // ATTINY85 //Attiny85용 핀아웃 #define Thermistor_Pin A1 //A1(P2) 핀을 써미스터 측정 핀으로 설정 #define Fan_Control_Pin 1 //D1(6) 핀을 팬 컨트롤용 핀으로 설정 #define Setting_Pin A3 //A2(D4:3) 핀을 세팅용 핀으로 설정 //세팅용 핀은 현재 온도값을 +-10도 조정해주는 역할을 하는데 //개인 편의에 따라 바꾸면 좋을듯. #define Min_Temp 25 //온도범위 내에서의 최소값. 이 이하에서는 설정된 PWM값만 출력한다. #define Max_Temp 35 //온도범위 내에서의 최대값. (작동을 보기 위해 35도로 조정.) #define Min_PWM 0 //PWM 최소값. #define Max_PWM 254 //PWM 최대값. int samples[Num_Samples]; float Fan_PWM; //PWM출력용 변수 float Celsius; //섭씨온도 저장용 변수. float Ratio; //출력 레벨 조정용 변수. int i; //for 문 임시변수. 왜인지 loop안에 넣으니 에러가 나서 전역변수로 설정. void setup(void) { TCCR0B = TCCR0B & 0b11111000 | 0b001; //Attiny85의 PWM주파수를 변경. pinMode(Fan_Control_Pin, OUTPUT); analogWrite(Fan_Control_Pin, 254); //처음 구동시 팬 속도 최고로 작동. } void loop(void) { //이하 아날로그 인풋으로 N_Samples번 만큼 써미스터 측정 for (i=0; i< Num_Samples; i++) { samples[i] = analogRead(Thermistor_Pin); delay(5); } float average = 0; for (i=0; i< Num_Samples; i++) { average += samples[i]; } average /= Num_Samples; //측정값을 저항값으로 변환 average = 1023 / average - 1; average = S_Resitor / average; //저항값을 섭씨온도로 변환 Celsius = average / Thermistor_R; // (R/Ro) Celsius = log(Celsius); // ln(R/Ro) Celsius /= B_Coeffecient; // 1/B * ln(R/Ro) Celsius += 1.0 / (Temp_Norm + 273.15); // + (1/To) Celsius = 1.0 / Celsius; // Invert Celsius -= 273.15; // convert to C Ratio = analogRead(Setting_Pin); Ratio = map(Ratio, 0, 1023, -10, 10); Celsius = Celsius + Ratio; Fan_PWM = map(Celsius, Min_Temp, Max_Temp, Min_PWM, Max_PWM); //온도값을 0~255 범위의 PWM으로 매핑한다. Fan_PWM = constrain(Fan_PWM, Min_PWM, Max_PWM); analogWrite(Fan_Control_Pin, Fan_PWM); //PWM을 출력한다. delay(1000); }