세탁기표시창
sw1 : 동작/정지
sw2:세탁/탈수
sw3:헹굼횟수
#include<MsTimer2.h>
#include<Servo.h>
const int dig_sel_pin[4]={8,7,6,5};
const int fnd_pin[7]={9,10,11,12,13,A4,A5};
const int fnd-pat[10][7]={
{0,0,0,0,0,0,0}, //0
{1,0,0,1,1,1,1}, //1
{0,0,1,0,0,1,0}, //2
{0,0,0,0,1,1,0}, //3
{1,0,0,1,1,0,0}, //4
{0,1,0,0,1,0,0}, //5
{0,1,0,0,0,0,0}, //6
{0,0,0,1,1,1,1}, //7
{0,0,0,0,0,0,0}, //8
{0,0,0,1,1,0,0}}; //9
const int sw1_pin=2;
const int sw2_pin =3;
const int sw3_pin =4
const int buzzer_pin = 0;
const int step[4]={A0,A1,A2,A3};
const int one_pulse[4][4]={
{HIGH,LOW,LOW,LOW},{LOW,HIGH,LOW,LOW},
{LOW,LOW,HIGH,LOW},{LOW,LOW,LOW,HIGH}};
Servo myServo;
const int servo_pin=1;
byte wash_mode=0;//0:종료, 1:급수, 2:배수, 3:세탁, 4:헹굼 5:탈수
byte haengum=0;
byte setak=0;
byte talsu=0;
volatile byte rrun=0;
volatile byte dsp_pos=0;
volatile unsigned long t1, t2;//체터링방지 변수
void wash(void); //세탁/헹굼/탈수 분류처리함수
void wash1(byte); //세탁/헹굼처리함수
void wash2(void); //세탁/헹굼 모터구동함수
void wash3(void); //탈수처리함수
void setup(){
byte m;
for(n=0;n<7; n++) pinMode(fnd_pin[n], OUTPUT);
for(n=0:n<4;n++) pinMode(dig_sel_pin[n], OUTPUT);
for(n=0:n<4;n++){pinMode(step[n], OUTPUT); digtalWrite(step[n],LOW);}
pinMode(buzzer_pin, OUTPUT);
digtalWrite(buzzer_pin, LOW);
attachInterrupt(digitalPinToInterrupt(sw1_pin), sw1_on, FALLING);
pinMode(sw2_pin, INPUT);
pinMode(sw3_pin, INPUT);
myServo.attach(servo_pin);
myServo.write(90);
MsTimer2::set(5, wash_dsp);
MsTimer2::start();
t1=millis();}
void loop(){
boolean o_sw2, o_sw3, n_sw2, n_sw3;
byte mode=0;
while(1){
if(rrun==1) wash();
o_sw2= digitalRead(o_sw2); o_sw3= digitalRead(o_sw3);
delay(10);
n_sw2= digitalRead(o_sw2); n_sw3=digitalRead(o_sw3);
if(o_sw2==HIGH && n_sw2==LOW){ mode=(mode+1) % 4;
if(mode==0){ setak=0; talsu=0:}
else if(mode==1) setak=1; //세탁->헹굼 ->탈수
else if(mode==2){ setak=0; talsu=1;}// 세탁없음, 탈수약
else talsu=2;// 탈수강
}
else if(o_sw3==HIGH && n_sw3==LOW)
haengum=(haengum+1) % 4;//헹굼횟수0~3
} // end of while
} //end of loop
//세탁/헹굼/탈수 분류처리함수
void wash(){
byte m;
delay(1000);
if(setak==1){ if(haengum ==0) haengum =1; wash1(0); }
else if (haengum !=0) wash1(1);//헹굼만(탈수동반)
else if (talsu !=0){ wash_mode =2; // 배수모드
myServo.write(0);
if(rrun !=0){delay(3000);
wash_mode =5; //탈수모드
wash3(); // 탈수
if(talsu==2) if(rrun !=0) wash3();
}
}
wash_mode=0; //종료모드
myServo.write(90);
if(rrun ==0) return;
for(m=0:m<3; m++){ digitalWrite(buzzer_pin, HIGH); delay(1000);
digitalWrite(buzzer_pin, LOW); delay(1000); }
rrun=0; //정상종료
}//end of wash
//세탁/헹굼 처리함수
// start =0(세탁->헹굼->탈수처리)
//start = 1( 헹굼->탈수만처리)
void wash1(byte start)
{ int m;
for(m=start; m<=haeungum; m++){
wash_mode =1; // 급수모드
myServo.write(180);//급수
if(rrun==0) return; //강제종료확인
delay(3000);
myServo.write(90);// 잠금
if(m==0) wash_mode =3; //세탁모드
else wash_mode =4; //헹굼모드
if(rrun==0) return: //강제종료확인
wash2(); //세탁/헹굼
wash_mode =2; //배수모드
myServo.write(0); //배수
if(rrun ==0) return;
delay(3000);
wash_mode =5;// 탈수모드
if(rrun==0) return;
wash3(); //탈수
myServo.write(90);
]
} //end of wash1
//타이머2 인터럽트 처리함수(5ms주기)
//4자리 7-시그먼트 표시(5ms간격으로 한자리씩 표시
void wash_dsp()
{
byte n, tmp;
if(dsp_pos ==0) tmp = wash_mode;
else if (dsp_pos ==1) tmp = talsu;
else if(dsp_pos == 2) tmp = haeungum;
else tmp = setak;
for( n=0; n<4; n++) digitalWrite(dig_sel_pin[n], LOW);
digitalWrite(dig_sel_pin[dsp-pos ], HIGH); //dsp_pos자리만 켜짐
for(n=0; n<7; n++) digitalWrite( fnd_pin[n], fnd_pin[tmp][n]);
dsp_pos = (dsp_pos +1) % 4; // 표시자리 이동
}
//외부인터렙트0 처리함수
//스위치1 눌러지는 순간 (동작/정지 토글)
void sw1_on()
{ t2 = millis();
if( (t2 – t1) < 200 ) return ;
else t1 = t2;
rrun = ( rrun +1) %2;
}
//세탁/헹구몸터구동함수
void wash2()
{
int p, pp, ppp, pulse =0;
delay(1000);
// 정방향 반회전-> 역방향 반회전 (5회실행)
for(p=0; p<5; p++) {
for( pp=0; pp<1024 ; pp++) {
if(rrun ==0) return; // 강제종료확인
for( ppp=0; ppp <= 3 ppp++)
digitalWrite( step[ppp], one_pulse[pulse] [ppp]);
delay(2);
pulse = ( pulse+1) % 4;// 정방향 출력 펄스 번호갱신
} //end of for
delay(500);
// 펄스1024출력->역방향 반회전
for( pp=0; pp<1024; pp++) {
if(rrun ==0) return ;
for(ppp=0; ppp<=3 ;ppp++)
digitalWrite( step[ppp], one_pulse[ pulse][ppp]);
delay(2);
pulse = (pulse +3) % 4 //역방향출력펄스번호갱신
}
}
}
//털수처리함수
void wash3()
{
int p, pp, ppp, pulse =0;
delay(1000);
// 중속 반회전
for( pp=0; pp<1024 ; pp++) {
if(rrun ==0) return; // 강제종료확인
for( ppp=0; ppp <= 3 ppp++)
digitalWrite( step[ppp], one_pulse[pulse] [ppp]);
delay(4); // 4ms
pulse = ( pulse+1) % 4;// 정방향 출력 펄스 번호갱신
} //end of for
// 고속 3회전
for( pp=0; pp<6144; pp++) { if(rrun ==0) return ;
for(ppp=0; ppp<=3 ;ppp++) digitalWrite( step[ppp], one_pulse[ pulse][ppp]);
delay(2); pulse = (pulse +1) % 4 //역방향출력펄스번호갱신
}
//중속 반회전
for(pp=0;pp<1024; pp++) { fi(rrun == 0) return;
for( ppp =0; ppp<= 3; ppp++) digitalWrite( step[ppp], one_pulse[pulse] [ppp]);
delay(4); pulse = ( pulse+1) % 4 ; }
}