세탁기표시창1
sw1 : 동작/정지
sw2:세탁/헹굼강도
sw3:헹굼횟수
1자리 | 10자리 | 100자리 | 1000자리 |
세탁가모드 | 헹굼실행횟수표시 | 헹굼설정횟수표시 | 세탁헹굼강도표시 |
#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}; //모터연결 in1,in2,in3,in4
const int one_pulse[4][4]={ //1상구동펄스
{HIGH,LOW,LOW,LOW},{LOW,HIGH,LOW,LOW},
{LOW,LOW,HIGH,LOW},{LOW,LOW,LOW,HIGH}};
const int step_spd [3] = [6,4,2];//펄스간격:ms
Servo myServo;
const int servo_pin=1;
volatile byte wash_mode=0;//0:종료, 1:급수, 2:배수, 3:세탁, 4:헹굼 5:탈수
volatile byte wash_set_no = 1; //헹굼설정횟수(1~3)
volatile byte wash_set_sen =0; //세탁/헹굼설정강도(0~2)
volatile byte wash_no =0; //헹굼실행횟수
volatile byte rrun=0; //시작/종료
volatile byte dsp_pos=0; //세그먼트표시위치
volatile unsigned long t1, t2;//체터링방지 변수
void wash(void); //세탁전과정처리함수
void wash1(void); //세탁/헹굼처리함수
void wash2(void); //탈수처리함수
void setup(){
byte n;
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;
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)
wash_set_sen =(wash_set_sen+1) % 3;
else if(o_sw3==HIGH && n_sw3==LOW){
wash_set_no ++ ;
if(wash_set_no == 4) wash_set_no =1; }
}
}
//세탁/헹굼/탈수 분류처리함수
void wash(){
byte m;
delay(1000);
for( m=0; m<=wash_set_no ; m++) {
wash_no = m;
//급수
wash_mode =1;
myServo.write(180); if( rrun ==0) break: delay(000);
myServo.write(90);
//세탁/ 헹굼
if(m==0) wash_mode =3;
else wash_mode =4; if(rrun==0) break; wash1();
//배수
wash_mode= 2;
myServo.write(0); delay(3000);
//탈수
wash_mode=5; if(rrun =0) break; wash2();
myServo.write(90);
} //end of for
wash_mode =0; wash_no =0;
myServo.write(90); if(rrun==0) return; rrun =0;
//종료 알림
for( m=0; m<3; m++){
digitalWrite(buzzer_pin ,HIGH); delay(1000);
digitalWrite(buzzer_pin ,LOW); delay(1000);}
}
//세탁/헹굼 처리함수
// 정방향 반회전==> 역방향 반회전 5회실시
void wash1()
{ int p, pp, ppp, pulse =0;
delay(1000);
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(step_spd [wash_set_sen]);
pulse =( pulse+1) % 4; }
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(step_ spd [wash_set_sen] );
pulse =(pulse +3) % 4 }
}
}
// 탈수처리함수
//속도 2단게로 1회전씩 가속회잔후 속도2단계로1회전씩 감속회전
void wash2(){
int p, pp, ppp, pulse =0;
//속도 서서히 2단계로 가속
for( p=1; p<3; p++){
for(pp =0; pp<2048;pp++){ if(rrun =0) return;
for(ppp=0; ppp<=3; ppp++) digitalWrite(step[ppp], one_pulse[pulse] [ ppp]);
delay(step_ spd [p];
pulse = ( pulse +1) % 4; }
} //end of for
//속도를 서서히 2단계로 감속
for( p=2; p>=1; p--){
for(pp= 0; pp<2048; pp++){
if(rrun =0) return;
for(ppp =0;ppp<=3; ppp++)
digitalWrite(step[ppp], one_pulse[pulse] [ppp]);
delay(step_ spd [p]);
pulse = ( pulse +1) % 4;}
}
}
//타이머2 인터럽트 처리함수(5ms주기)
//4자리 7-시그먼트 표시(5ms간격으로 한자리씩 표시
void wash_dsp()
{ byte n, tmp;
if(dsp_pos ==0) tmp = wash_mode;
else if (dsp_pos ==1) tmp = wash_no;
else if(dsp_pos == 2) tmp = wash_set_no;
else tmp = (wash_set_sen +1);
//모든자리 off한후 표시위치 자리만 on
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;}