?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

pir 센서 질문드립니다

페이지 정보

작성자 한다해 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일15-10-05 09:34 조회1,616회 댓글9건

본문

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

 

LiquidCrystal_I2C lcd(0x20,16,2); 

int motion = 2; 

int light = 13; 

int flag = 1;

void setup() {

  

  digitalWrite(light,HIGH);

  lcd.init();

  lcd.backlight();

  pinMode(motion,INPUT);

  pinMode(light, OUTPUT);

  //pinMode(playbutton, INPUT); 

 

  Serial.begin(9600); 

  Keyboard.begin();

}

 

void loop() {

  

  

  delay(1000);

  int sensor = digitalRead(motion);

  Serial.println(sensor);

  

  if(sensor == HIGH && flag == 1) { 

    flag = 0;

    digitalWrite(light,LOW);

    delay(500);

    lcd.print("PLAY");

    Keyboard.write('u');

    delay(1);

    Keyboard.releaseAll();

    delay(15000);

    flag = 1;

     

    }

  if(sensor == LOW)

  {

    digitalWrite(light,HIGH);

    delay(1000);

    lcd.clear();

    delay(1000);

    lcd.print("END");

    delay(1000);

    lcd.clear();

  }

    

}

위와같이 pir 센서로 인식되면 led를 끄고 키보드 u키를 눌러서 lcd에 play표시하게끔 되잇고 그 인식한번된 상태에서는 15초동안 다른인식은 안받고 센서가 없게되면 led는 켜잇고 end 표시 1초동안 표시하고 꺼지고 처음으로 돌아가게끔 해놧습니다.

그런데 여기서 문제점은 딜레이가 안먹히고 바로바로 인식이 되는점입니다. 뭐가 잘못된것일까요?

댓글목록

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

소스코드에서 flag 값은 항상 1을 가지고
 if(sensor == HIGH && flag == 1) { }
조건문만 반복하게 되어 있는거 같아요.
if(sensor == LOW) 부분은 실행이 안되게 작성되어 있는거 같은데 맞나요?

sdf4566님의 댓글

sdf4566 이름으로 검색 댓글의 댓글 작성일

어 잘못올렷내요 저기서 수정할점은 if(sensor == LOW) 부분을 else로바꿔서 센서에 값이 없으면 아랫부분 실행되게햇는데요 값은 들어오는데 값이 else로 안가고 계속 if문에서만 맴도내요

sdf4566님의 댓글

sdf4566 이름으로 검색 댓글의 댓글 작성일

테스트할겸
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

int motion = 2;
void setup()
{
  lcd.init();                      // initialize the lcd
  pinMode(motion,INPUT);
  // Print a message to the LCD.
  lcd.backlight();
  digitalWrite(motion,LOW);
  //lcd.print("Hello, world!");
  Serial.begin(9600);
}

void loop()
{
  if(digitalRead(motion) == HIGH)
  {
    Serial.print("123");
    lcd.print("123");
    delay(5000);
  }
  else
  {
    Serial.print("456");
    lcd.print("456");
  }
이런코드로 해봣는데 시리얼에서는 456이 넘어와서 인식이돼는데 lcd에는 표시가 안되내요? lcd에서 엉킨건가요?

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

digitalWrite(motion,LOW);
이 부분은 잘못 넣으신듯. LCD의 I2C 연결과 address가 정확한지 확인이 필요할 것 같아요. 백라이트 동작은 되나요?

sdf4566님의 댓글

sdf4566 이름으로 검색 댓글의 댓글 작성일

예 백라이트는 잘 동작합니다 말씀하신부분도 삭제해봣는데 lcd표시가 안되내요 123한번나오고 끝나면 시리얼에서만 456나오고 lcd에서는 표시가안돼고 다시 모션인식햇을떄 lcd에서 456123 이렇게 한번에 나오내요

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 댓글의 댓글 작성일

음.. 이 문제는 잘 모르겠네요;; 아래처럼 setCursor() 함수등을 활용해서 한번 출력해보세요
lcd.setCursor(0,1);
lcd.print("Hi");

sdf4566님의 댓글

sdf4566 이름으로 검색 댓글의 댓글 작성일

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x20 for a 16 chars and 2 line display

int flag;
int motion = 2;
void setup()
{
                 
  pinMode(motion,INPUT);
 
  Serial.begin(9600);
  flag = 1;
}

void loop()
{
  if((digitalRead(motion) == HIGH) && flag == 1 )
  {
    flag = 0;
    Serial.print("123");
    delay(10000);
    flag = 1;
   
  }
  else
  {
    Serial.print("456");
 
  }

  }

  일단 lcd를 제외하고
여기서 플레그를 세워서 모션이 한번인식된동안에는 다른모션인식값을 10초동안 안받고싶은데 계속받게되내요 뭐가 잘못된걸까요?

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

flag = 0;
    Serial.print("123");
    delay(10000);
    flag = 1;

여기 보시면 flag를 0으로 바꾸고 10초 쉬고 다시 flag를 1로 바꾸는데요.. 이렇게 하면 10초 쉴 때를 제외하고 if 판별문을 거칠 때 flag는 항상 1 이 됩니다. 사실 flag를 사용하는 의미가 없는 셈입니다. 이게 기획하신 의도와 맞나요?