#include "ListLib.h"
int flag11 = 0;
int flag12 = 1;
int flag13 = 2;
int flag22 = 3;
int flag23 = 4;
int flag24 = 5;
List<int> button_list;
List<int> call_list;
bool flaglist[6] = {false,false,false,false,false,false};
unsigned long cur_timer = 0;
unsigned long pre_timer = 0;
bool rise = true;
int cur_floor = 0;
int value;
// 74HC595 핀 연결
int latchPin = 13; // 74HC595의 RCLK 핀
int clockPin = 12; // 74HC595의 SRCLK 핀
int dataPin = 11; // 74HC595의 SER 핀
byte leds = 0; // 8개 LED의 상태를 저장할 변수[버튼 표시용 6개][1~6], 4층 표시용[0] 1개
int call_button[6] = {A0,A1,A2,A3,A4,A5}; // 1층 상승, 2층 상승,하강, 3층 상승,하강, 4층 하강
int FLOOR_LED[9] = {2,3,4,5,6,7,8,9,10}; // 1층~3.2층 LED
void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
// Pin setting
for (int i =0;i<10;i++)
{
pinMode(FLOOR_LED[i],OUTPUT);
}
for(int i=0; i<6; i++)
{
pinMode(call_button[i],INPUT);
}
//확장핀모드설정
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
Serial.println("start");
digitalWrite(FLOOR_LED[cur_floor],HIGH);
}
// 버튼 상태에 따른 플래그 토글 함수
void button_pressed(int flag, int state)
{
Serial.println("pressed");
flaglist[flag] = not flaglist[flag];
if (flaglist[flag] == true)
{
call_list.Add(state);
bitSet(leds, (flag +1)); // 버튼 상태 LED 켜기
updateShiftRegister(); // 74HC595에 데이터 전송
}
else
{
call_list.Remove(call_list.IndexOf(state));
bitClear(leds,(flag+1));
updateShiftRegister();
}
Serial.println("call_list : ");
int kize = call_list.IndexOf(call_list.Last())+1;
for (int i = 0; i < kize; i++)
{
Serial.println(call_list[i]);
}
}
void next_floor()
{
if((cur_timer-pre_timer)>1000)
{Serial.println("next_floor");
// led 끄기
if (cur_floor == 9)
{
// 모든 LED 끄기
bitClear(leds,0); // 0번째 LED 끄기 4층
updateShiftRegister(); // 74HC595에 데이터 전송
}
else
{
digitalWrite(FLOOR_LED[cur_floor],LOW);
delay(10);
}
// 현재층 바꾸기
if(rise == true)
{
cur_floor = cur_floor + 1;
}
else
{
cur_floor = cur_floor - 1;
}
if(cur_floor != 9)
{
digitalWrite(FLOOR_LED[cur_floor],HIGH);
}
else if(cur_floor == 9)
{
bitSet(leds, 0); // 0번째 LED 켜기 4층
updateShiftRegister(); // 74HC595에 데이터 전송
}
pre_timer=cur_timer;
}
}
void sort_asc()
{Serial.println("sort asc");
int size = call_list.IndexOf(call_list.Last())+1;
// 오름차순 정렬
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (call_list[j] > call_list[j + 1]) {
// 인접한 두 요소 swap
byte temp = call_list[j];
call_list[j] = call_list[j + 1];
call_list[j + 1] = temp;
}
}
}
}
void sort_desc()
{Serial.println("sort desc");
int size = call_list.IndexOf(call_list.Last())+1;
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (call_list[j] < call_list[j + 1]) {
// 인접한 두 요소 swap
int temp = call_list[j];
call_list[j] = call_list[j + 1];
call_list[j + 1] = temp;
}
}
}
}
void loop()
{
Serial.println("-----------------------");
cur_timer=millis();
//버튼 읽기
if(digitalRead(A0) == true)
{
if(cur_floor != 0)
{
button_pressed(flag11, 11);
delay(100);
}
}
else if(digitalRead(A1) == true)
{
if(cur_floor !=3)
{
button_pressed(flag12,12);
delay(100);
}
}
else if(digitalRead(A2) == true)
{
if(cur_floor !=3)
{
button_pressed(flag22,22);
delay(100);
}
}
else if(digitalRead(A3) == true)
{
if(cur_floor !=6)
{
button_pressed(flag13,13);
delay(100);
}
}
else if(digitalRead(A4) == true)
{
if(cur_floor !=6)
{
button_pressed(flag23,23);
delay(100);
}
}
else if(digitalRead(A5) == true)
{
if(cur_floor !=9)
{
button_pressed(flag24,24);
delay(100);
}
}
if(call_list.First()==0)
{
call_list.Clear();
}
if(call_list.IsEmpty() == true)
{
// digitalWrite(FLOOR_LED[cur_floor],HIGH);
if (cur_floor % 3 != 0)
{
next_floor();
}
else
{}
}
else if(call_list.IsEmpty() == false)
{
Serial.print("rise : ");
Serial.println(rise);
Serial.print("cur_floor");
Serial.println(cur_floor);
Serial.println("call_list : ");
int kize = call_list.IndexOf(call_list.Last())+1;
for (int i = 0; i < kize; i++)
{
Serial.println(call_list[i]);
}
if(cur_floor /3 +1-call_list.First() %10 < 0)
{
rise = true;
}
else if(cur_floor /3 +1-call_list.First() %10 > 0)
{
rise = false;
}
else
{
if(cur_floor %3 == 0 && call_list.Count() == 1)
{
if(call_list.First()/10 == 1)
{
rise = true;
}
else if(call_list.First()/10 == 2)
{
rise = false;
}
}
}
if (call_list.First()/10 == 1)
// if (rise == true)
{
sort_asc();
}
else
{
sort_desc();
}
if(cur_floor %3 == 0)
{
if(rise==true)
// if(call_list.First()/10==1)
{
// call_list.Remove(call_list.IndexOf(10 + cur_floor / 3 + 1));
if(cur_floor == 0)
{
if(flaglist[flag11]==true)
{
button_pressed(flag11, 11);
delay(10);
}
}
if(cur_floor == 3)
{
if(flaglist[flag12]==true)
{
button_pressed(flag12, 12);
delay(10);
}
}
if(cur_floor == 6)
{
if(flaglist[flag13]==true)
{
button_pressed(flag13, 13);
delay(10);
}
}
if(cur_floor == 9)
{
if(flaglist[flag24]==true)
{
button_pressed(flag24, 24);
delay(10);
}
}
}
else if(rise==false)
// else if(call_list.First()/10==2)
{
// call_list.Remove(call_list.IndexOf(20 + cur_floor%3 +1));
if(cur_floor == 0)
{
if(flaglist[flag11]==true)
{
button_pressed(flag11, 11);
delay(10);
}
}
if(cur_floor == 3)
{
if(flaglist[flag22]==true)
{
button_pressed(flag22, 22);
delay(10);
}
}
if(cur_floor == 6)
{
if(flaglist[flag23]==true)
{
button_pressed(flag23, 23);
delay(10);
}
}
if(cur_floor == 9)
{
if(flaglist[flag24]==true)
{
button_pressed(flag24, 24);
delay(10);
}
}
}
next_floor();
}
else if(cur_floor%3 != 0)
{
next_floor();
}
}
}
// 74HC595에 데이터 전송
void updateShiftRegister() {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, leds);
digitalWrite(latchPin, HIGH);
}
//list.Add는 리스트 맨 뒤에 추가함
//새로 들어온 신호랑 현재 첫번째 신호랑 비교해서 원하지 않는 신호면 우선 바꿔둬서 무력화 시키면 될 듯