[Day42] 2022-03-29(화) 아두이노7 - 부저, 조도센서, PIR센서, 온습도센서, LCD1 - 김서연 강사님
[1] 부저(Piezo Buzzer)
- <아두이노 마스터1 우노보드 기초 - 신동욱> p234~243
- 삐 소리를 출력
- 주파수 신호를 주면 음계를 표현할 수 있다.
- 능동부저(전원만 연결해도 출력)와 수동부저(전원만 연결하면 출력X)가 있다.
- 극성을 주의해서 연결
- (+)에 디지털 출력핀, (-)에 GND 연결하면 끝!
1. 음계와 주파수 관계
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가 별도 저항)하면, 어두울수록 입력되는 전압값이 작아짐
- 연결하는 저항에 따라 입력값의 범위가 달라지는데, 보통 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
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"
1. Datasheet
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. 각 핀의 역할
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) 출력
- 끝 -