BASIC4MCU | 질문게시판 | 답변 : 아두이노 else if Relay 관련 질문
페이지 정보
작성자 master 작성일2022-12-08 17:01 조회1,250회 댓글1건본문
const int Relay3=13,Relay2=12,Relay1=11;
const int cutline=2,sensorIn=A1;
//
int Relay3stat=0,Relay2stat=0,Relay1stat=0;
int mVperAmp=100; // use 100 for 20A Module and 66 for 30A Module
double Voltage=0,VRMS=0,AmpsRMS=0;
float Value,amp;
//-------------------------------------------------
void Led_off(int k){ for(int i= k;i>2;i--)digitalWrite(i,0); }
void Led_on(int k) { for(int i=10;i>k;i--)digitalWrite(i,1); }
//
float getVPP(){
float result;
int readValue,maxValue=0,minValue=1023;
uint32_t start_time=millis();
while((millis()-start_time)<1000){ // sample for 1 Sec
readValue=analogRead(sensorIn);
if(readValue>maxValue)maxValue=readValue;
if(readValue<minValue)minValue=readValue;
}
//
result=((maxValue-minValue)*5.0)/1023.0;
return result;
}
//
void setup(){
Serial.begin(9600);
pinMode(A1,INPUT); //전류센서
pinMode(A2,INPUT); //릴레이3 체크
pinMode(A3,INPUT); //릴레이2 체크
pinMode(11,OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); //릴레이3
pinMode(2,OUTPUT); //부저
pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); //초록5
pinMode(8,OUTPUT); pinMode(9,OUTPUT); //노랑2
pinMode(10,OUTPUT); //빨강
}
//
void loop(){
Voltage=getVPP(); VRMS=(Voltage/2.0)*0.707; AmpsRMS=(VRMS*1000)/mVperAmp;
Serial.print(AmpsRMS); Serial.println(" Amps RMS");
delay(500);
//------------------------------------------------------------------
if (AmpsRMS<=cutline*0.125){ Led_on(9); Led_off(9); } //1개 ON G1
else if(AmpsRMS<=cutline*0.250){ Led_on(8); Led_off(8); } //2개 ON G2
else if(AmpsRMS<=cutline*0.375){ Led_on(7); Led_off(7); } //3개 ON G3
else if(AmpsRMS<=cutline*0.500){ Led_on(6); Led_off(6); } //4개 ON G4
else if(AmpsRMS<=cutline*0.625){ Led_on(5); Led_off(5); } //5개 ON G5
else if(AmpsRMS<=cutline*0.750){ Led_on(4); Led_off(4); } //6개 ON G5 Y1
else if(AmpsRMS<=cutline ){ Led_on(3); Led_off(3); } //7개 ON G5 Y2
else{ //초과
Led_on(2); Led_off(2);
//digitalWrite(2,HIGH); delay(2000); //부저 ON
Relay3stat=1; digitalWrite(13,Relay3stat); //릴레이3 NC
if (Relay3stat){ Relay2stat=1; digitalWrite(12,Relay2stat); } // 릴레이3 작동시 //릴레이2 NC
else if(Relay2stat){ digitalWrite(2,1); delay(2000); Relay1stat=1; digitalWrite(11,Relay1stat); } // 릴레이2 작동시 //부저 ON //릴레이1 NC
//digitalWrite(2,LOW);
}
}
마지막 코드 부분에서
if (Relay3stat){ Relay2stat=1; digitalWrite(12,Relay2stat); } // 릴레이3 작동시 //릴레이2 NC
else if(Relay2stat){ digitalWrite(2,1); delay(2000); Relay1stat=1; digitalWrite(11,Relay1stat); } // 릴레이2 작동시 //부저 ON //릴레이1 NC
Relay2stat=1 이므로 릴레이1이 실행 되어야 한다는 것즉, else if가 왜 실행되지 않는가에 대한 문제인데요위에 있는 if가 우선순위가 있어서 if가 실행되지 않아야만 아래의 else if 조건식을 체크하게 됩니다.아마도 위와 같은 조건식을 만든 이유는 0.5초 딜레이를 가지면서릴레이3 실행하고 0.5초 후에 릴레이2를 실행하고 0.5초 후에 릴레이1을 실행 하도록 만들려고 한 것 아닌가 싶은데요const int Relay3=13,Relay2=12,Relay1=11;const int cutline=2,sensorIn=A1;//int Relay3stat=0,Relay2stat=0,Relay1stat=0;int mVperAmp=100; // use 100 for 20A Module and 66 for 30A Moduledouble Voltage=0,VRMS=0,AmpsRMS=0;float Value,amp;//-------------------------------------------------void Led_off(int k){ for(int i= k;i>2;i--)digitalWrite(i,0); }void Led_on(int k) { for(int i=10;i>k;i--)digitalWrite(i,1); }//float getVPP(){float result;int readValue,maxValue=0,minValue=1023;uint32_t start_time=millis();while((millis()-start_time)<1000){ // sample for 1 SecreadValue=analogRead(sensorIn);if(readValue>maxValue)maxValue=readValue;if(readValue<minValue)minValue=readValue;}//result=((maxValue-minValue)*5.0)/1023.0;return result;}//void setup(){Serial.begin(9600);pinMode(A1,INPUT); //전류센서pinMode(A2,INPUT); //릴레이3 체크pinMode(A3,INPUT); //릴레이2 체크pinMode(11,OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); //릴레이3pinMode(2,OUTPUT); //부저pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT); //초록5pinMode(8,OUTPUT); pinMode(9,OUTPUT); //노랑2pinMode(10,OUTPUT); //빨강}//void loop(){Voltage=getVPP(); VRMS=(Voltage/2.0)*0.707; AmpsRMS=(VRMS*1000)/mVperAmp;Serial.print(AmpsRMS); Serial.println(" Amps RMS");delay(500);//------------------------------------------------------------------if (AmpsRMS<=cutline*0.125){ Led_on(9); Led_off(9); } //1개 ON G1else if(AmpsRMS<=cutline*0.250){ Led_on(8); Led_off(8); } //2개 ON G2else if(AmpsRMS<=cutline*0.375){ Led_on(7); Led_off(7); } //3개 ON G3else if(AmpsRMS<=cutline*0.500){ Led_on(6); Led_off(6); } //4개 ON G4else if(AmpsRMS<=cutline*0.625){ Led_on(5); Led_off(5); } //5개 ON G5else if(AmpsRMS<=cutline*0.750){ Led_on(4); Led_off(4); } //6개 ON G5 Y1else if(AmpsRMS<=cutline ){ Led_on(3); Led_off(3); } //7개 ON G5 Y2else{ //초과Led_on(2); Led_off(2);//digitalWrite(2,HIGH); delay(2000); //부저 ONif ( Relay3stat==0){ Relay3stat=1; digitalWrite(13,Relay3stat); } // 릴레이3 NCelse if(Relay3stat && Relay2stat==0){ Relay2stat=1; digitalWrite(12,Relay2stat); } // 릴레이3 작동시 //릴레이2 NCelse if(Relay2stat && Relay1stat==0){ Relay1stat=1; digitalWrite(11,Relay1stat); } // 릴레이2 작동시 //릴레이1 NC//digitalWrite(2,LOW);}}이렇게 하면 될 것으로 생각합니다.
댓글 1
조회수 1,250노토산스님의 댓글
노토산스 작성일
해결되었습니다! 며칠째 머리를 싸매던 상황이었는데 선생님의 도움으로 바로 해결이 되었네요...
정말로 감사드리고 다시금 아두이노 이해가 많이 부족하다는 것을 배웠습니다 ㅎㅎ
다시금 진심으로 감사드립니다!!