아두이노

세탁기 표시창

내동 2022. 1. 25. 05:19

세탁기표시창

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 ;   }

}

 

'아두이노' 카테고리의 다른 글

1-wire 통신(온습도측정)  (0) 2022.03.13
세탁기1  (0) 2022.01.28
RPM측정  (0) 2021.12.18
감 깍는 모타  (0) 2021.10.29
바운스 버턴  (0) 2021.10.15