#include <SPI.h>
#include <Ethernet.h> //이더넷 통신을 위한 라이브러리
#include <SoftwareSerial.h> //블루투스 통신을 위한 라이브러리
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF }; //MAC Address
IPAddress server(70,12,109,133);
IPAddress ip(70,12,109,133);
EthernetClient client;
int conn;
int reqInterval=3000;
SoftwareSerial BTSerial(2, 3); //블루투스 모듈이 연결된 핀번호
byte buffer[1024]; //데이터 수신 버퍼
int bufferPosition; //버퍼에 기록할 위치
//각 압력센서에 연결된 핀번호
int fsrPin0 = A0;
int fsrPin1 = A1;
int fsrPin2 = A2;
int fsrPin3 = A3;
int fsrPin4 = A4;
//각 압력센서에서 읽은 데이터를 저장할 변수
int fsrReading0 = 0;
int fsrReading1 = 0;
int fsrReading2 = 0;
int fsrReading3 = 0;
int fsrReading4 = 0;
//좌석에 사람 착석여부를 판단하는 압력센서의 값
int threshold = 500;
//잔여좌석에 대한 정보를 저장하는 배열. 전체좌석은 45석.
int seatStatus[45] = {0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
//각각의 LED와 연결된 핀번호
int redLed = 6;
int redLed2 = 7;
//스피커와 연결된 핀번호
int speaker = 5;
//하차벨과 연결된 핀번호
int redState = 0;
int redState2 = 0;
//냉/난방장치와 연결된 핀번호
int motorPin = 9;
//냉/난방장치의 on/off상태
int motorState = 0;
int motorM;
unsigned long time = 0;
boolean connectStatus = false;
void sendRequest()
{
if((millis() - time) < reqInterval)
{
return;
}
if(!client.connected())
{
client.stop();
if(client.connect(server, 80))
{
Serial.println("connected");
}
else
{
Serial.println("connection failed");
}
}
else
{
if (client.connected())
{
//서버로 HTTP Request 전송
client.print("GET /Busta/saveSeat.do?routeid=1111&seats=");
//좌석에 대한 정보를 가진 배열(seatStatus)을 문자열로 변환하여 seats라는 값으로 전송
for(int i=0; i<45; i++)
{
client.print(seatStatus[i]);
}
client.println(" HTTP/1.1");
client.println("Host: 70.12.109.137");
client.println("Connection: close");
client.println();
}
else
{
Serial.println("skip this turn..");
}
}
}
void beep(unsigned char delayms)
{
analogWrite(speaker, 100);
delay(delayms); //대기
analogWrite(speaker, 0); //사운드OFF
}
void setup ()
{
//하차벨(redLed, redLed2)
pinMode(redLed, OUTPUT);
pinMode(redLed2, OUTPUT);
//하차벨 스피커(speaker)
pinMode(speaker, OUTPUT);
//냉난방장치(motorPin) 설정
pinMode(motorPin, OUTPUT);
digitalWrite(motorPin, LOW);
//블루투스를 통해 데이터를 주고 받기 위해 시리얼 통신BTSerial) 시작
BTSerial.begin(9600);
bufferPosition = 0;
Serial.begin(115200);
Serial.println("trying to start Ethernet...");
// start the Ethernet connection:
conn = Ethernet.begin(mac) == 0;
Serial.println(conn);
if (conn)
{
Serial.println("failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
// try to congifure using IP address instead of DHCP:
Ethernet.begin(mac, ip);
}
time = millis();
}
void loop ()
{
while(client.available())
{
char c = client.read();
Serial.print(c);
}
fsrReading0 = analogRead(fsrPin0);
fsrReading1 = analogRead(fsrPin1);
fsrReading2 = analogRead(fsrPin2);
fsrReading3 = analogRead(fsrPin3);
fsrReading4 = analogRead(fsrPin4);
Serial.println(fsrReading0);
Serial.println(fsrReading1);
Serial.println(fsrReading2);
Serial.println(fsrReading3);
Serial.println(fsrReading4);
if(fsrReading0 > threshold) //좌석에 설치된 압력센서가 threshold의 값(650)을 넘으면
{
Serial.println("person seated");
seatStatus[0] = 1; //사람이 앉은 것으로 인식하여 좌석정보 변경.
sendRequest(); //변경된 좌석값을 Http Request를 통해 전송
}
else
{
Serial.println("seat empty");
seatStatus[0] = 0; //좌석에 설치된 압력센서가 threshold의 값(650)을 넘지 않으면
sendRequest(); //변경된 좌석값을 Http Request를 통해 전송
}
if(fsrReading1 > threshold)
{
Serial.println("person seated");
seatStatus[1] = 1;
sendRequest();
}
else
{
Serial.println("seat empty");
seatStatus[1] = 0;
sendRequest();
}
if(fsrReading2 > threshold)
{
Serial.println("person seated");
seatStatus[2] = 1;
sendRequest();
}
else
{
Serial.println("seat empty");
seatStatus[2] = 0;
sendRequest();
}
if(fsrReading3 > 950)
{
Serial.println("person seated");
seatStatus[3] = 1;
sendRequest();
}
else
{
Serial.println("seat empty");
seatStatus[3] = 0;
sendRequest();
}
if(fsrReading4 > threshold)
{
Serial.println("person seated");
seatStatus[5] = 1;
sendRequest();
}
else
{
Serial.println("seat empty");
seatStatus[5] = 0;
sendRequest();
}
if (BTSerial.available()) //블루투스로 데이터 수신
{
byte data = BTSerial.read();
Serial.write(data); //수신된 데이터 시리얼 모니터로 출력
if(data == '1') //하차벨 버튼을 눌렀을 경우
{
if(redState == 0) //하차벨이 꺼져 있을 경우
{
digitalWrite(redLed, HIGH); //하차벨의 불을 킴
digitalWrite(redLed2, HIGH);
redState = 1; //하차벨의 상태를 켜진 상태로 세팅
redState2 = 1;
delay(150);
beep(9000); //스피커에서 소리 발생시킴
}
else // 하차벨이 켜져 있을 경우
{
digitalWrite(redLed, LOW); //하차벨을 끔
digitalWrite(redLed2, LOW);
redState = 0; //하차벨의 상태를 꺼진 상태로 세팅
redState2 = 0;
delay(150);
}
}
if(data == '2') //냉난방 켜기 버튼을 눌렀을 경우
{
Serial.println("motor on");
if(motorState == 0)
{
digitalWrite(motorPin, HIGH); //냉난방 켬
motorState = 1;
delay(150);
}
}
if(data == '3') //냉난방 끄기 버튼을 눌렀을 경우
{
Serial.println("motor off");
if(motorState == 1)
{
analogWrite(motorPin, LOW); //냉난방 끔
motorState = 0;
delay(150);
}
}
Serial.println("--------------------");
}