본문 바로가기
공부기록

6월 22일 라즈베리파이 - 온습도, 초음파거리, PWM장치

by project100 2023. 6. 22.

온습도 센서(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('종료')