프로젝트형 IoT 서비스 개발 4회차/2. 엣지 디바이스 제어

[Day42] 2022-03-29(화) 아두이노7 - 부저, 조도센서, PIR센서, 온습도센서, LCD1 - 김서연 강사님

powerstone 2022. 3. 29. 18:18
728x90

[1] 부저(Piezo Buzzer)

  - <아두이노 마스터1 우노보드 기초 - 신동욱> p234~243

  - 삐 소리를 출력

  - 주파수 신호를 주면 음계를 표현할 수 있다.

  - 능동부저(전원만 연결해도 출력)와 수동부저(전원만 연결하면 출력X)가 있다.

  - 극성을 주의해서 연결

  - (+)에 디지털 출력핀, (-)에 GND 연결하면 끝!

  1. 음계와 주파수 관계

출처 - https://kocoafab.cc/tutorial/view/626

 

  2. tone(핀번호, 주파수) or tone(핀번호, 주파수, 지속시간)

    1) 핀번호 : 디지털 핀 번호

    2) 주파수 : 1에 정의된 주파수 이용

    3) 지속시간 : 해당 음으로 몇 ms동안 출력(delay()와 달리 다음 코드를 진행하기 때문에 delay 별도로 줘야함)

 

  3. noTone(핀번호)

    - 해당 핀번호에 연결된 피에조부저의 출력을 중단(tone함수의 지속시간에 관계없이)

  4. 부저 예제

    - 부저로 도,레,미,파,솔,라,시,도 를 세 번 연주하고 부저에서 소리가 나지 않도록 설정

    1) CODE

// piezo_exam
// 도레미파솔라시도를 세 번 연주하고 피에조부저에서 발생되는 소리가 멈추도록 작업
int note[8] = {261, 293, 329, 349, 391, 440, 493, 523};
int over = 0;

void setup() {

}

void loop() {
  if(over==0){
    for(int i=0; i<3; i++){
      for(int j=0; j<8; j++){
        tone(7, note[j], 200);
        delay(200);
        // noTone(7);
      }
    }
    over = 1;
  }
}

    2) 동작(소리)

 

[2] 조도 센서 CdS (Photoresistor)

  - <아두이노 마스터1 우노보드 기초 - 신동욱> p278~281

  - 황화카드뮴으로 만들어져서 빛의 세기에 따라 소자 양단의 저항이 변화(광 가변저항 - photoresistor)

  - 밝으면 저항값이 감소, 어두우면 저항값이 증가

  - 극성이 없으므로 방향은 신경쓰지 않아도 되며, 별도의 저항과 함께 회로를 구성

  - 저항 끝을 5V, 조도 센서 끝을 GND에 연결할 경우

    -> 어두울수록 저항값이 커지고, 전압 분배 법칙에 따라 입력되는 전압값이 커짐

    -> 아래 사진에서 Vin이 5V, 반대쪽이 GND, R1이 별도 저항, R2가 조도 센서, Vout이 입력핀

    -> Vout = R2/(R1+R2)

    -> 반대로 연결(R1이 조도센서, R2가 별도 저항)하면, 어두울수록 입력되는 전압값이 작아짐

출처 -&nbsp;https://ko.wikipedia.org/wiki/%EC%A0%84%EC%95%95_%EB%B6%84%EB%B0%B0_%EB%B2%95%EC%B9%99

 

  - 연결하는 저항에 따라 입력값의 범위가 달라지는데, 보통 10k 저항을 사용하면 범위가 넓다.

  1. 조도 센서 예제

    1) CODE

void setup() {
  Serial.begin(9600);
}

void loop() {
  int photoresistor_val = analogRead(A0);
  Serial.println(photoresistor_val);
  delay(500);
}

    2) 회로

 

  2. 조도센서 + LED 예제1

    - 조도센서를 통해 들어오는 입력값이 500이 넘는 경우 LED를 켜기

    1) CODE

// photoresistor_exam1
// 500이 넘으면 LED를 켜기
int photo_pin = 0;
int led_pin = 11;

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

void loop() {
  int photo_val = analogRead(photo_pin);
  Serial.println(photo_val);
  if(photo_val>500){
    digitalWrite(led_pin, HIGH);
  }else{
    digitalWrite(led_pin, LOW);
  }
  delay(100);
}

    2) 회로

    3) 동작

 

  3. 조도센서 + LED 예제2

    - 조도센서를 통해 들어오는 입력값에 따라 LED 밝기 조절

    1) CODE

// photoresistor_exam2
// 빛의 밝기에 따라서 LED 밝기 조절
int photo_pin = 0;
int led_pin = 11;

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

void loop() {
  int photo_val = analogRead(photo_pin);
  Serial.println(photo_val);
  int led_val = map(photo_val, 49, 969, 0, 255);// 49~969는 팅커캐드 시뮬레이션 상 최솟값/최댓값
  analogWrite(led_pin, led_val);
  delay(1000);
}

    2) 회로

      - 2. 조도센서+LED 예제1 과 동일

    3) 동작

 

[3] PIR 센서 (Passive InfraRed sensor, HC-SR501)

  - <나도 아두이노 할수있다 입문자용 - 메카솔루션> p60~62

  - 적외선을 통해 움직임을 감지

  - 감지 각도 내에 적외선의 변화가 있으면 HIGH, 없으면, LOW 신호를 출력

  - 캡 내부에 센서 내장, 외부캡은 감지 각도를 넓혀줌

  1. Datasheet

HC-SR501 PIR Motion Sensor.pdf
0.22MB

 

출처 -&nbsp;https://www.epitran.it/ebayDrive/datasheet/44.pdf
출처 -&nbsp;https://www.epitran.it/ebayDrive/datasheet/44.pdf

  2. PIR 센서 + LED 예제

    - PIR 센서에서 움직임을 인지하면 LED가 켜지도록

    1) CODE

void setup() {
  pinMode(7, INPUT);    // PIR 센서 핀
  pinMode(11, OUTPUT);  // LED 핀
  Serial.begin(9600);
}

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

    2) 회로

 

[4] 온습도 센서(Temperature & Humidity Sensor, DHT11)

  - <아두이노 마스터1 우노보드 기초 - 신동욱> p282~289

  - 온도와 습도를 측정

  - 하나의 단자를 통해 디지털 신호를 출력

  - DHT11 은 성능이 조금 떨어져서, 테스트용이라고 보면 된다.

  - 외부 라이브러리를 받아서 사용(아두이노에 직접 설치 혹은 Github에서 다운 받아서 libraries 폴더에 넣기)

    - #include "DHT.h"

아두이노IDE 메뉴에서 스케치->라이브러리 포함하기->라이브러리 관리
DHT11 검색하여 설치

  1. Datasheet

DHT11-Technical-Data-Sheet-Translated-Version-1143054.pdf
1.42MB

  2. DHT.h 라이브러리의 DHT class 사용

    1) 객체 생성

      - DHT 객체명(핀번호, 타입)

        ① 핀번호 : 아날로그 입력핀 번호

        ② 타입 : DHT11, DHT22, DHT21, AM2301

    2) 객체명.begin( )

      - 데이터 연결핀의 내부 풀업저항 활성화

    3) 객체명.readHumidity( )

      - 습도 측정하여 float 타입으로 리턴

    4) 객체명.readTemperature( )

      - 온도 측정하여 float 타입으로 리턴

      - 매개변수가 없으면, default로 섭씨온도(false), 매개변수에 true 입력 시 화씨온도 리턴

 

  3. 온습도 센서 예제

    1) CODE

#include "DHT.h"
#define DHTTYPE DHT11
#define DHTPIN A0

DHT mydht11(DHTPIN, DHTTYPE);   // DHT11 객체 생성
void setup() {
  Serial.begin(9600);
  mydht11.begin();
}

void loop() {
  float humidity_val = mydht11.readHumidity();  // 습도 측정
  float temp_val = mydht11.readTemperature(); // 섭씨온도 측정
  float f_temp_val = mydht11.readTemperature(true); // 섭씨온도 측정
  delay(1000);  // 측정하기 전에 2초이상 간격을 주고 측정하기 위해 초기화할 시간을 적용
  if(isnan(humidity_val) || isnan(temp_val) || isnan(f_temp_val)){  // isnan(값) : is not a number? true/false 반환
    Serial.println("Fail~~~~");
    return; // 현재 작업을 종료
  }
  // 화면에 출력
  Serial.print("humidity:");
  Serial.print(humidity_val);
  Serial.print("%     ");
  Serial.print("temp:");
  Serial.print(temp_val);
  Serial.print("℃    ");
  Serial.print("f_temp:");
  Serial.print(f_temp_val);
  Serial.println("℉");
  Serial.println("=================================================");
}

    2) 시리얼 모니터

센서에 입김을 불면 습도가 올라간다...

 

[5] LCD 1602 (LCM1602A)

  - <아두이노 마스터1 우노보드 기초 - 신동욱> p197~205

  1. 각 핀의 역할

출처 -&nbsp;http://bsgwark.blogspot.com/2017/04/1602a-lcd-displaytext-scrolling.html
출처 -&nbsp;https://yes90.tistory.com/11

    1) GND

      - Ground

    2) VDD

      - LCD 전원(5V)

    3) V0

      - 음영 대비(Contrast) 설정

      - 전압을 높이면 음영이 밝아지면서 글자가 흐려지고, 전압을 낮추면 음영이 어두워지면서 글자도 진해진다.

      - 글자를 명확히 보려면 적절한 전압을 가해줘야 한다.(가변저항을 연결하여 적절하게 조절 가능)

    4) RS

      - Resistor Select : 명령어를 처리할지 데이터를 처리할지 선택

      - 텍스트 LCD를 제어하기 위해서는 제어 레지스터와 데이터 레지스터가 사용

      - 명령을 담고 있는 레지스터(RS=LOW)와 데이터를 담고 있는 레지스터(RS=HIGH) 중 하나를 선택하기 위해 사용

      - Digital 핀에 연결

    5) RW

      - Read/Write 정의

      - Read 모드 : HIGH

      - Write 모드 : LOW (GND) - 보통 write를 쓰기 때문에 RW는 GND에 연결

    6) E

      - Enable : LCD의 값을 쓸지, 쓰지 않을지

      - 데이터 전송 시작

      - 하강 에지(falling edge)에서 LCD 드라이버가 데이터 처리를 시작하도록 지시하기 위한 신호

      - Digital 핀에 연결

    7) D0~D7

      - 데이터 입출력 핀

      - 8비트 모드로 동작하는 경우에는 8개 모두 사용, 4비트 모드로 동작하는 경우 D4~D7 4개만 사용

      - MCU와 사용하는 경우 4비트 모드를 사용하는 경우가 일반적

      - Digital 핀에 연결

    8) BLA

      - Back Light Anode : LED의 (+)

      - 3.3V/5V 연결시 220Ω 저항을 사용

    9) BLK

      - Back Light Cathode : LED의 (-) (GND)

 

참고1 - https://codedragon.tistory.com/7922

 

1602 LCD 핀 구조 (핀맵)

1602 LCD 핀 구조 (핀맵) 핀이 많지만 전원 핀과 6개 핀만으로 동작을 시킬 수 있습니다. RS, RW, E 3개의 핀은 LCD를 제어하기 위한 핀입니다. 핀번호 표시 설명 1 VSS ·         GND 2 VDD ·    ..

codedragon.tistory.com

  2. 동작 원리

    1) RS, RW, E는 제어 신호를 위한 핀, D0~7 데이터 입출력 핀

    2) 메모리에 데이터를 저장하기 위해서는 데이터의 주소와 데이터가 필요

    3) 메모리에 데이터를 쓰거나 읽을 때, 각 핀들의 역할

      - RS : 데이터의 주소 전달

      - RW : 읽기/쓰기 모드 전달

      - D0~7 : 데이터 전달

      - E : 전달이 완료되면 E핀으로 완료 메시지가 전달되어 동작 완료

    4) D4~7 만 사용할 수 있는 이유

      - ASCII코드로 표현되는 문자의 한 글자는 8bit(1byte)

      - 8bit 정보를 보내려면 각 핀마다 1bit씩 담당하여 8개의 핀이 필요(D0~7) - 8-bit operation

      - D0~7을 모두 사용하는 경우, 하위 4bit는 D0~3, 상위 4bit는 D4~7 이 담당

      - 핀의 수를 줄이기 위해, D4~7만 사용하여 상위 4bit와 하위 4bit를 나누어서 보낼 수 있음 - 4-bit operation

참고2 - https://yes90.tistory.com/11

 

[아두이노]16x2 캐릭터 LCD 사용해보기

오늘은 LCD모듈을 이용해 여러가지 값들을 출력해보았다. 사용한 LCD는 LCM1602A 모듈이다. 모듈의 뒷 편에 보면 위와 같이 각 핀에 대한 정보가 적혀 있다. 아두이노와는 위와 같이 배선으로 연결

yes90.tistory.com

  3. LCD 기본 예제

    - LCD에 "hello, world!" 출력

    1) CODE

// lcd_test1
#include <LiquidCrystal.h>
// LiquidCrystal(rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(12, 11, 4, 5, 6, 7);
void setup() {
  // LCD초기화 start
  // 가로 두 줄, 세로 16글자를 표현할 수 있다.
  lcd.begin(16,2);
  lcd.print("hello, world!");
}

void loop() {

}

    2) 회로

    3) 출력

- 끝 -

728x90