무인주차관리시스템 조 장 : 정재훈 조 원 : 이찬영 고종광 이민욱 김경탁 김병철 김평원
목 차
주차장의 혼잡성과 대기시간 감소를 추구하기 위해 작품 선정 최단거리를 제시하여 주차장의 효율성을 기대 실시간으로 주차 현황을 파악하여 주차 시간 절약 무인화와 동시에 자동화로 시스템을 구축 무인시스템을 통한 인건비 절약 무인 주차장 정보 시스템을 설계 및 조립함으로써 하드웨어 능력 향상 센서와 모터 LED 메인부의 MCU 까지 다양한 부품들의 기능과 활용능력을 향상 소프트웨어 적인 데이터 처리능력을 향상 다양한 통계 산출과 자료분석 및 차트를 구현 시킴
모터부 서보모터 메인부 아두이노 센서부 초음파센서 Display 부 Display 전원부 11.1V 주 차 장주 차 장
도트매트릭스 LED 모듈 [LK-DOTM16-ADU2K]
4 채널 서보모터 드라이버 (LK-SVMC-K)
센서부
메인부
모터, 전원부
Display
No Yes 차량 진입 출입 차단기 open 출입 차단기 내에 차량 대기 여부 확인 시 작시 작 YesNo 출입차단기 open 상태 유지 차량과 출입차단기 충돌 방지를 위한 delay LED 를 통한 빈 주차공간으로 유도 Display 동기화 종 료종 료 Display 를 통한 주차 현황 파악 차량 진입 대기 출입 차단기 close
각 자리 초음파센서 #define TrigPinA 2 //A 구역 송수신 핀 정의 #define EchoPinA 3 #define TrigPinB 4 //B 구역 송수신 핀 정의 #define EchoPinB 5 #define TrigPinC 6 //C 구역 송수신 핀 정의 #define EchoPinC 7 #define TrigPinD 8 //D 구역 송수신 핀 정의 #define EchoPinD 9 #define TrigPinE 10 //E 구역 송수신 핀 정의 #define EchoPinE 11 #define TrigPinF 12 //F 구역 송수신 핀 정의 #define EchoPinF 13 #define LEDA 14 //A 구역 LED 녹색 정의 #define LEDA1 15 //A 구역 LED 적색 정의 #define LEDB 16 //B 구역 LED 녹색 정의 #define LEDB1 17 //B 구역 LED 적색 정의 #define LEDC 18 //C 구역 LED 녹색 정의 #define LEDC1 19 //C 구역 LED 적색 정의 #define LEDD 20 //D 구역 LED 녹색 정의 #define LEDD1 21 //D 구역 LED 적색 정의 #define LEDE 44 //E 구역 LED 녹색 정의 #define LEDE1 45 //E 구역 LED 적색 정의 #define LEDF 46 //F 구역 LED 녹색 정의 #define LEDF1 47 //F 구역 LED 적색 정의 void setup() // 셋업 함수 { Serial.begin(9600); // 데이터 통신 속도 설정 pinMode(TrigPinA, OUTPUT); //A 구역 송수신 핀 출력으로 설정 pinMode(EchoPinA, INPUT); pinMode(TrigPinB, OUTPUT); //B 구역 송수신 핀 출력으로 설정 pinMode(EchoPinB, INPUT); pinMode(TrigPinC, OUTPUT); //C 구역 송수신 핀 출력으로 설정 pinMode(EchoPinC, INPUT); pinMode(TrigPinD, OUTPUT); //D 구역 송수신 핀 출력으로 설정 pinMode(EchoPinD, INPUT); pinMode(TrigPinE, OUTPUT); //E 구역 송수신 핀 출력으로 설정 pinMode(EchoPinE, INPUT); pinMode(TrigPinF, OUTPUT); //F 구역 송수신 핀 출력으로 설정 pinMode(EchoPinF, INPUT); pinMode(LEDA, OUTPUT); //A 구역 LED 녹색 출력으로 설정 pinMode(LEDA1, OUTPUT); //A 구역 LED 적색 출력으로 설정 pinMode(LEDB, OUTPUT); //B 구역 LED 녹색 출력으로 설정 pinMode(LEDB1, OUTPUT); //B 구역 LED 적색 출력으로 설정 pinMode(LEDC, OUTPUT); //C 구역 LED 녹색 출력으로 설정 pinMode(LEDC1, OUTPUT); //C 구역 LED 적색 출력으로 설정 pinMode(LEDD, OUTPUT); //D 구역 LED 녹색 출력으로 설정 pinMode(LEDD1, OUTPUT); //D 구역 LED 적색 출력으로 설정 pinMode(LEDE, OUTPUT); //E 구역 LED 녹색 출력으로 설정 pinMode(LEDE1, OUTPUT); //E 구역 LED 적색 출력으로 설정 pinMode(LEDF, OUTPUT); //F 구역 LED 녹색 출력으로 설정 pinMode(LEDF1, OUTPUT); //F 구역 LED 적색 출력으로 설정 }
각 자리 초음파센서 void loop() // 메인함수 { UltrasonicA(); UltrasonicB(); UltrasonicC(); UltrasonicD(); UltrasonicE(); UltrasonicF(); } void UltrasonicA() { long duration, distance; // 수신값 받는 변수, 거리값 계산하는 변수 digitalWrite(TrigPinA, LOW); //A 구역 초음파센서 송신호 off delayMicroseconds(2); / /2us 정도 유지 digitalWrite(TrigPinA, HIGH); //A 구역 초음파센서 송신호 입력 delayMicroseconds(10); //10us 정도 유지 digitalWrite(TrigPinA, LOW); //A 구역 초음파센서 송신호 off duration = pulseIn(EchoPinA, HIGH); //A 구역 초음파 수신호 On->Off 간격 측정 distance = (duration/2) / 29.1; //A 구역 수신호 거리 계산 (cm 로 변환 ) if (distance < 6) //A 구역 초음파센서 수신된 거리가 6cm 이내 이면 digitalWrite(LEDA,HIGH); //A 구역 LED 녹색 On digitalWrite(LEDA1,LOW); //A 구역 LED 적색 Off } else { digitalWrite(LEDA,LOW); //A 구역 LED 녹색 Off digitalWrite(LEDA1,HIGH); //A 구역 LED 적색 On } if (distance >= 200 || distance <= 0) //A 구역 거리가 음수 혹은 2m 이상이면 { Serial.println("Out of range"); //" 범위 밖이라는 문구 표시 " } else { Serial.print(distance); //A 구역 거리값 표시 Serial.println(" cm"); //A 구역 단위 "cm" } delay(100); //0.1 초 지연 }
각 자리 초음파센서 void UltrasonicB() { long duration,distance; digitalWrite (TrigPinB, LOW); //B 구역 초음파센서 송신호 off delayMicroseconds(2); //2us 정도 유지 digitalWrite(TrigPinB, HIGH); //B 구역 초음파센서 송신호 입력 delayMicroseconds(10); //10us 정도 유지 digitalWrite(TrigPinB, LOW); //B 구역 초음파센서 송신호 off duration = pulseIn (EchoPinB, HIGH); //B 구역 초음파 수신호 On->Off 간격 측정 distance = (duration/2) / 29.1; //B 구역 수신호 거리 계산 (cm 로 변환 ) if (distance < 6) //B 구역 초음파센서 수신된 거리가 6cm 이내 이면 { digitalWrite(LEDB,HIGH); //B 구역 LED 녹색 On digitalWrite(LEDB1,LOW); //B 구역 LED 적색 Off } else { digitalWrite(LEDB,LOW); //B 구역 LED 녹색 Off digitalWrite(LEDB1,HIGH); //B 구역 LED 적색 On } if (distance >= 200 || distance <= 0) //B 구역 거리가 음수이거나 2m 이상이면 { Serial.println("Out of range"); //" 범위 밖이라는 문구 표시 " } else { Serial.print(distance); //B 구역 거리값 표시 Serial.println("cm"); //B 구역 단위 "cm" } delay(100); //0.1 초 지연 }
각 자리 초음파센서 void UltrasonicC() { long duration,distance; digitalWrite(TrigPinC, LOW); //C 구역 초음파센서 송신호 off delayMicroseconds(2); //2us 정도 유지 digitalWrite(TrigPinC, HIGH); //C 구역 초음파센서 송신호 입력 delayMicroseconds(10); //10us 정도 유지 digitalWrite(TrigPinC, LOW); //C 구역 초음파센서 송신호 off duration = pulseIn(EchoPinC, HIGH); //C 구역 초음파 수신호 On->Off 간격 측정 distance = (duration/2) / 29.1; //C 구역 수신호 거리 계산 (cm 로 변환 ) if (distance < 6) //C 구역 초음파센서 수신된 거리가 6cm 이내 이면 { digitalWrite(LEDC,HIGH); //C 구역 LED 녹색 On digitalWrite(LEDC1,LOW); //C 구역 LED 적색 Off } else { digitalWrite(LEDC,LOW); //C 구역 LED 녹색 Off digitalWrite(LEDC1,HIGH); //C 구역 LED 적색 On } if (distance >= 200 || distance <= 0) //C 구역 거리가 음수이거나 2m 이상이면 { Serial.println("Out of range"); //" 범위 밖이라는 문구 표시 " } else { Serial.print(distance); //C 구역 거리값 표시 Serial.println("cm"); //C 구역 단위 "cm" } delay(100); //0.1 초 지연 }
각 자리 초음파센서 void UltrasonicD() { long duration,distance; digitalWrite(TrigPinD, LOW); //D 구역 초음파센서 송신호 off delayMicroseconds(2); //2us 정도 유지 digitalWrite(TrigPinD, HIGH); //D 구역 초음파센서 송신호 입력 delayMicroseconds(10); //10us 정도 유지 digitalWrite(TrigPinD, LOW); //D 구역 초음파센서 송신호 off duration = pulseIn(EchoPinD, HIGH); //D 구역 초음파 수신호 On->Off 간격 측정 distance = (duration/2) / 29.1; //D 구역 수신호 거리 계산 (cm 로 변환 ) if (distance < 6) //D 구역 초음파센서 수신된 거리가 6cm 이내 이면 { digitalWrite(LEDD,HIGH); //D 구역 LED 녹색 On digitalWrite(LEDD1,LOW); //D 구역 LED 적색 Off } else { digitalWrite(LEDD,LOW); //D 구역 LED 녹색 Off digitalWrite(LEDD1,HIGH); //D 구역 LED 적색 On } if (distance >= 200 || distance <= 0) //D 구역 거리가 음수이거나 2m 이상이면 { Serial.println("Out of range"); //" 범위 밖이라는 문구 표시 " } else { Serial.print(distance); //D 구역 거리값 표시 Serial.println("cm"); //D 구역 단위 "cm" } delay(100); //0.1 초 지연 }
각 자리 초음파센서 void UltrasonicE() { long duration,distance; digitalWrite(TrigPinE, LOW); //E 구역 초음파센서 송신호 off delayMicroseconds(2); //2us 정도 유지 digitalWrite(TrigPinE, HIGH); //E 구역 초음파센서 송신호 입력 delayMicroseconds(10); //10us 정도 유지 digitalWrite(TrigPinE, LOW); //E 구역 초음파센서 송신호 off duration = pulseIn(EchoPinE, HIGH); //E 구역 초음파 수신호 On->Off 간격 측정 distance = (duration/2) / 29.1; //E 구역 수신호 거리 계산 (cm 로 변환 ) if (distance < 6) //E 구역 초음파센서 수신된 거리가 6cm 이내 이면 { digitalWrite(LEDE,HIGH); //E 구역 LED 녹색 On digitalWrite(LEDE1,LOW); //E 구역 LED 적색 Off } else { digitalWrite(LEDE,LOW); //E 구역 LED 녹색 Off digitalWrite(LEDE1,HIGH); //E 구역 LED 적색 On } if (distance >= 200 || distance <= 0) //E 구역 거리가 음수이거나 2m 이상이면 { Serial.println("Out of range"); //" 범위 밖이라는 문구 표시 " } else { Serial.print(distance); //E 구역 거리값 표시 Serial.println("cm"); //E 구역 단위 "cm" } delay(100); //0.1 초 지연 }
각 자리 초음파센서 void UltrasonicF() { long duration,distance; digitalWrite(TrigPinF, LOW); //F 구역 초음파센서 송신호 off delayMicroseconds(2); //2us 정도 유지 digitalWrite(TrigPinF, HIGH); //F 구역 초음파센서 송신호 입력 delayMicroseconds(10); //10us 정도 유지 digitalWrite(TrigPinF, LOW); //F 구역 초음파센서 송신호 off duration = pulseIn(EchoPinF, HIGH); //F 구역 초음파 수신호 On->Off 간격 측정 distance = (duration/2) / 29.1; //F 구역 수신호 거리 계산 (cm 로 변환 ) if (distance < 6) //F 구역 초음파센서 수신된 거리가 6cm 이내 이면 { digitalWrite(LEDF,LOW); //F 구역 LED 녹색 On digitalWrite(LEDF1,HIGH); //F 구역 LED 적색 Off } else { digitalWrite(LEDF,HIGH); //F 구역 LED 녹색 Off digitalWrite(LEDF1,LOW); //F 구역 LED 적색 On } if (distance >= 200 || distance <= 0) //F 구역 거리가 음수이거나 2m 이상이면 { Serial.println("Out of range"); //" 범위 밖이라는 문구 표시 " } else { Serial.print(distance); //F 구역 거리값 표시 Serial.println("cm"); //F 구역 단위 "cm" } delay(100); //0.1 초 지연 }
#include // 서버모터 헤더파일 Servo myservoIn; // 입, 출구 서보모터 변수 Servo myservoOut; int posIn ; // 입, 출구 서보모터 각도 변수 int posOut ; int echoPinIn = 7; // 입구 센서 송수신 핀 int trigPinIn = 8; int echoPinOut = 10; // 출구 센서 송수신 핀 int trigPinOut = 11; void setup() // 셋업 함수 { Serial.begin(9600); // 데이터 통신 속도 설정 myservoIn.attach(9); // 입, 출구 서보모터 핀 설정 myservoOut.attach(12); pinMode(trigPinIn, OUTPUT); // 입구 송신 핀 출력으로 설정 pinMode(echoPinIn, INPUT); // 입구 수신 핀 입력으로 설정 pinMode (trigPinOut, OUTPUT); // 출구 송신 핀 출력으로 설정 pinMode(echoPinOut, INPUT); // 출구 수신 핀 입력으로 설정 } 출입구 초음파 서보모터 void loop() // 메인 함수 { ServoIn(); // 입구 서보모터 함수 ServoOut(); // 출구 서보모터 함수 } void ServoIn() // 입구 서보모터 함수 { float durationIn; // 입구 수신값을 받는 변수 float distanceIn; // 입구 거리값을 계산하는 변수 digitalWrite(trigPinIn,LOW); // 입구 초음파센서 송신호 off delayMicroseconds(2); //2us 정도 유지 digitalWrite(trigPinIn, HIGH); // 입구 초음파센서 송신호 입력 delayMicroseconds(10); //10us 정도 유지 digitalWrite(trigPinIn, LOW); // 입구 초음파센서 송신호 off durationIn = pulseIn(echoPinIn, HIGH); // 입구 초음파 수신호 On->Off 간격 측정 distanceIn = (durationIn/2) / 29.1; // 입구 수신호 거리 계산 (cm 로 변환 )
if(distanceIn < 6) // 입구 초음파센서 수신된 거리가 6cm 이내 이면 { posIn = 10; // 입구 서보모터 각도 초기값 posIn +=70; // 입구 서보모터 각도 증가 myservoIn.write(posIn); // 입구 서보모터 각도 읽음 delay(3000); //3 초 지연 } else if(distanceIn > 6) // 입구 초음파센서 수신된 거리가 6cm 이상 이면 { posIn-=50; // 입구 서보모터 각도 감소 myservoIn.write(posIn); // 입구 서모모터 각도 출력 delay(10); //0.01 초 지연 } delay(50); //0.05 초 지연 } 출입구 초음파 서보모터 void ServoOut() // 출구 서보모터 함수 { float durationOut; // 출구 수신값을 받는 변수 float distanceOut; // 출구 거리값을 계산하는 변수 digitalWrite(trigPinOut,LOW); // 출구 초음파센서 송신호 off delayMicroseconds(2); //2us 정도 유지 digitalWrite(trigPinOut, HIGH); // 출구 초음파센서 송신호 입력 delayMicroseconds(10); //10us 정도 유지 digitalWrite(trigPinOut, LOW); // 출구 초음파센서 송신호 off durationOut = pulseIn(echoPinOut, HIGH); // 출구 초음파 수신호 On->Off 간격 측정 distanceOut = (durationOut/2) / 29.1; // 출구 수신호 거리 계산 (cm 로 변환 ) if(distanceOut < 6) // 출구 초음파센서 수신된 거리가 6cm 이내 이면 { posOut = 10; // 출구 서보모터 각도 초기값 posOut +=70; // 출구 서보모터 각도 증가
myservoOut.write(posOut); // 출구 서보모터 각도 읽음 delay(3000); //3 초 지연 } else if(distanceOut > 6) // 출구 초음파센서 수신된 거리가 6cm 이상 이면 { posOut-=50; // 출구 서보모터 각도 감소 myservoOut.write(posOut); // 출구 서보모터 각도 출력 delay(10); //0.01 초 지연 } delay(50); //0.05 초 지연 } 출입구 초음파 서보모터
Display 부 입구파트 #include int A = 2; int B = 3; int C = 4; int D = 5; int Data_Red = 6; int Data_Green = 7; int Clk = 8; int LE = 9; int OE = 10; const int __attribute__((progmem)) string[][16]={ 0x00,0x00,0x00,0x180,0x3c0,0x7e0,0x3c0,0xff0,0x1ff8,0x1ff8,0xff0,0x180,0x3c0,0x00,0x00,0x00, // ♣ 0x00,0x00,0x8f0,0x908,0x908,0x908,0xf08,0x908,0x908,0x908,0x908,0x8f0,0x800,0x00,0x00,0x00, // 어 0x00,0x00,0x840,0x840,0x840,0x840,0xe40,0x8a0,0x8a0,0x910,0x910,0xa08,0x800,0x00,0x00,0x00, // 서 0x00,0x00,0x3c0,0x420,0x810,0x810,0x420,0x3c0,0x100,0x100,0x100,0x1ff8,0x00,0x00,0x00,0x00, // 오 0x00,0x00,0x840,0x840,0x8a0,0x920,0xa10,0x808,0x00,0x810,0xff0,0x810,0xff0,0x00,0x00,0x00, // 십 0x00,0x00,0x840,0x840,0x840,0x840,0x840,0x8a0,0x8a0,0x910,0x910,0xa08,0x800,0x00,0x00,0x00, // 시 0x00,0x00,0x3c0,0x420,0x810,0x810,0x420,0x3c0,0x100,0x100,0x100,0x1ff8,0x00,0x00,0x00,0x00, // 오 0x00,0x00,0x00,0x180,0x3c0,0x7e0,0x3c0,0xff0,0x1ff8,0x1ff8,0xff0,0x180,0x3c0,0x00,0x00,0x00, // ♣ };
Display 부 입구파트 unsigned char Dot_char_cnt=0; // 도트매트릭스에 표시 될 문자 카운터 unsigned char flag_cnt=0; // 도트매트릭스에 표시 될 색상 카운터 unsigned char move_motion=0; // 도트매트릭스에 색깔 표시 unsigned int Move_cnt=16; // 도트매트릭스 첫번째꺼를 16 번 카운트 unsigned int Move_cnt2=0; unsigned int str_speed_cnt=0; // 도트매트릭스 속력 카운트 bool flag_Oe=0; ISR(TIMER2_OVF_vect){ static bool output = HIGH; digitalWrite(1, output); output = !output; static unsigned int string_moving_speed_value=400; // 문자가 흘러가는 속도 static unsigned int cnt=0; if(flag_Oe) { digitalWrite(OE, LOW); cnt++; if(cnt>=5) { flag_Oe=0; cnt=0;
Display 부 입구파트 digitalWrite(OE, HIGH); } str_speed_cnt++; if(str_speed_cnt>string_moving_speed_value) { str_speed_cnt=0; Move_cnt--; Move_cnt2++; if(Move_cnt==0||Move_cnt2==16){ Move_cnt=16; Move_cnt2=0; move_motion++; if(move_motion>1){ move_motion=0; Dot_char_cnt+=1; flag_cnt++; if(flag_cnt==1) { flag_cnt=0; } TCNT2=0xe7; } void setup() // 셋업 함수 { pinMode(A, OUTPUT); //A 구역 송신 핀 출력으로 설정 pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(Data_Red, OUTPUT); pinMode(Data_Green, OUTPUT); pinMode(Clk, OUTPUT); pinMode(LE, OUTPUT); pinMode(OE, OUTPUT); pinMode(1, OUTPUT); TCCR2A=0x00; TCCR2B=0x04; TIMSK2=0x01; TCNT2=0xe7; SREG=0x80; }
Display 부 입구파트 void row_dynamic() // row 열을 선택한 어드레스를 주는 함수 이함수가 호출할때 어드레스 변경 { static unsigned int str_cnt=0; // 항상 0 이 되므로 문제. 변수를 글로벌로 처리 switch(str_cnt)//ROW SHIFT! { case 0:digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); break; //1 행 LED case 1:digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); break; //2 행 LED case 2:digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, LOW); break; //3 행 LED case 3:digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, LOW); break; //4 행 LED case 4:digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, LOW); break; //5 행 LED case 5:digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, LOW); break; //6 행 LED case 6:digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, LOW); break; //7 행 LED case 7:digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, LOW); break; //8 행 LED case 8:digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); break; //9 행 LED case 9:digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); break; //10 행 LED case 10:digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, HIGH); break; //11 행 LED case 11:digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, HIGH); break; //12 행 LED case 12:digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, HIGH); break; //13 행 LED case 13:digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, HIGH); break; //14 행 LED case 14:digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, HIGH); break; //15 행 LED case 15:digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, HIGH); break; //16 행 LED }
Display 부 입구파트 ++str_cnt; if(str_cnt==16) { str_cnt=0; } void shift_Register(unsigned char out ) // 문자를 시프트 시키는 변수 { unsigned char clk=0; for(clk=0;clk<8;clk++){ //8 비트 데이터를 1 비트씩 시프트 레지스터에 입력 if(out&(0x80>>clk)) { switch(flag_cnt){ case 0:digitalWrite(Data_Green, LOW); digitalWrite(Data_Red, HIGH);break; //Red case 1:digitalWrite(Data_Green, HIGH); digitalWrite(Data_Red, LOW);break; //Green case 2:digitalWrite(Data_Green, HIGH); digitalWrite(Data_Red, HIGH);break; //Orange } else { digitalWrite(Data_Green, LOW); digitalWrite(Data_Red, LOW); } digitalWrite(Clk, HIGH); delayMicroseconds(1); digitalWrite(Clk, LOW); } void ActivePulse() { digitalWrite(LE, HIGH); delayMicroseconds(1); digitalWrite(LE, LOW); // 래치 출력 digitalWrite(OE, LOW); delayMicroseconds(500); // OUTPUT ENABLE } void dot1_display_shift(unsigned char first) // 도트매트릭스 첫번째 시프트 { static unsigned int i_cnt=0; register unsigned int buff1[16]={0}; //Dot1 buff register unsigned char high1=0; //Dot1
Display 부 입구파트 register unsigned char low1=0; //Dot1 register unsigned int i=0; for(i_cnt=0;i_cnt<16;i_cnt++) // 문자를 왼쪽으로 시프트 { if(move_motion==0) { buff1[i_cnt]=pgm_read_word(&string[first] [i_cnt])<<Move_cnt; // 1st String Dot1 in } if(move_motion==1) { buff1[i_cnt]=pgm_read_word(&string[first] [i_cnt])>>Move_cnt2; // 1st String Dot1 Out } for(i=0;i<16;i++){ high1=(buff1[i]>>8); low1=(buff1[i]&0xff); digitalWrite(OE, HIGH); shift_Register(low1); shift_Register(high1); row_dynamic(); ActivePulse(); } void loop() { // put your main code here, to run repeatedly: dot1_display_shift(Dot_char_cnt); // 도트매트릭스 문자 카운터 1 개씩 if(Dot_char_cnt==8){ Dot_char_cnt=0; }
Display 부 출구파트 #include int A = 2; int B = 3; int C = 4; int D = 5; int Data_Red = 6; int Data_Green = 7; int Clk = 8; int LE = 9; int OE = 10; const int __attribute__((progmem)) string[][16]={ 0x00,0x00,0x00,0x180,0x3c0,0x7e0,0x3c0,0xff0,0x1ff8,0x1ff8,0xff0,0x180,0x3c0,0x00,0x00,0x00, // ♣ 0x00,0x00,0x8f0,0x908,0x908,0x3908,0x908,0x8f0,0x800,0x800,0x10,0x10,0xff0,0x00,0x00,0x00, // 안 0x00,0x00,0x808,0xf08,0x808,0xf08,0x9f8,0x800,0x800,0x7e0,0x810,0x810,0x7e0,0x00,0x00,0x00, // 녕 0x00,0x00,0x8e0,0x800,0xbf8,0x800,0x8e0,0x910,0x910,0x910,0x910,0x8e0,0x800,0x00,0x00,0x00, // 히 0x00,0x00,0x9f8,0x900,0x900,0x900,0x900,0x3880,0x880,0x840,0x820,0x818,0x800,0x00,0x00,0x00, // 가 0x00,0x00,0x840,0x840,0x8a0,0x920,0xa10,0x808,0x00,0x810,0xff0,0x810,0xff0,0x00,0x00,0x00, // 십 0x00,0x00,0x840,0x840,0x840,0x840,0x840,0x8a0,0x8a0,0x910,0x910,0xa08,0x800,0x00,0x00,0x00, // 시 0x00,0x00,0x3c0,0x420,0x810,0x810,0x420,0x3c0,0x100,0x100,0x100,0x1ff8,0x00,0x00,0x00,0x00, // 오 0x00,0x00,0x00,0x180,0x3c0,0x7e0,0x3c0,0xff0,0x1ff8,0x1ff8,0xff0,0x180,0x3c0,0x00,0x00,0x00, // ♣ };
Display 부 출구파트 unsigned char Dot_char_cnt=0; // 도트매트릭스에 표시 될 문자 카운터 unsigned char flag_cnt=0; // 도트매트릭스에 표시 될 색상 카운터 unsigned char move_motion=0; // 도트매트릭스에 색쌀 표시 unsigned int Move_cnt=16; // 도트매트릭스 첫번째꺼를 16 번 카운트 unsigned int Move_cnt2=0; unsigned int str_speed_cnt=0; // 도트매트릭스 속력 카운트 bool flag_Oe=0; ISR(TIMER2_OVF_vect){ static bool output = HIGH; digitalWrite(1, output); output = !output; static unsigned int string_moving_speed_value=400; // 문자가 흘러가는 속도 static unsigned int cnt=0; if(flag_Oe) { digitalWrite(OE, LOW); cnt++; if(cnt>=5) { flag_Oe=0; cnt=0;
Display 부 출구파트 digitalWrite(OE, HIGH); } str_speed_cnt++; if(str_speed_cnt>string_moving_speed_value) { str_speed_cnt=0; Move_cnt--; Move_cnt2++; if(Move_cnt==0||Move_cnt2==16){ Move_cnt=16; Move_cnt2=0; move_motion++; if(move_motion>1){ move_motion=0; Dot_char_cnt+=1; flag_cnt++; if(flag_cnt==1) { flag_cnt=0; } TCNT2=0xe7; } void setup() // 셋업 함수 { pinMode(A, OUTPUT); //A 구역 송신 핀 출력으로 설정 pinMode(B, OUTPUT); pinMode(C, OUTPUT); pinMode(D, OUTPUT); pinMode(Data_Red, OUTPUT); pinMode(Data_Green, OUTPUT); pinMode(Clk, OUTPUT); pinMode(LE, OUTPUT); pinMode(OE, OUTPUT); pinMode(1, OUTPUT); TCCR2A=0x00; TCCR2B=0x04; TIMSK2=0x01; TCNT2=0xe7; SREG=0x80; }
Display 부 출구파트 void row_dynamic() // row 열을 선택한 어드레스를 주는 함수 이함수가 호출할때 어드레스 변경 { static unsigned int str_cnt=0; // 항상 0 이 되므로 문제. 변수를 글로벌로 처리 switch(str_cnt)//ROW SHIFT! { case 0:digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); break; //1 행 LED case 1:digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, LOW); break; //2 행 LED case 2:digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, LOW); break; //3 행 LED case 3:digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, LOW); break; //4 행 LED case 4:digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, LOW); break; //5 행 LED case 5:digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, LOW); break; //6 행 LED case 6:digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, LOW); break; //7 행 LED case 7:digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, LOW); break; //8 행 LED case 8:digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); break; //9 행 LED case 9:digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, LOW); digitalWrite(D, HIGH); break; //10 행 LED case 10:digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, HIGH); break; //11 행 LED case 11:digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, LOW); digitalWrite(D, HIGH); break; //12 행 LED case 12:digitalWrite(A, LOW); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, HIGH); break; //13 행 LED case 13:digitalWrite(A, HIGH); digitalWrite(B, LOW); digitalWrite(C, HIGH); digitalWrite(D, HIGH); break; //14 행 LED case 14:digitalWrite(A, LOW); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, HIGH); break; //15 행 LED case 15:digitalWrite(A, HIGH); digitalWrite(B, HIGH); digitalWrite(C, HIGH); digitalWrite(D, HIGH); break; //16 행 LED }
Display 부 출구파트 ++str_cnt; if(str_cnt==16) { str_cnt=0; } void shift_Register(unsigned char out ) // 문자를 시프트 시키는 변수 { unsigned char clk=0; for(clk=0;clk<8;clk++){ //8 비트 데이터를 1 비트씩 시프트 레지스터에 입력 if(out&(0x80>>clk)) { switch(flag_cnt){ case 0:digitalWrite(Data_Green, LOW); digitalWrite(Data_Red, HIGH);break; //Red case 1:digitalWrite(Data_Green, HIGH); digitalWrite(Data_Red, LOW);break; //Green case 2:digitalWrite(Data_Green, HIGH); digitalWrite(Data_Red, HIGH);break; //Orange } else { digitalWrite(Data_Green, LOW); digitalWrite(Data_Red, LOW); } digitalWrite(Clk, HIGH); delayMicroseconds(1); digitalWrite(Clk, LOW); } void ActivePulse() { digitalWrite(LE, HIGH); delayMicroseconds(1); digitalWrite(LE, LOW); // 래치 출력 digitalWrite(OE, LOW); delayMicroseconds(500); // OUTPUT ENABLE } void dot1_display_shift(unsigned char first) // 도트매트릭스 첫번째 시프트 { static unsigned int i_cnt=0; register unsigned int buff1[16]={0}; //Dot1 buff register unsigned char high1=0; //Dot1
Display 부 출구파트 register unsigned char low1=0; //Dot1 register unsigned int i=0; for(i_cnt=0;i_cnt<16;i_cnt++) // 문자를 왼쪽으로 시프트 { if(move_motion==0) { buff1[i_cnt]=pgm_read_word(&string[first] [i_cnt])<<Move_cnt; // 1st String Dot1 in } if(move_motion==1) { buff1[i_cnt]=pgm_read_word(&string[first] [i_cnt])>>Move_cnt2; // 1st String Dot1 Out } for(i=0;i<16;i++){ high1=(buff1[i]>>8); low1=(buff1[i]&0xff); digitalWrite(OE, HIGH); shift_Register(low1); shift_Register(high1); row_dynamic(); ActivePulse(); } void loop() { // put your main code here, to run repeatedly: dot1_display_shift(Dot_char_cnt); // 도트매트릭스 문자 카운터 1 개씩 if(Dot_char_cnt==8){ Dot_char_cnt=0; }
작 품 사 진작 품 사 진 센서부 모터부 Display 부 주차장
작 품 동 영 상작 품 동 영 상
활 용 방 안활 용 방 안 주차장 소유주에게 높은 수익을 제공 건물주 및 관리단의 주차관리 업무 부담과 무단 주차, 불법 주차 해소, 운영비용 감축이 가능 건물 주자창, 주차전용건물 등을 소유주에게 임대료를 지급하고 임대하여 당사가 직접 운영하는 사업이 가능 기존에 운영되는 주차장을 무인화 주차장으로 전환하여 주차장과 관련된 모든 업무를 당사가 위탁하여 관리 및 운영이 가능 기존에 운영되는 주차장 보다 인건비 대비 낮은 비용으로 주차장을 관리 하여 이익을 증대