2017 공개소프트웨어 역량강화교육 아두이노 프로젝트 팀 일방통행 (김태연, 전현우, 조승우)

Hyeonu_Chun·2021년 6월 21일
0

왕복 1차선 도로 신호등 자동화 시스템

Master part code

#include <SoftwareSerial.h>

SoftwareSerial slaveA_port(10,11);
SoftwareSerial slaveB_port(5,6);

const int button_pin = 4;
//////////////// master -> slave 전송 문자////////////// 
const char master_car_in = 'c';
const char master_traffic_Green = 'g';
const char master_traffic_Red = 'r';
const char master_traffic_Yellow = 'y';
  
  /////////////slave -> master 전송 문자///////////////////
const char slave_sign_in = 'i';
const char slave_sign_out = 'o';
const char slave_sign_wait = 'w';
const char slave_sign_passive = 'p';
const char slave_sign_auto = 'a'; 


int carpassing_half = 0;
int master_slaveA_carwait = 0;    ///현재 A에서 기다리고 있는 차량 대수
int master_slaveA_carin = 0;      ///현재 A에서 출발한 차량 대수
int master_slaveB_carwait = 0;    ///현재 B에서 기다리고 있는 차량 대수
int master_slaveB_carin = 0;      ///현재 B에서 출발한 차량 대수
unsigned int master_car_passing_count = 0;  
char master_slaveA_inputval = 0;  ///slaveA 에서 읽은 변수
char master_slaveB_inputval = 0;  ///slave

int prevstate = 1;
int num = 0;
int button_state;

void setup() {
  ///////////////// 포트 설정 및 serial 설정////////////
  Serial.begin(9600);
  slaveA_port.begin(9600);
  slaveB_port.begin(9600);
  pinMode(button_pin,INPUT);

  //////////////기본 설정 /////////////////////////////
  slaveA_port.print(master_traffic_Red);
  slaveB_port.print(master_traffic_Red);

  


////중앙 버튼 클릭 카운트 변수-> 2번 눌려야 한번으로 인식함/////


}

void count_init(){
  master_slaveA_carwait = 0;
  master_slaveA_carin = 0;
  master_slaveB_carwait = 0;
  master_slaveB_carin = 0;
  master_car_passing_count = 0;
  carpassing_half = 0;
  prevstate = 1;
  num = 0;
}

void cal_passing_car(){
  master_car_passing_count = abs(master_slaveA_carin - master_slaveB_carin);
}

void traffic_light_control(char input_value, char place){
  if(place == 'B'){
    switch(input_value){
      case slave_sign_wait:
      Serial.print("get ");
      Serial.print(slave_sign_wait);
      Serial.print(" : place B\n");
        master_slaveB_carwait++;
        if(master_car_passing_count == 0){
          slaveB_port.print(master_traffic_Green);
          slaveA_port.print(master_traffic_Red);
          Serial.print("1. sned - A : r, B : g\n");
        }else if(master_car_passing_count - carpassing_half == 0){
          if(master_slaveA_carin == 0){
            if(master_slaveA_carwait == 0){
              slaveB_port.print(master_traffic_Green);
              slaveA_port.print(master_traffic_Red);
              Serial.print("2. sned - A : r, B :g \n");
            }else{
              slaveB_port.print(master_traffic_Red);
              slaveA_port.print(master_traffic_Red);
              Serial.print("3. sned - A : r, B :r \n");
            }            
          }else{
              slaveB_port.print(master_traffic_Red);  
              slaveA_port.print(master_traffic_Red);
              Serial.print("4. sned - A : r, B :r \n");
          }                    
        }else{
          if(master_slaveA_carin == 0){
            slaveB_port.print(master_traffic_Green);
            slaveA_port.print(master_traffic_Red);
            Serial.print("5. sned - A : r, B :g \n");            
          }else{
            slaveB_port.print(master_traffic_Red);
            slaveA_port.print(master_traffic_Green);  
            Serial.print("6. sned - A : g, B :r \n");
          } 
        }
        break;
      case slave_sign_in:
      Serial.print("get ");
      Serial.print(slave_sign_in);
      Serial.print(" : place A\n");
        master_slaveB_carin++;
        master_slaveB_carwait--;
        cal_passing_car();
        slaveA_port.print(master_car_in);
        if(master_car_passing_count == 3){
          if(master_slaveA_carwait == 0){
            if(master_slaveB_carwait == 0){
              slaveB_port.print(master_traffic_Red);  
              Serial.print("7. sned - A : , B :r \n");
            }else{
              slaveB_port.print(master_traffic_Green);
              Serial.print("8. sned - A : , B :g \n");
            }            
          }else{
            slaveB_port.print(master_traffic_Red);
            Serial.print("9. sned - A : , B :r \n");
          }
        }
        slaveB_port.print(master_car_passing_count);
        Serial.print("10. sned - A : , B :carr passing count \n");
        break;
      case slave_sign_out:
      Serial.print("get ");
      Serial.print(slave_sign_out);
      Serial.print(" : place A\n");
        master_slaveA_carin--;
        carpassing_half--;
        cal_passing_car();
        if(master_car_passing_count ==  0){
          if(master_slaveB_carwait == 0){
            slaveA_port.print(master_traffic_Red);
            Serial.print("11. sned - A : r, B : \n");
          }else{
            slaveB_port.print(master_traffic_Green);
            Serial.print("12. sned - A : , B :g \n");
          }
        }else{
          slaveB_port.print(master_traffic_Red);
          Serial.print("13. sned - A : , B :r \n");
        }
        slaveB_port.print(master_car_passing_count);
        Serial.print("14. sned - A : , B : car passign count \n");
        break;
      case slave_sign_passive:
      Serial.print("get ");
      Serial.print(slave_sign_passive);
      Serial.print(" : place A\n");
        slaveB_port.print(master_traffic_Yellow);
        slaveA_port.print(master_traffic_Yellow);
        Serial.print("15. sned - A : y, B :y \n");
        count_init();
        break;
      case slave_sign_auto:
      Serial.print("get ");
      Serial.print(slave_sign_auto);
      Serial.print(" : place A\n");
        slaveB_port.print(master_traffic_Red);
        slaveA_port.print(master_traffic_Red);
        Serial.print("16. sned - A : r, B :r \n");
        count_init();
        break;
      default :
      Serial.print("B do noting\n");
    }
  }
  //////////////////////////////////////////////////////////
  if(place == 'A'){
    switch(input_value){
      case slave_sign_wait:
      Serial.print("get ");
      Serial.print(slave_sign_wait);
      Serial.print(" : place A\n");
        master_slaveA_carwait++;
        if(master_car_passing_count == 0){
          slaveA_port.print(master_traffic_Green);
          slaveB_port.print(master_traffic_Red);
          Serial.print("1. sned - A : g, B :r \n");
        }else if(master_car_passing_count - carpassing_half == 0){
          if(master_slaveB_carin == 0){
            if(master_slaveB_carwait == 0){
              slaveA_port.print(master_traffic_Green);
              slaveB_port.print(master_traffic_Red);
              Serial.print("2. sned - A : g, B :r \n");
            }else{
              slaveA_port.print(master_traffic_Red);
              slaveB_port.print(master_traffic_Red);
              Serial.print("3. sned - A : r, B :r \n");
            }            
          }else{
              slaveA_port.print(master_traffic_Red);  
              slaveB_port.print(master_traffic_Red);
              Serial.print("4. sned - A : r, B :r\n");
          }                    
        }else{
          if(master_slaveB_carin == 0){
            slaveA_port.print(master_traffic_Green);
            slaveB_port.print(master_traffic_Red);     
            Serial.print("5. sned - A : g, B :r \n"); 
          }else{
            slaveA_port.print(master_traffic_Red);
            slaveB_port.print(master_traffic_Green);  
            Serial.print("6. sned - A : r, B :g \n");
          } 
        }
        break;
      case slave_sign_in:
      Serial.print("get ");
      Serial.print(slave_sign_in);
      Serial.print(" : place B\n");
        master_slaveA_carin++;
        master_slaveA_carwait--;
        cal_passing_car();
        if(master_car_passing_count == 3){
          if(master_slaveB_carwait == 0){
            if(master_slaveA_carwait == 0){
              slaveA_port.print(master_traffic_Red);  
              Serial.print("7. sned - A : r, B : \n");
            }else{
              slaveA_port.print(master_traffic_Green);
              Serial.print("8. sned - A : g, B : \n");
            }            
          }else{
            slaveA_port.print(master_traffic_Red);
            Serial.print("9. sned - A : r, B : \n");
          }
        }
        slaveA_port.print(master_car_passing_count);
        Serial.print("10. sned - A : car passing count, B : \n");
        break;
      case slave_sign_out:
      Serial.print("get ");
      Serial.print(slave_sign_out);
      Serial.print(" : place B\n");
        master_slaveB_carin--;
        carpassing_half--;
        cal_passing_car();
        if(master_car_passing_count ==  0){
          if(master_slaveA_carwait == 0){
            slaveB_port.print(master_traffic_Red);
            Serial.print("11. sned - A : , B :r \n");
          }else{
            slaveA_port.print(master_traffic_Green);
            Serial.print("12. sned - A : g, B : \n");
          }
        }else{
          slaveA_port.print(master_traffic_Red);
          Serial.print("13. sned - A : r, B : \n");
        }
        slaveA_port.print(master_car_passing_count);
        Serial.print("14. sned - A : car passing count, B : \n");
        break;
      case slave_sign_passive:
      Serial.print("get ");
      Serial.print(slave_sign_passive);
      Serial.print(" : place B\n");
        slaveA_port.print(master_traffic_Yellow);
        slaveB_port.print(master_traffic_Yellow);
        Serial.print("15. sned - A : y, B :y \n");
        count_init();
        break;
      case slave_sign_auto:
      Serial.print("get ");
      Serial.print(slave_sign_auto);
      Serial.print(" : place B\n");
        slaveA_port.print(master_traffic_Red);
        slaveB_port.print(master_traffic_Red);
        Serial.print("16. sned - A : r, B :r \n");
        count_init();
        break;
      default :
      Serial.print("A do noting\n");
    }
  }
}

void loop() {
  ////중앙 버튼 파악//////
  button_state = digitalRead(button_pin);
  if(button_state != prevstate){
    if(button_state == 0){
      if(num == 0){
        num++;
      }
      else{
        carpassing_half++;
        Serial.print(carpassing_half);
        num =0;
      }
    }
    prevstate = button_state;
  }

  //////////////////////////////

  if(slaveA_port.available()>0){
    master_slaveA_inputval = slaveA_port.read();
    traffic_light_control(master_slaveA_inputval,'A');
    Serial.print("A에서 기다리는 차량 : ");
    Serial.print(master_slaveB_carwait);
    Serial.print(" 대\n");
    Serial.print("A에서 출발한 차량 : ");
    Serial.print(master_slaveB_carin);
    Serial.print(" 대\n");
    Serial.print("통과 중인 차량 : ");
    Serial.print(master_car_passing_count);
    Serial.print(" 대\n");
    Serial.print("절반이상 통과한 차량 : ");
    Serial.print(carpassing_half);
    Serial.print(" 대\n");
    Serial.print("-----------------------------------------\n");
  }
  
  if(slaveB_port.available()>0){
    master_slaveB_inputval = slaveB_port.read();
    traffic_light_control(master_slaveB_inputval,'B');
    Serial.print("B에서 기다리는 차량 : ");
    Serial.print(master_slaveB_carwait);
    Serial.print(" 대\n");
    Serial.print("B에서 출발한 차량 : ");
    Serial.print(master_slaveB_carin);
    Serial.print(" 대\n");
    Serial.print("통과 중인 차량 : ");
    Serial.print(master_car_passing_count);
    Serial.print(" 대\n");
    Serial.print("절반이상 통과한 차량 : ");
    Serial.print(carpassing_half);
    Serial.print(" 대\n");
    Serial.print("-----------------------------------------\n");
  } 
}

################################################################

Slave part code

#include <SoftwareSerial.h>

SoftwareSerial master_port(10,11);

int BUTTON_PASSIVE = 8;
int BUTTON_WAIT = 6;
int BUTTON_OUT = 7;
int BUTTON_IN = 5;

int LED_R = 2;
int LED_G = 3;
int LED_Y = 4;

int btnstate1, btnstate2, btnstate3, btnstate4, btnstate5;
int prevstate1 = 1;
int prevstate2 = 1;
int prevstate3 = 1;
int prevstate4 = 1;
int prevstate5 = 1;

int num1 = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
int num5 = 0;

int BUZZER = 10;
const int beepFrequency = 900;
const int beepDuration = 10;


int passive_current;
int passive_save;

int gDelay = 1000;
unsigned long tme = 0;
static boolean ledStat = LOW;

int passive_auto_switch =0;

void setup() {
Serial.begin(9600);
master_port.begin(9600);

pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_Y, OUTPUT);
}

void loop() {
  if(master_port.available()>0){
    char c = (char)master_port.read();
    Serial.print(c);
    if(c == 'r'){
      digitalWrite(LED_R, HIGH);
      digitalWrite(LED_G, LOW);
      digitalWrite(LED_Y, LOW);      
    }
    if (c == 'g'){
      digitalWrite(LED_R, LOW);
      digitalWrite(LED_G, HIGH);
      digitalWrite(LED_Y, LOW);
    }

   if(c == 'y'){
    digitalWrite(LED_R, LOW);
      digitalWrite(LED_G, HIGH);
      digitalWrite(LED_Y, LOW);
   }
  }  
    
  if(digitalRead(LED_R) == 1){
    btnstate3 = digitalRead(BUTTON_IN);
    if(btnstate3 == false){
      tone(BUZZER, beepFrequency, beepDuration);
    }
  }
  /* 0 - 9 */
  
//WAIT BUTTON  
  btnstate1 = digitalRead(BUTTON_WAIT);

  if(btnstate1 != prevstate1){
    if(btnstate1 == 0){
      if(num1 == 0){
        num1 ++;
      }
      else{
        master_port.print("w");
        num1 = 0;
      }
    }
    prevstate1 = btnstate1;
  }

//OUT BUTTON  
  btnstate2 = digitalRead(BUTTON_OUT);

  if(btnstate2 != prevstate2){
    if(btnstate2 == 0){
      if(num2 == 0){
        num2 ++;
      }
      else{
        master_port.print("o");
        num2 = 0;
      }
    }
    prevstate2 = btnstate2;
  }

//IN BUTTON  
  btnstate3 = digitalRead(BUTTON_IN);

  if(btnstate3 != prevstate3){
    if(btnstate3 == 0){
      if(num3 == 0){
        num3 ++;
      }
      else{
        master_port.print("i");
        num3 = 0;
      }
    }
    prevstate3 = btnstate3;
  }

//PASSIVE BUTTON  
  btnstate5 = digitalRead(BUTTON_PASSIVE);
  if(btnstate5 != prevstate5){
    if(passive_auto_switch == 0){
      if(btnstate5 == 0){
        master_port.print("p");
        passive_auto_switch = 1;
        BUTTON_WAIT = 0;
        BUTTON_OUT = 0;
        BUTTON_IN = 0;
        }
      }else{
        if(btnstate5 == 0){
        master_port.print('a');
        passive_auto_switch = 1;
        BUTTON_WAIT = 6;
        BUTTON_OUT = 7;
        BUTTON_IN = 5;
        }
      }
      prevstate5 = btnstate5;
    } 
}

profile
Stay hungry, stay foolish

0개의 댓글