BASIC4MCU | 질문게시판 | 답변 : 코드 해석 문의
페이지 정보
작성자 master 작성일2018-12-08 23:53 조회5,086회 댓글0건본문
#define Temp_set A0 // 온도 설정의 위한 아날로그 입력
#define NTC A1 // 온도 측정의 위한 아날로그 입력
#define Ref_Resistor 10000 // NTC에 연결된 직렬 저항값
#define B_Value 4200 // NTC 10KD-5J의 B값
#define NTC_Nomal_Temp 25 // NTC 10KD-5J의 기준 온도값
#define NTC_Nomal_Resistor 10000 // NTC 10KD-5J의 기준 온도에서의 저항값
#define PWM_out 3 // PWM 출력핀 설정
unsigned char fan=0;
void setup(void) {
Serial.begin(9600); // 시리얼포트 설정
pinMode(PWM_out, OUTPUT); // 디지털 6번핀을 출력모드로 설정.
}void loop(void) {
float Value, Temp; unsigned char PWM_data; unsigned int Temp_set_value;
Temp_set_value = analogRead(Temp_set);// 온도설정값 A/D변환
Temp_set_value /= 10; // 온도설정값/10로 하여 0~51까지 조정되게 함.
Value = analogRead(NTC); // NTC값 A/D변환
Value = Ref_Resistor / (1023 / Value - 1); // A/D값은 = x*1023/5로 전압값 구함.// Stein Hart 방정식에 의한 온도값 산출
Temp = Value / NTC_Nomal_Resistor; // (R/Ro)
Temp = log(Temp); // log(R/Ro)
Temp /= B_Value; // 1/B * log(R/Ro)
Temp += 1.0/(NTC_Nomal_Temp + 273.15); // {1/B * log(R/Ro)} +(1/To), To = 273.15 + NTC_Nomal_Temp
Temp = 1.0 / Temp; // 역수 취함.
Temp -= 273.15; // 화씨에서 섭씨로 바꿈.unsigned char k = Temp; // float형 Temp값을 char형 k값으로 치환
if (k <= Temp_set_value){ PWM_data = 0; fan=0;} // 온도설정값 이하일 때, PWM_out = OFF
else if (k < (Temp_set_value + 25)) { //온도설정값 이상일 때, PWM_out = k*10,
if(fan==0){
analogWrite(PWM_out, 200);
delay(200);
fan=1;
}
k -= Temp_set_value;
PWM_data = k * 10;
}
else PWM_data = 255; // 온도설정값+25℃의 값 이상일 때, PWM_out = 255(최대값)
analogWrite(PWM_out, PWM_data); // PWM_out에 PWM_data만큼의 아날로그 신호 출력
unsigned char Duty_rate = (PWM_data*100)/255; // Duty rate 계산// A/D 변환된 NTC저항값 출력
Serial.print("NTC Value : "); Serial.print(Value, 3); Serial.print("[Ω]" ); Serial.print("\t");// 현재 온도 출력
Serial.print("Temperature : "); Serial.print(Temp); Serial.print("[℃]"); Serial.print("\t");// 온도 설정값 출력
Serial.print("Temp_Setting_Value : "); Serial.print(Temp_set_value); Serial.print("[℃]");
Serial.print("\t");// PWM의 Duty rate값 출력
Serial.print("Duty_rate : "); Serial.print(Duty_rate); Serial.println("[%]");delay(500);
}
--------------------------------------------------------------
빨간 부분이 들어가므로써 하는 미치는 영향을 알고싶어요
부분적으로 해석좀 부탁드립니다.
//
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-12-08 오후 11:45:53// by Ok-Hyun Park//#define Temp_set A0 // 온도 설정의 위한 아날로그 입력#define NTC A1 // 온도 측정의 위한 아날로그 입력#define Ref_Resistor 10000 // NTC에 연결된 직렬 저항값#define B_Value 4200 // NTC 10KD-5J의 B값#define NTC_Nomal_Temp 25 // NTC 10KD-5J의 기준 온도값#define NTC_Nomal_Resistor 10000 // NTC 10KD-5J의 기준 온도에서의 저항값#define PWM_out 3 // PWM 출력핀 설정unsigned char fan=0;//void setup(void){Serial.begin(9600); // 시리얼포트 설정pinMode(PWM_out,OUTPUT); // 디지털 6번핀을 출력모드로 설정.}//void loop(void){float Value,Temp; unsigned char PWM_data; unsigned int Temp_set_value;Temp_set_value=analogRead(Temp_set); // 온도설정값 A/D변환Temp_set_value/=10; // 온도설정값/10로 하여 0~51까지 조정되게 함.Value=analogRead(NTC); // NTC값 A/D변환Value=Ref_Resistor/(1023/Value-1); // A/D값은=x*1023/5로 전압값 구함.// Stein Hart 방정식에 의한 온도값 산출Temp=Value/NTC_Nomal_Resistor; // (R/Ro)Temp=log(Temp); // log(R/Ro)Temp/=B_Value; // 1/B*log(R/Ro)Temp+=1.0/(NTC_Nomal_Temp+273.15); // (1/B*log(R/Ro))+(1/To),To=273.15+NTC_Nomal_TempTemp=1.0/Temp; // 역수 취함.Temp-=273.15; // 화씨에서 섭씨로 바꿈.unsigned char k=Temp; // float형 Temp값을 char형 k값으로 치환//if (k<=Temp_set_value ){ PWM_data=0; fan=0; } // 온도설정값 이하일 때,PWM_out=OFFelse if(k<(Temp_set_value+25)){ // 온도설정값 이상일 때,PWM_out=k*10,if(fan==0){ fan=1;analogWrite(PWM_out,200); delay(200);}k-=Temp_set_value;PWM_data=k*10;}else PWM_data=255; // 온도설정값+25℃의 값 이상일 때,PWM_out=255(최대값)analogWrite(PWM_out,PWM_data); // PWM_out에 PWM_data만큼의 아날로그 신호 출력unsigned char Duty_rate=(PWM_data*100)/255; // Duty rate 계산// A/D 변환된 NTC저항값 출력Serial.print("NTC Value: "); Serial.print(Value,3); Serial.print("[Ω]"); Serial.print("\t");// 현재 온도 출력Serial.print("Temperature: "); Serial.print(Temp); Serial.print("[℃]"); Serial.print("\t");// 온도 설정값 출력Serial.print("Temp_Setting_Value: "); Serial.print(Temp_set_value); Serial.print("[℃]");Serial.print("\t");// PWM의 Duty rate값 출력Serial.print("Duty_rate: "); Serial.print(Duty_rate); Serial.println("[%]");delay(500);}//--------------------------------------------------------------빨간 부분이 들어가므로써 하는 미치는 영향을 알고싶어요부분적으로 해석좀 부탁드립니다.
unsigned char flag=0;//if(digitalRead(2)==HIGH){ // 스위치를 눌렀다면if(flag==0){ flag=1; // 스위치를 오래 누르고 있어도 1회만 동작시키기 위해서 flag를 사용함tone(BUZ,200); delay(200); noTone(BUZ);}}else{ flag=0; } // 스위치를 누르지 않았다면 flag 변수 초기화스위치를 오래 누르고 있어도 1회만 동작시키기 위해서 위와 같은 코드를 흔히 사용합니다.
unsigned char flag=0;//if (digitalRead(2)==LOW ){ flag=0; } // 스위치를 누르지 않았다면 flag 변수 초기화else if(digitalRead(2)==HIGH){ // 스위치를 눌렀다면if(flag==0){ flag=1; // 스위치를 오래 누르고 있어도 1회만 동작시키기 위해서 flag를 사용함tone(BUZ,200); delay(200); noTone(BUZ);}}질문 소스는 else와 if 위치가 바뀌어 있어서 이런 형태와 유사합니다.
analogWrite(PWM_out,200); delay(200);
출력을 최소 200ms 주기 위해서 사용하고 있습니다.
fan 변수가 flag 변수와 같은 기능입니다.
댓글 0
조회수 5,086등록된 댓글이 없습니다.