아두이노

세탁기1

내동 2022. 1. 28. 08:28

 

세탁기표시창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;}

 

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

cutter_5  (0) 2022.04.11
1-wire 통신(온습도측정)  (0) 2022.03.13
세탁기 표시창  (0) 2022.01.25
RPM측정  (0) 2021.12.18
감 깍는 모타  (0) 2021.10.29