
버저(buzzer)
-단순한 소리내는 장치
사용법: tone()함수
tone(핀번호, 주파수, 소리길이/밀리초)

모션감지센서(PIR센서)
-적외선 인체감지 센서라고도 함
사용법: pinMode()함수에 핀번호, INPUT으로 초기화한 다음 digitalRead(핀번호)로 정수값 반환

초음파센서(ultrasonic 센서)
-초음파를 Trig로 내보내서 Echo로 받아옴
사용법: pinMode()함수를 사용해서 Trig핀을 OUTPUT, Echo핀을 INPUT으로 초기화
초음파를 10us 정도 발사하려면
digitalWrite(Trig핀, HIGH);
delayMicroseconds(10);
digitalWrite(Trig핀, LOW);
그리고 이 초음파의 거리를 받아오려면
int duration = pulseIn(Echo핀, HIGH);
초음파의 속도는 340 m/s -> 34,000 cm/s 이고, 1초는 1000밀리초 -> 1,000,000마이크로초 이므로
1마이크로초 동안 초음파는 34000/1000000 = 0.034cm/us 다.
여기서 Trig핀으로 발사된 초음파는 물체에 반사되어 Echo핀으로 돌아오는 것이므로
왕복거리까지 고려하여 계산한다면 0.034/2 = 0.017 cm/us고, duration에 0.017을 곱한값이 물체와 초음파센서의 거리(cm)다.
또는,
거리 = 속력x시간
시간 = 거리/속력
여기서 시간 t = 1cm/0.034us = 29.4... 이므로
초음파는 29.4 us마다 1cm 이동한다.
int microsecondsToCentimeters(int microseconds) { return microseconds / 29 / 2; }


사용법:
#include "MQ135.h" 라이브러리 불러오고,
MQ135 gasSensor = MQ135(아날로그핀)으로 객체생성,
float ppm = gasSensor.getPPM(); 으로 농도측정

RGB LED
-그냥 LED 빨강,초록,파랑 섞어놓은거
사용법:
포텐셔미터(가변저항기)로 읽는예제


서보모터
(모터의 종류는 DC모터,서보모터, 스텝모터가 있음)
-아날로그 출력기능으로 PWM신호 0~180도 자유조작
사용법:
#include <Servo.h> 라이브러리 사용
Servo servo; 객체선언
servo.attach(서보핀) 으로 서보 객체에 서보핀 초기화
servo.write(각도) 로 회전
여기서 포텐셔미터로 각도를 조절하려면
analogRead(포텐셔미터 핀)으로 정수값 0~1023을 받아오고
int angle = map(포텐셔미터값, 0, 1023, 0, 180); 으로 회전값 변환
map()함수는 특정값x를 a~z 에서 가-하 로 맵핑해서 선형적으로 변환함

온습도 센서
-말그대로 온도와 습도를 확인하는 센서
사용법:
#include <DHT.h> 라이브러리
DHT dht(핀,DHT11); //객체생성
dht.begin()으로 초기화
dth.readTemperature() 이나 dth.readHumidity()로 온습도 float값으로 반환
그런데 분명히
#include <Wire.h> 라이브러리랑
#include <DHT11.h> 불러오고
DHT11 dth; 객체 생성한다음에
int값으로 readTemperatureHumidity() 로 한번에 불러오는 방식이 있던것같은데 잊어먹음

적외선 센서
pinMode()로 INPUT(입력모드)로 초기화
digitalRead(핀)으로 정수값 반환하고, LOW면 탐지됨/HIGH면 탐지안된상태

LCD(Liquid Crystal Display 액정 디스플레이)
말그대로 액정을 사용한 디스플레이
사용법:
#include <LiquidCrystal_I2C.h> 라이브러리 사용
LiquidCrystal_I2C lcd(0x27, 16, 2); 객체생성, 0x27은 주소로 모듈마다 0x3F인 것도 있음/ 16열, 2행
lcd.init()
lcd.backlight()로 초기화
lcd.print()나 lcd.write()로 문자열출력
lcd.setCursor(0,1); 으로 개행가능
lcd.clear()로 다 지우기

LED matrix
-상점 간판의 LED 디스플레이와 유사
-8x8 = 64개의 LED
-세로(Column) 0~7, 가로(Row) 0~7
-세로/가로번호로 LED on/off가능

블루투스
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2,3);으로 TX,RX핀 초기화 -> 0,1번핀은 작동안됨, 우노보드에서 이미 USB시리얼통신에 사용되기때문
BTSerial.begin(9600);으로 초기화
BTSerial.available()이나 read(), write()가능 / Serial과 유사
블루투스 기기이름 바꾸려면 시리얼모니터에 AT -> OK뜨면
AT+NAMExxxx : xxxx로 이름변경
AT+VERSION : 버전확인
AT+PINxxxx : 페어링 비밀번호 xxxx로
------------------------------------------------------------
Serial(UART)
Hardware Serial
-아두이노 시리얼 통신이 대표적임
2개의 통신 라인이 크로스 되어 연결됨 (RX, TX)
비동기식 : Clock 라인 없이 양측이 미리 합의된 클럭 사용
-> 두 장치의 클럭 간격을 미리 맞춰줘야함
클럭 동기화 문제
-> 두 장치가 사용하는 클럭 생성기(crystal)의 주파수가 틀린 경우
-> 문제 방지를 위해 start/stop 비트 추가
Baudrate(통신속도 BPS), Start/Stop bit, Parity bit, Data chunk 9600 8N1 -> 9600 bps, 8bit data, No parity, 1 stop bit

통신간 1:1연결만 지원함
start/stop 비트 때문에 오버헤드 발생
하드웨어 구성이 복잡해짐
Software Serial
하드웨어 UART포트가 부족할때 일반 디지털 핀을 이용해 가상의 시리얼 통신을 만드는 기능
-> 예를들어 블루투스 모듈과 같은 장치를 추가로 연결하려는데 시리얼 통신이 필요함
-> UNO보드는 UART가 1개뿐이기 때문에 SoftwareSerial 라이브러리가 디지털핀을 RX/TX처럼 소프트웨어ㄹ ㅗ동작
SoftwareSerial s(2,3); = 2번 핀 -> 수신(RX), 3번핀 -> 송신(TX)으로 가상의 시리얼포트 생성
CPU가 직접 타이밍을 계산하여 처리, 인터럽트를 사용하고 CPU 부하 증가됨

I2C는 대표적인 동기식 시리얼통신
클럭 핀과 데이터핀이 서로 연결됨 (SCL,SDA)
시리얼통신과는 다르게 1:N통신(Master-Slave 구조, 제한적 N:N)
연결이 간단하고 데이터1라인으로 양방향통신하므로 상대적으로 느림

여기서 Master는 아두이노, 다른기기가 Slave
Slave기기들은 고유 식별 ID(address)를 가짐
SCL(Serial Clock, 클럭 시그널), SDA (Serial Data, 데이터 전송)
-UNO 보드 계열 :A4(SDA), A5(SCL)
-Wire.h 라이브러리로 사용
I2C 통신구조
-메시지 기본구조 : 주소 프레임과 데이터 프레임 사용
-통신 시작 조건 : SCL(HIGH) -> SDA(HIGH to LOW)
-주소 프레임 : 통신 시작시 주소 프레임부터 전송, 수신할 slave 주소 표현, 1bit로 read/write, 마지막 1bit로 NACK/ACK표현
