#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");
}
}
################################################################
#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;
}
}