[아두이노] PIR, 조도 센서, LCD 실습

mj·2021년 10월 3일
0

아두이노

목록 보기
2/5

1. PIR 센서

PIR(passive infrared sensor) 센서 : 적외선을 통해 열을 발산하는 물체의 움직임을 감지하는 센서

- 단자 : 왼쪽부터 신호, 전원, 접지
- 신호는 디지털 입력 핀으로 값을 읽을 수 있다.
- 움직임 있다: 1 (HIGH), 움직임 없다: 0 (LOW)


1-1. PIR 센서로 현관 등 만들기

//결과 : 범위 안에 물체가 들어오면 LED가 켜지고 범위 안에 물체가 없으면 꺼진다.

void setup()
{
  Serial.begin(9600);
  pinMode(7, INPUT);
  pinMode(11, OUTPUT);
}

void loop()
{
  int value = digitalRead(7);
  Serial.println(value);
  
  if (value == HIGH) {
    digitalWrite(11, HIGH);
  }else {
    digitalWrite(11, LOW);
  }
}

2. 조도센서

조도 센서(photoresistor 포토레지스터) : 빛의 세기에 따라 저항 값이 변하는 센서

-빛이 많이 들어오면 저항이 작아지고, 적게 들어오면 저항이 커지는 황화 카드뮴이라는 화합물을 사용 (어두워질수록 1023에 가까워짐)
- 아날로그 (빛의 세기는 다양하므로)
- 핀 2개는 방향에 상관없이 전원과 접지 모두에 연결할 수 있음


2-1. 조도 센서로 스마트 가로등 만들기

  • 밝기가 100보다 큰 경우 LED ON
//결과 : 밝기가 100보다 큰 경우 LED가 켜지고 그렇지 않으면 꺼진다.

void setup()
{
  Serial.begin(9600);
  pinMode(11, OUTPUT);
}

void loop()
{
  int value = analogRead(A0);
  Serial.println(value);
  
  if (value>100) {
    digitalWrite(11, HIGH);//어두울 때 가로등 ON
  }else {
    digitalWrite(11, LOW);//밝을때 가로등 OFF
  }
}



  • 밝기에 따라 빛 조절
//결과 : 주변이 밝을수록 LED가 약해지고 주변이 어두울수록 LED는 밝아진다.
void setup()
{
  Serial.begin(9600);
  pinMode(11, OUTPUT);
}

void loop()
{
  int value = analogRead(A0);
  Serial.println(value);
  
  analogWrite(11, value/4);//빛의 밝기를 조절하는 것은 아날로그
}

3. LCD

LCD (액정 디스플레이, liquid crystal display) : 뒷면에 빛을 내는 백라이트를 배치하고 앞면에 액정을 두어 전기 신호에 따라 빛을 차단하거나 통과시키는 방식으로 문자나 숫자 등을 표시하는 장치
반드시 #include <LiquidCrystal.h> 헤더파일 추가!

- 서킷에서 제공하는 LCD는 1602LCD
- 가로16개, 세로 2줄 표현 가능



앞에서는 가변저항을 이용해 밝기를 조절했었음
가변저항 없이는 어떻게 하나?
V0(3번째) - 접지에 연결하면 항상 LED가 켜진 상태가 됨
LCD 화면에 쓸거니까 쓰기모드 -> 5번째, 접지

3-0. LCD 배선하기

  • GND : 접지, 브레드보드의 접지에 연결

  • VCC : 전원(5V), 브레드보드의 전원에 연결

  • V0 : LCD에 표시되는 문자의 밝기를 제어하는 단자
    - V0에 입력값을 정하기 위해 가변저항의 와이퍼 단자와 연결
    - 접지에 연결하면 항상 LCD가 밝게 켜진 상태가 된다.

  • RW : LCD의 값을 읽을지 쓸지 결정하는 단자
    - HIGH(+) : LCD에 출력된 값을 읽을 수 있음
    - LOW(-) : LCD에 문자를 출력할 수 있음

  • RS(Register Select) : LCD에 명령어를 전달할지 데이터를 전달할지 선택하는 스위치
    - HIGH(+) : LCD에 출력할 데이터를 전송할 수 있음
    - LOW(-) : LCD의 환경설정을 바꿀 수 있는 명령어를 전송
    - 디지털 값을 가지므로 디지털핀에 연결

  • E(enable) : 명령어를 실행하는 시점을 결정
    - 디지털 값을 가지므로 디지털핀에 연결

  • DB0~DB07 : 데이터 또는 명령어를 전송하는 단자
    - LCD의 데이터 단자를 여덟 개 모두 사용할 경우 아두이노 보드의 디지털 핀이 부족할 수 있으므로 단자는 보통 4개만 사용

  • 맨 오른쪽 끝에 있는 두 LED 단자 : LCD에서 백라이트를 사용하기 위한 단자
    - 왼쪽 단자 양극(+), 오른쪽 단자 음극(-)
    - LED 양극은 저항(220옴)을 넣어 브레드보드의 전원에 연결, LED 음극은 접지에 연결
    - LCD 모듈에 따라서 양극은 알파벳 A, 음극은 알파벳 K로 표기


3-1. 가변저항 사용하지 않고 lcd에 "hello" 출력하기

앞에서는 가변저항을 이용해 밝기를 조절했었다.
가변저항 없이는 어떻게 할까?
LCD의 3번째 핀(V0)을 접지에 연결하면 항상 LED가 켜진 상태가 된다.

#include <LiquidCrystal.h>

LiquidCrystal lcd(9, 8, 5, 4, 3, 2); //초기화

void setup()
{
  lcd.begin(16,2);
  lcd.setCursor(1,1); //커서 위치 설정
  lcd.print("hello");
}

void loop()
{
  
}

LiquidCrystal lcd(9, 8, 5, 4, 3, 2) : 아두이노 보드에 연결된 LCD 단자를 매핑해 라이브러리 변수 lcd를 선언하는 코드 (pinMode처럼 선언하는? 코드)
- 초기화를 먼저 해 놓아야 LCD가 아두이노에게 정상적으로 데이터를 받아 작동함

lcd.begin(16, 2) : 1602LCD 모듈 설정
- 어떤 형태의 LCD를 초기화할지 결정함
- 매개변수 : 열과 행
- 여기서 lcd는 초기화한 변수명

lcd.setCursor(1,1) : 커서의 위치 변경 (1열 1행으로)
- 커서란 LCD에서 문자 출력을 시작하는 위치
- 초기값은 0번째 열, 0번째 행


3-2. 가변저항을 사용해 lcd (분압기)

결과 : 분압기를 조절하면 lcd의 밝기가 조절됨
(lcd의 밝기 조절안하고 항상 lcd가 켜졌으면 좋겠다면 V0을 접지에 연결하면 됨


3-3. 랜덤하게 알파벳 출력하기

결과 : 공백, 알파벳이 랜덤하게 랜덤한 위치에 1초마다 출력된다.

#include <LiquidCrystal.h>

LiquidCrystal lcd(9, 8, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16,2);
  randomSeed(analogRead(0)); //난수 생성기 초기화
  
}

void loop()
{
  int row = random(0, 2); //0~1사이의 랜덤한 열번호 생성
  int col = random(0, 16); //0~15사이의 랜덤한 열번호 생성
  
  char ch = random(0, 27); //0~26사이의 랜덤한 숫자 생성(알파벳은 총 26개)
  
  if (ch==0) ch=' ';
  else ch = ch + 'A' - 1; //대문자(A~Z) 생성 (문자는 사실 숫자로 저장되므로 'A'+1하면 'B') 
  lcd.setCursor(col, row);
  lcd.write(ch);
  
  delay(1000);
  lcd.clear(); //화면을 지움
}

randomSeed(analogRead((0)) : 난수 생성기 초기화
연결되지 않은 analog포트를 읽으면 0~1023중 아무값이나 반환된다

random(min, max) : min ~ max-1 사이의 랜덤한 수 생성
ex) random(0, 16) : 0~ 15

lcd.clear() : LCD 화면 지우기

lcd.print("출력할 내용을 쓰세용") : LCD화면에 출력한다.

lcd.write() : LCD 화면에 값을 출력, 아스키코드 입력 시 해당문자 출력

Serial.print()의 경우 숫자를 그 숫자에 해당하는 아스키 코드로 바꾸어 전송하는 반면 Serial.write()는 그 숫자 자체를 보낸다.


3-4. 사용자 정의 문자


#include <LiquidCrystal.h>

LiquidCrystal lcd(9, 8, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16,2);
  
  //사용자 정의 문자 데이터
  byte user1[8] = {B00000, B10001, B00000, B00000, B10001, B01110, B00000, B00000};
  
  lcd.createChar(0, user1); //사용자 정의 문자 0 생성(즐겨찾기 처럼)
  lcd.setCursor(5, 0); //커서 위치 설정
  lcd.write(byte(0)); //사용자 정의 문자 0 출력
  
}

void loop()
{
  
}

createChar(사용자문자번호, 사용자문자데이터) : byte배열을 문자로 저장
- 사용자문자번호 : 0~7까지만 가능
- 사용자문자데이터 : ex.1차원배열..

byte(n) : 문자 출력


3-5. LCD에 온도값 출력하기


주의 : 온도센서의 출력값은 소수점을 표현할 수 있는 실수형이지만, LCD에 문자나 숫자를 출력하기 위한 입력값은 문자열형

//결과 : 깜빡깜빡거리면 LCD에 온도표시됨
#include <LiquidCrystal.h>

LiquidCrystal lcd(9, 8, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16,2);
  
  
  
}

void loop()
{
  int read = analogRead(A0);
  float voltage = read *5.0 / 1024.0; //전압값 변환
  float temperature = voltage * 100 - 50; //온도값 변환
  
  //lcd.print(temperature); --안됨!
  //온도센서의 출력값은 실수형이지만 LCD의 입력값은 문자열형이므로 바꿔줘야함.
  
  String str = String(temperature); //온도값 문자 변환
  lcd.print(str);
  
  delay(500);
  lcd.clear();
}

3-6. LCD에 출력된 문자에 이동 효과 주기

#include <LiquidCrystal.h>

LiquidCrystal lcd(9, 8, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16,2);
  
  //사용자 정의 문자 데이터
  byte user1[8] = {B00000, B10001, B00000, B00000, B10001, B01110, B00000, B00000};
  
  lcd.createChar(0, user1); //사용자 정의 문자 0 생성(즐겨찾기 처럼)
  lcd.setCursor(5, 0); //커서 위치 설정
  lcd.write(byte(0)); //사용자 정의 문자 0 출력
  
}

void loop()
{
  for (int i = 0; i < 2; i++){
    lcd.scrollDisplayLeft();
    delay(150);
  }
  for (int j =0; j < 4; j++) {
    lcd.scrollDisplayRight();
    delay(150);
  }
  for (int i = 0; i < 2; i++){
    lcd.scrollDisplayLeft();
    delay(150);
  }
}

scrollDisplayLeft() : LCD에 출력된 문자열을 왼쪽으로 한 칸씩 이동

scrollDisplayRight() : LCD에 출력된 문자열을 오른쪽으로 한 칸씩 이동


profile
일단 할 수 있는걸 하자.

1개의 댓글

comment-user-thumbnail
2022년 11월 30일

초음파센서를 활용하여 7세그먼트를 조절하려고 하는데 어떻게 하면 될지 여쭤봐도 될까요??

답글 달기

관련 채용 정보