온습도 센서(DHT 11)
온도와 습도를 함께 측정할 수 있는 센서
필요 라이브러리(DHT)를 설치하여 사용
vs code 터미널에 작성하기
라이브러리 설치
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
디렉토리 바꾸기
cd Adafruit_Python_DHT
* cd : chagne directory : 작업 폴더를 변경하는 명령어
리눅스 업데이트
sudo apt-get update
sudo apt-get install build-essential python-dev
sudo python3 setup.py install
sudo pip3 install Adafruit_DHT
인터프리터 변경
F1 - python 입력 -> python 인터프리터 클릭 -> 3.9.2 32-bit 로 변경
온도와 습도를 확인할 수 있는 곳에 사용가능!
스마트 화분, 제습하는 곳 등
import time
import Adafruit_DHT as D
sensor = D.DHT11
pin = 17 # BCM 모드 시 핀 번호 사용 그림상으로 NAME
try:
while True:
h, t = D.read_retry(sensor, pin) # h 습도, t 온도
if h is not None and t is not None: # 값이 측정이 될 경우
print(f'온도 : {t:0.1f}도, 습도 : {h:0.1f}%')
else:
print('감지 오류')
time.sleep(5)
except KeyboardInterrupt: # ctrl + c 누르면 발생
print('감지 종료')
finally:
print('프로그램 종료')
초음파 거리 센서
트리거 신호(초음파)를 물체에 쏘고 그 반향(에코)이 오는 시간을 측정하여 거리를 구하는 센서
응용 후방 감지 센서
import RPi.GPIO as G
import time
trig = 14 # 트리거 핀 out
echo = 4 # 에코 핀 in
G.setmode(G.BCM)
G.setup(trig, G.OUT)
G.setup(echo, G.IN)
try:
while True:
G.output(trig, G.LOW)
time.sleep(0.00001) # 10 마이크로세컨드 10의 -5승
G.output(trig, G.HIGH)
# 시간측정
# 펄스 발생(초음파 전송이 끝나는 시간을 start로 저장)
while G.input(echo) == 0:
start = time.time()
# 펄스가 돌아옴
while G.input(echo) == 1:
stop = time.time()
# 펄스 왕복시간
rtTime = stop - start
# 거리 = 시간 * 속력
# 소리 속력 = 340m/s -> 34000cm/s
# 왕복 시간이기 때문에 나누기 2
d = rtTime * (34000/2)
print(f'거리 : {d:0.2f}cm')
time.sleep(1)
except KeyboardInterrupt:
G.cleanup()
finally:
print('프로그램 종료')
PWM(Pulse Width Modulation)
한 파형 주기 동안의 5V 신호 비율(Duty Cycle, 듀티비)을 이용하는 방식(On 신호가 지속되는 시간 비율)
팬의 속도, LED 발기 등을 제어하는데 활용
PWM 장치
피에조 부저, 서보 모터, LED 밝기 등
<LED 밝기 조절>
import RPi.GPIO as G
import time
G.setwarnings(False)
lp = 16
G.setmode(G.BCM)
G.setup(lp, G.OUT)
p = G.PWM(lp, 50) # 50Hz 주파수
p.start(0) # 파형출력시작, 듀티비 0
try:
while True:
# LED의 밝기를 점차적으로 밝게 증가 시킴
for dc in range(0, 101, 5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
# LED의 밝기를 점차적으로 감소 시킴
for dc in range(100, -1, -5):
p.ChangeDutyCycle(dc)
time.sleep(0.1)
except KeyboardInterrupt:
pass
finally:
p.stop()
G.cleanup()
print('프로그램 종료')
실행 시 아무것도 안 뜨고 작동을 안 할 때에는 LED 전구 교체하기!
피에조 부저
import RPi.GPIO as G
import time
bp = 21
G.setmode(G.BCM)
G.setup(bp, G.OUT)
G.setwarnings(False)
buzzer = G.PWM(bp, 1.0)
buzzer.start(50.0)
try:
for cnt in range(3):
buzzer.ChangeFrequency(262) # 도
time.sleep(1)
buzzer.ChangeFrequency(294) # 레
time.sleep(1)
buzzer.ChangeFrequency(330) # 미
time.sleep(1)
buzzer.ChangeDutyCycle(0)
except KeyboardInterrupt:
pass
finally:
buzzer.stop()
G.cleanup()
print('종료')
응용
피에조 부저와 초음파거리 센서
import RPi._GPIO as G
import time
tp = 14
ep = 4
bp = 21
G.setmode(G.BCM)
G.setup(tp, G.OUT)
G.setup(ep, G.IN)
G.setup(bp, G.OUT)
buzzer = G.PWM(bp, 440)
try:
while True:
# 구형파 발생
G.output(tp, G.LOW)
time.sleep(0.00001)
G.output(tp, G.HIGH)
# 시간측정
while G.input(ep) == 0:
start = time.time()
while G.input(ep) == 1:
stop = time.time()
rtTime = stop - start
d= rtTime * (34000 / 2)
print(f'거리 : {d:0.2f}cm')
time.sleep(0.2)
if d <= 40 and d > 25:
buzzer.start(50)
buzzer.ChangFrequency(523)
time.sleep(0.3)
buzzer.stop()
time.sleep(0.3)
elif d <= 25 and d > 10:
buzzer.start(50)
buzzer.ChangeFrequency(523)
time.sleep(0.15)
buzzer.stop()
time.sleep(0.1)
elif d <= 10:
buzzer.start(99)
buzzer.ChangeFrequency(523)
time.sleep(0.05)
buzzer.stop()
time.sleep(0.05)
else:
buzzer.stop()
time.sleep(0.5)
except KeyboardInterrupt:
pass
finally:
G.cleanup()
print('종료')
'공부기록' 카테고리의 다른 글
6월 27일 라즈베리파이 - 서보모터, 아날로그신호처리 (0) | 2023.06.27 |
---|---|
6월 26일 라즈베리파이 - 네트워크 (0) | 2023.06.26 |
6월 21일 라즈베리파이 - VS Code 연동, LED 2 (0) | 2023.06.21 |
6월 20일 (2) 라즈베이파이 - 이론, LED 연결 (0) | 2023.06.20 |
5월 25일 Spring - 게시글 수정 처리 (0) | 2023.05.25 |