2022. 5. 17. 23:51ㆍ학부 강의/Arduino
아날로그 온도센서
1. LM 35
LM35는 브레드보드에 저항 연결 없이 바로 사용할 수 있는 온도센서
아두이노 시리얼 모니터에서 입력된 온도를 읽을 수 있고 -55ºc에서 150ºc까지 측정 가능
1도당 대략 10mV의 스케일로 0~100도를 0 ~ 1V로 표현
아날로그 입력 핀에 연결하여 온도 측정
2. TMP36
아두이노 시뮬레이터에서 지원하는 온도센서.
첫 번째 단자는 Vs로 전원에 연결하고, 두 번째 단자는 Vout으로 온도 값에 해당하는 전압을 출력한다.
세 번째 GND에 연결한다.
아날로그 입력값 → 전압 | AnalogInput * 5.0/1023 |
온도 → 전압 | Voltage = 1/100 * Temperature + 0.5 |
전압 → 온도 | Temperature = 100 * Voltage - 50 |
4_1
// C++ code
//
void setup()
{
Serial.begin(9600);
}
void loop()
{
int analogInput = analogRead(A0);
float voltage = analogInput*5.0/1023.0;
float temperature = voltage*100-50;
Serial.print("Temperature : ");
Serial.println(temperature);
}
float voltage = analogInput*5.0/1023.0;
- 아날로그 입력값과 전압은 비례한다.
- 아날로그 입력은 0에서 1023의 범위를 갖는다.
- 전압은 0에서 5V의 범위를 갖는다.
- Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V)
디지털 온습도 센서
DHT11
주변 온습도 측정 가능
아날로그 초음파 센서
20KHz 이상인 음파를 말함. (가청주파수를 뛰어넘음)
발신부에서 신호를 보내고 반사되어 돌아오는 시간을 계산하여 거리 측정
- 거리 = 1/2 x 반사되어 돌아온 시간 x 음파의 속도(340m/s)
- Tring : 발신부
- Echo : 수신부
HC-SR04 초음파 센서
동작 전압 : 5V
발생하는 주파수 40KHz
측정 거리 : 2~400cm
핀은 4개가 있음. 5V, GND, Trig(발신), 핀번호(수신)
4_3
void setup()
{
Serial.begin(9600);
}
void loop()
{
pinMode(9, OUTPUT); // Trigger
digitalWrite(9, LOW);
delayMicroseconds(2);
digitalWrite(9, HIGH);
delayMicroseconds(5);
digitalWrite(9, LOW);
pinMode(9, INPUT); // echo
double duration = pulseIn(9, HIGH);
double cm = duration*340/10000/2;
//거리 = 1/2 x 반사되어 돌아온 시간 x 음파의 속도(340m/s)
Serial.println(cm);
}
double duration = pulseIn(9, HIGH);
pulseIn(pin, value) |
pulseIn(pin, value, timeout) |
pin
: 펄스를 읽을 핀 번호. (int)
value
: 읽을 펄스의 유형: HIGH 또는 LOW. (int)
timeout
(옵션): 펄스 시작을 기다릴 시간 (마이크로초 단위). 기본값은 1초 (unsigned long). 정해진 timeout 안에 펄스가 시작되지 않으면 0을 반환.
타이머를 시작하고 9번 pin에 입력값이 HIGH
가 될 때까지 기다린다.
pin의 입력값이 HIGH
가 되면 해당 HIGH
신호의 끝에서(HIGH
에서 다시 LOW
가 되는 순간) 타이머를 멈춘다.
펄스의 길이는 마이크로초 단위로 반환한다.
출처 : https://www.arduino.cc/reference/ko/language/functions/advanced-io/pulsein/
double cm = duration*340/10000/2;
1s = 10^6μs이고 1m = 10^2 cm이다.
입력 단위에 맞게 m → cm로 s → μs로 바꾼다.
거리(cm) = duration(μs) * 340(10^2cm)/(10^6μs)/2
적외선 리모컨 송수신
적외선 리모컨은 일상생활에 자주 사용된다.
- 가시광선보다 주파수가 낮음 → 사람의 눈에 보이지 않는다.
- 적외선 led는 낮은 전압에서 구동된다. → 건전지 2개로 충분하다
- 출력 power가 다른 led보다 높다. → 적외선 송신 거리가 길다
- 각 제품마다 고유의 주파수 값으로 통신하고 있어 중복되지 않게 사용할 수 있음
IR 센서 & 적외선 리모컨
4_4
#include <IRremote.h>
IRrecv irrecv(8);
decode_results results;
void setup()
{
irrecv.enableIRIn();
pinMode(9, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if(irrecv.decode(&results)){
Serial.println(results.value, HEX);
if(results.value == 0xFD30CF){
digitalWrite(9, HIGH);
}
else{
digitalWrite(9, LOW);
}
delay(30);
irrecv.resume();
}
}
<IRremote.h>
헤더파일를 포함시키다.
IRrecv
IRrecv irrecv(8);
: 8번 핀엔 연결된 적외선 수신기 클래스 선언
irrecv.enableIRIn();
: IR 리시버 활성화
irrecv.decode(&results)
: 수신기에서 받은 데이터를 지정한 주소에 저장
if(irrecv.decode(&results))
: 리모콘에서 입력받은 값이 있는지 확인
irrecv.resume();
: 다음 신호를 받을 수 있도록 준비
decode_results
decode_results results;
: decode_results수신기 에서 받은 리모컨의 데이터를 저장하는 클래스
results.value
: 디코딩된 value값
class decode_results
{
public:
decode_type_t decode_type; // UNKNOWN, NEC, SONY, RC5, ...
unsigned int address; // Used by Panasonic & Sharp [16-bits]
unsigned long value; // Decoded value [max 32-bits]
int bits; // Number of bits in decoded value
volatile unsigned int *rawbuf; // Raw intervals in 50uS ticks
int rawlen; // Number of records in rawbuf
int overflow; // true iff IR raw code too long
};
Serial.println(results.value, HEX);
: 적외선 수신기로 받은 결과 값을 16진수(HEX)로 표시
출처 : https://juahnpop.tistory.com/66
출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kaiserkhan21&logNo=221075466490
'학부 강의 > Arduino' 카테고리의 다른 글
2022-05-23 Arduino_12 (0) | 2022.05.23 |
---|---|
2022-05-21 Arduino_11 (0) | 2022.05.21 |
2022-05-12 Arduino_9 (0) | 2022.05.12 |
2022-05-09 Arduino_8 (0) | 2022.05.09 |
2022-05-05 Arduino_7 (0) | 2022.05.05 |