#include <IRremote.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define pLED_PIN 15 // 조건문을 사용하기 위해 임의로 정의
#define cLED_PIN 14 //
#define kLED_PIN 17 //
#define RECV_PIN 11 //
#define speakerPin 9
#define trigPin 12
#define echoPin 13
#define Gradient 6
IRrecv irrecv(RECV_PIN);
decode_results results;
LiquidCrystal lcd(7, 8, 2, 3, 4, 5);
Servo myservo;
String PWD = "1234";
int len = PWD.length();
unsigned int m = 0xFFFF; // MSB 18bit를 지우기 위해 선언
unsigned int power = 0x10EF50AF & m; // = 0x50AF (LSB 0000 ~ FFFE 까지 가능)
unsigned int device = 0x10EFD02F & m; // = 0xD02F
unsigned int power_down = 0x10EF49EF & m; // = 0x49EF
unsigned int Button_Hi = 0x10EF37EF & m; // = 0x37EF
unsigned int Button_Change = 0x10EF25EF & m;
int Switch = 10;
long randNumber;
unsigned int numDB[] = {0x00FF,0x807F,0x40BF,0xC03F,0x20DF,0xA05F,0x609F,0xE01F,0x10EF,0x906F}; // 리모콘에서 송신하는 0~9까지의 값
unsigned int recvPWD[10] = {0}; // 데이터를 수신받아 저장
unsigned int transPWD[10] = {0}; // PWD 값을 HEX 로 저장
int i,k,g,e,v; // 임의 값
void trans(){ // 입력된 PWD 를 HEX로 변환
Serial.println("===transPWD===");
for(int i=0; i<len; i++){
transPWD[i] = numDB[PWD[i] - 48]; // ASCII value
Serial.println(transPWD[i],HEX);
}
Serial.println("=============");
}
boolean comparePWD(int len){ // 비밀번호가 수신값과 입력값과 맞는지 확인 후 1과0으로 출력
boolean c = true;
for(int i=0;i<len;i++)
if(recvPWD[i]!=transPWD[i]){
c = false;
break;
}
return c;
}
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(pLED_PIN,OUTPUT);
pinMode(cLED_PIN,OUTPUT);
pinMode (speakerPin, OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(Gradient, INPUT);
lcd.begin(16, 2);
myservo.attach(10);
}
boolean sw = false;
int p; // 수신된 비밀번호의 배열 값
int c = false; // check
int count = 0;
int count1=0;
unsigned int values = 0;
void loop(){
int tmp;
if(count1 == 5){
Serial.println(" Count over");
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Count over");
lcd.setCursor(0,1);
delay(1500);
lcd.print(" Go to HELL");
delay(1500);
lcd.clear();
lcd.setCursor(0,0);
while(1){
lcd.print("Warn!");
analogWrite (speakerPin, 255);
delay (250);
analogWrite (speakerPin, 0x00);
delay (100);
if(irrecv.decode(&results)) {
values = results.value & m;
}
if(values == power_down) {
lcd.clear();
break;
}
irrecv.resume();
}
count1 = 0;
digitalWrite(kLED_PIN,LOW);
}
if(irrecv.decode(&results)){
values = results.value & m;
if(values == 0xFFFF)
irrecv.resume();
else{
if(values == power)
{
sw =! sw;
if(sw == 1)
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Start Reading");
}
digitalWrite(pLED_PIN,sw);
Serial.println(sw ? "++ ON ++" : "++ OFF ++");
if(sw){
trans(); // convert number to HEX
p = 0;
}
else{
if(len>p) tmp=len; else tmp=p;
c = comparePWD(tmp);
Serial.println(c);
digitalWrite(pLED_PIN,LOW);
delay (75);
if(c==0){
digitalWrite (speakerPin, 255);
delay (100);
digitalWrite (speakerPin, 0);
delay (75);
digitalWrite (speakerPin, 255);
delay (100);
digitalWrite (speakerPin, 0);
delay (75);
count1++;
count++;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Fail");
delay(1700);
lcd.clear();
for(count=0 ; count < tmp; count++)recvPWD[count] = 0x00;
}
else{
count1 = 0;
digitalWrite(cLED_PIN,HIGH);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Success!");
lcd.setCursor(0,1);
lcd.print(" OPEN");
digitalWrite (speakerPin, 255);
delay (100);
digitalWrite (speakerPin, 0);
delay (75);
digitalWrite (speakerPin, 255);
delay (100);
digitalWrite (speakerPin, 0);
delay (75);
myservo.write(180);
delay(10);
}
}
}
else if(sw){
if (values == numDB[0]) {
recvPWD[p++] = values;
Serial.println(values, HEX);
}
else if (values == numDB[1]) {
recvPWD[p++] = values;
Serial.println(values, HEX);
}
else if (values == numDB[2]) {
recvPWD[p++] = values;
Serial.println(values, HEX);
}
else if (values == numDB[3]) {
recvPWD[p++] = values;
Serial.println(values, HEX);
}
else if (values == numDB[4]) {
recvPWD[p++] = values;
Serial.println(values, HEX);
}
else if (values == numDB[5]) {
recvPWD[p++] = values;
Serial.println(values, HEX);
}
else if (values == numDB[6]) {
recvPWD[p++] = values;
Serial.println(values, HEX);
}
else if (values == numDB[7]) {
recvPWD[p++] = values;
Serial.println(values, HEX);
}
else if (values == numDB[9]) {
recvPWD[p++] = values;
Serial.println(values, HEX);
}
}
irrecv.resume(); // Receive the next value
}
}
if(digitalRead(cLED_PIN) == HIGH)
{
if(results.value == power_down)
{
digitalWrite(cLED_PIN,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Lock the door");
digitalWrite(pLED_PIN,LOW);
digitalWrite (speakerPin, 255);
delay (100);
digitalWrite (speakerPin, 0);
delay (75);
digitalWrite (speakerPin, 255);
delay (100);
digitalWrite (speakerPin, 0);
delay (75);
myservo.write(90);
delay(10);
delay(500);
lcd.setCursor(0,1);
lcd.print(" See you Later");
delay(3000);
digitalWrite(kLED_PIN,LOW);
for(count1=0 ; count1 < tmp; count1++) recvPWD[count1] = 0x00;
lcd.clear();
}
}
if(digitalRead(pLED_PIN)==HIGH)
{
lcd.setCursor(0,1);
for(g=0;g<4;g++) lcd.print(recvPWD[g],HEX);
g=0;
}
else if(digitalRead(kLED_PIN)==LOW)
{
while(1){
if(digitalRead(Gradient) == HIGH)
{
while(1){
lcd.print("Warn!");
digitalWrite (speakerPin, 255);
delay (100);
digitalWrite (speakerPin, 0);
delay (75);
digitalWrite (speakerPin, 255);
delay (100);
digitalWrite (speakerPin, 0);
delay (75);
if(digitalRead(Gradient) == LOW) break;
}
}
Ultrasonic_Wave();
if(irrecv.decode(&results))
{
values = results.value & m;
}
if(values == Button_Hi) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Hi, A+ !");
delay(1000);
lcd.setCursor(0,1);
lcd.print(" What's Up?");
digitalWrite(kLED_PIN,HIGH);
break;
}
Serial.flush();
irrecv.resume();
}
}
delay(20);
}
void Ultrasonic_Wave(){
float duration = 0, distance = 0;
digitalWrite(trigPin, HIGH);
delay(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = ((float)(340 * duration) / 10000) / 2;
if(distance < 40){
randNumber = random(1,7);
switch(randNumber){
case 1:{
lcd.clear();
lcd.setCursor(7,0);
lcd.print("Hi");
lcd.setCursor(3,1);
lcd.print("I'm Hungry");
delay(2000);
randNumber = 0;
lcd.clear();
delay(1000);
break;
}
case 2:{
lcd.clear();
lcd.setCursor(5,0);
lcd.print("Hello!");
lcd.setCursor(5,1);
lcd.print("My Bro!");
delay(2000);
randNumber = 0;
lcd.clear();
delay(1000);
break;
}
case 3:{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" How are you");
lcd.setCursor(0,1);
lcd.print(" Today?");
delay(2000);
randNumber = 0;
lcd.clear();
delay(1000);
break;
}
case 4:{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Welcome!");
delay(2000);
randNumber = 0;
lcd.clear();
delay(1000);
break;
}
case 5:{
lcd.clear();
lcd.setCursor(4,0);
lcd.print("Come on");
lcd.setCursor(6,1);
lcd.print("Man!");
delay(2000);
randNumber = 0;
lcd.clear();
delay(1000);
break;
}
case 6:{
lcd.clear();
lcd.setCursor(6,0);
lcd.print("Sir!");
lcd.setCursor(0,1);
lcd.print("Long time no see");
delay(2000);
randNumber = 0;
lcd.clear();
delay(1000);
break;
}
}
delay(20);
}
}