2015 기초공학설계 아두이노 프로젝트

Hyeonu_Chun·2021년 6월 21일
0

#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);
    }
  }
profile
Stay hungry, stay foolish

0개의 댓글