03. Python GPIO ์ ์ด
03. Python GPIO ์ ์ด¶
ํ์ต ๋ชฉํ¶
- RPi.GPIO ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ฒ ์ต๋
- gpiozero ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํ ๊ฐํธํ GPIO ์ ์ด
- LED ์ถ๋ ฅ ์ ์ด (๋์งํธ/PWM)
- ๋ฒํผ ์ ๋ ฅ ์ฒ๋ฆฌ (ํ์ /ํ๋ค์ด, ์ธํฐ๋ฝํธ)
- ์ผ์ ์ฐ๊ฒฐ ๋ฐ ๋ฐ์ดํฐ ์ฝ๊ธฐ (DHT11, PIR)
1. GPIO ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์¶
1.1 ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๊ต¶
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ํน์ง | ๋์ด๋ | ๊ถ์ฅ ์ฉ๋ |
|---|---|---|---|
| RPi.GPIO | ์ ์์ค, ์ธ๋ฐํ ์ ์ด | ์ค๊ธ | ์ ๋ฐ ์ ์ด, ํ์ด๋ฐ |
| gpiozero | ๊ณ ์์ค, ์ง๊ด์ API | ์ ๋ฌธ | ๊ต์ก, ๋น ๋ฅธ ํ๋กํ ํ์ดํ |
| pigpio | ์๊ฒฉ ์ ์ด, ์ ๋ฐ ํ์ด๋ฐ | ๊ณ ๊ธ | ์๋ณด, ์ ๋ฐ PWM |
| lgpio | ์ต์ , Pi 5 ์ง์ | ์ค๊ธ | Pi 5 ํ๋ก์ ํธ |
1.2 ์ค์น¶
# RPi.GPIO (๋ณดํต ๊ธฐ๋ณธ ์ค์น๋จ)
sudo apt install python3-rpi.gpio
# gpiozero (๊ถ์ฅ)
sudo apt install python3-gpiozero
# pigpio (์ ๋ฐ ํ์ด๋ฐ ํ์์)
sudo apt install pigpio python3-pigpio
sudo systemctl enable pigpiod
sudo systemctl start pigpiod
2. RPi.GPIO ๋ผ์ด๋ธ๋ฌ๋ฆฌ¶
2.1 ๊ธฐ๋ณธ ๊ตฌ์กฐ¶
#!/usr/bin/env python3
"""RPi.GPIO ๊ธฐ๋ณธ ๊ตฌ์กฐ"""
import RPi.GPIO as GPIO
import time
# 1. ํ ๋ฒํธ ์ฒด๊ณ ์ค์
GPIO.setmode(GPIO.BCM) # BCM ๋ฒํธ ์ฌ์ฉ (GPIO ๋ฒํธ)
# GPIO.setmode(GPIO.BOARD) # ๋ฌผ๋ฆฌ์ ํ ๋ฒํธ ์ฌ์ฉ
# 2. ๊ฒฝ๊ณ ๋ฉ์์ง ๋นํ์ฑํ (์ ํ)
GPIO.setwarnings(False)
# 3. ํ ์ค์
LED_PIN = 17
GPIO.setup(LED_PIN, GPIO.OUT) # ์ถ๋ ฅ ํ
BUTTON_PIN = 27
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # ์
๋ ฅ ํ (ํ์
)
try:
# 4. GPIO ์ฌ์ฉ
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(1)
GPIO.output(LED_PIN, GPIO.LOW)
finally:
# 5. ์ ๋ฆฌ (ํ์!)
GPIO.cleanup()
2.2 LED ์ ์ด (๋์งํธ ์ถ๋ ฅ)¶
#!/usr/bin/env python3
"""LED ๊น๋นก์ด๊ธฐ (RPi.GPIO)"""
import RPi.GPIO as GPIO
import time
LED_PIN = 17
def blink_led(times: int = 5, interval: float = 0.5):
"""LED๋ฅผ ์ง์ ํ์๋งํผ ๊น๋นก์"""
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
try:
for i in range(times):
print(f"Blink {i + 1}/{times}")
GPIO.output(LED_PIN, GPIO.HIGH)
time.sleep(interval)
GPIO.output(LED_PIN, GPIO.LOW)
time.sleep(interval)
finally:
GPIO.cleanup()
if __name__ == "__main__":
blink_led(10, 0.3)
2.3 PWM ์ถ๋ ฅ (๋ฐ๊ธฐ ์กฐ์ )¶
#!/usr/bin/env python3
"""LED ๋ฐ๊ธฐ ์กฐ์ - PWM (RPi.GPIO)"""
import RPi.GPIO as GPIO
import time
LED_PIN = 18 # ํ๋์จ์ด PWM ์ง์ ํ ๊ถ์ฅ
def fade_led():
"""LED ํ์ด๋ ์ธ/์์"""
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
# PWM ๊ฐ์ฒด ์์ฑ (ํ, ์ฃผํ์ Hz)
pwm = GPIO.PWM(LED_PIN, 1000) # 1kHz
pwm.start(0) # ๋ํฐ ์ฌ์ดํด 0%๋ก ์์
try:
while True:
# ํ์ด๋ ์ธ (0% -> 100%)
for duty in range(0, 101, 5):
pwm.ChangeDutyCycle(duty)
time.sleep(0.05)
# ํ์ด๋ ์์ (100% -> 0%)
for duty in range(100, -1, -5):
pwm.ChangeDutyCycle(duty)
time.sleep(0.05)
except KeyboardInterrupt:
pass
finally:
pwm.stop()
GPIO.cleanup()
if __name__ == "__main__":
fade_led()
2.4 ๋ฒํผ ์ ๋ ฅ (ํด๋ง ๋ฐฉ์)¶
#!/usr/bin/env python3
"""๋ฒํผ ์
๋ ฅ - ํด๋ง ๋ฐฉ์ (RPi.GPIO)"""
import RPi.GPIO as GPIO
import time
BUTTON_PIN = 27
LED_PIN = 17
def polling_button():
"""ํด๋ง์ผ๋ก ๋ฒํผ ์ํ ํ์ธ"""
GPIO.setmode(GPIO.BCM)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(LED_PIN, GPIO.OUT)
print("๋ฒํผ์ ๋๋ฅด๋ฉด LED๊ฐ ์ผ์ง๋๋ค. Ctrl+C๋ก ์ข
๋ฃ.")
try:
while True:
# ํ์
์ด๋ฏ๋ก ๋ฒํผ ๋๋ฅด๋ฉด LOW
if GPIO.input(BUTTON_PIN) == GPIO.LOW:
GPIO.output(LED_PIN, GPIO.HIGH)
print("๋ฒํผ ๋๋ฆผ!")
else:
GPIO.output(LED_PIN, GPIO.LOW)
time.sleep(0.1) # ๋๋ฐ์ด์ฑ
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
if __name__ == "__main__":
polling_button()
2.5 ๋ฒํผ ์ ๋ ฅ (์ธํฐ๋ฝํธ ๋ฐฉ์)¶
#!/usr/bin/env python3
"""๋ฒํผ ์
๋ ฅ - ์ธํฐ๋ฝํธ ๋ฐฉ์ (RPi.GPIO)"""
import RPi.GPIO as GPIO
import time
BUTTON_PIN = 27
LED_PIN = 17
led_state = False
def button_callback(channel):
"""๋ฒํผ ๋๋ฆผ ์ฝ๋ฐฑ ํจ์"""
global led_state
led_state = not led_state
GPIO.output(LED_PIN, led_state)
print(f"LED {'ON' if led_state else 'OFF'}")
def interrupt_button():
"""์ธํฐ๋ฝํธ๋ก ๋ฒํผ ๊ฐ์ง"""
GPIO.setmode(GPIO.BCM)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(LED_PIN, GPIO.OUT)
# ์ธํฐ๋ฝํธ ๋ฑ๋ก (ํ๊ฐ ์์ง, ๋๋ฐ์ด์ฑ 200ms)
GPIO.add_event_detect(
BUTTON_PIN,
GPIO.FALLING,
callback=button_callback,
bouncetime=200
)
print("๋ฒํผ์ ๋๋ฅด๋ฉด LED๊ฐ ํ ๊ธ๋ฉ๋๋ค. Ctrl+C๋ก ์ข
๋ฃ.")
try:
while True:
time.sleep(1) # ๋ฉ์ธ ๋ฃจํ๋ ๋ค๋ฅธ ์์
๊ฐ๋ฅ
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
if __name__ == "__main__":
interrupt_button()
3. gpiozero ๋ผ์ด๋ธ๋ฌ๋ฆฌ¶
3.1 gpiozero ์ฅ์ ¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ gpiozero ํน์ง โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โ ๊ฐ์ฒด ์งํฅ์ API โ
โ โ ์๋ cleanup (with ๋ฌธ ๋๋ ์ข
๋ฃ์) โ
โ โ ๋ค์ํ ์ฅ์น ์ถ์ํ (LED, Button, Sensor ๋ฑ) โ
โ โ ๊ฐ๋
์ฑ ๋์ ์ฝ๋ โ
โ โ ์๊ฒฉ GPIO ์ง์ (๋ค๋ฅธ Pi ์ ์ด) โ
โ โ Mock ํ ์ง์ (ํ
์คํธ์ฉ) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
3.2 LED ์ ์ด¶
#!/usr/bin/env python3
"""LED ์ ์ด (gpiozero)"""
from gpiozero import LED
from time import sleep
# LED ๊ฐ์ฒด ์์ฑ (GPIO 17)
led = LED(17)
# ๊ธฐ๋ณธ ์ ์ด
led.on() # ์ผ๊ธฐ
sleep(1)
led.off() # ๋๊ธฐ
sleep(1)
# ํ ๊ธ
led.toggle() # ์ํ ๋ฐ์
sleep(1)
led.toggle()
# ๊น๋นก์ด๊ธฐ (๋น๋๊ธฐ)
led.blink(on_time=0.5, off_time=0.5, n=5, background=True)
sleep(6)
# ์คํฌ๋ฆฝํธ ์ข
๋ฃ ์ ์๋ cleanup
3.3 PWM LED¶
#!/usr/bin/env python3
"""PWM LED ์ ์ด (gpiozero)"""
from gpiozero import PWMLED
from time import sleep
led = PWMLED(18)
# ๋ฐ๊ธฐ ์ง์ ์ค์ (0.0 ~ 1.0)
led.value = 0.5 # 50% ๋ฐ๊ธฐ
sleep(1)
led.value = 1.0 # 100% ๋ฐ๊ธฐ
sleep(1)
# ํ์ด๋ ํจ๊ณผ (pulse)
# ๊ธฐ๋ณธ๊ฐ: fade_in_time=1, fade_out_time=1
led.pulse(fade_in_time=2, fade_out_time=2)
sleep(10)
# ์๋ ํ์ด๋
for brightness in range(0, 101, 10):
led.value = brightness / 100
sleep(0.1)
3.4 ๋ฒํผ ์ฒ๋ฆฌ¶
#!/usr/bin/env python3
"""๋ฒํผ ์ ์ด (gpiozero)"""
from gpiozero import Button, LED
from signal import pause
led = LED(17)
button = Button(27, pull_up=True, bounce_time=0.2)
# ๋ฐฉ๋ฒ 1: ์ฝ๋ฐฑ ํจ์
def on_pressed():
print("๋ฒํผ ๋๋ฆผ!")
led.on()
def on_released():
print("๋ฒํผ ๋ผ์ง!")
led.off()
button.when_pressed = on_pressed
button.when_released = on_released
# ๋ฐฉ๋ฒ 2: LED์ ์ง์ ์ฐ๊ฒฐ
# led.source = button # ๋ฒํผ ๋๋ฅด๋ฉด LED ์ผ์ง
print("๋ฒํผ์ ๋๋ฅด์ธ์. Ctrl+C๋ก ์ข
๋ฃ.")
pause() # ํ๋ก๊ทธ๋จ ์ ์ง
3.5 ๋ฒํผ์ผ๋ก LED ํ ๊ธ¶
#!/usr/bin/env python3
"""๋ฒํผ์ผ๋ก LED ํ ๊ธ (gpiozero)"""
from gpiozero import Button, LED
from signal import pause
led = LED(17)
button = Button(27, bounce_time=0.2)
# ๋ฒํผ ๋๋ฅผ ๋๋ง๋ค LED ํ ๊ธ
button.when_pressed = led.toggle
print("๋ฒํผ์ ๋๋ฅด๋ฉด LED๊ฐ ํ ๊ธ๋ฉ๋๋ค.")
pause()
3.6 ๋ค์ค LED ์ ์ด¶
#!/usr/bin/env python3
"""๋ค์ค LED ์ ์ด (gpiozero)"""
from gpiozero import LEDBoard, LED
from time import sleep
from signal import pause
# ๊ฐ๋ณ LED
leds = [LED(pin) for pin in [17, 27, 22]]
# ์์ฐจ ์ ๋ฑ
for i, led in enumerate(leds):
led.on()
sleep(0.5)
led.off()
# LEDBoard ์ฌ์ฉ
led_board = LEDBoard(17, 27, 22)
led_board.on() # ๋ชจ๋ ์ผ๊ธฐ
sleep(1)
led_board.off() # ๋ชจ๋ ๋๊ธฐ
sleep(1)
# ๊น๋นก์ด๊ธฐ
led_board.blink(on_time=0.2, off_time=0.2, n=5)
sleep(3)
# ๊ฐ ์ค์ (๊ฐ๋ณ ์ ์ด)
led_board.value = (1, 0, 1) # ์ฒซ์งธ, ์
์งธ๋ง ์ผ๊ธฐ
sleep(1)
4. ์ผ์ ์ฐ๊ฒฐ¶
4.1 DHT11 ์จ์ต๋ ์ผ์¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ DHT11 ์ฐ๊ฒฐ๋ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ DHT11 ํ Raspberry Pi โ
โ โโโโโโโโโโโ โ
โ โ VCC (+) โ โโโโโโโโโ 3.3V (ํ 1) โ
โ โ DATA โ โโโโโโโโโ GPIO4 (ํ 7) + 10kฮฉ ํ์
โ
โ โ NC โ โโโโโโโโโ ์ฐ๊ฒฐ ์ํจ โ
โ โ GND (-) โ โโโโโโโโโ GND (ํ 6) โ
โ โโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#!/usr/bin/env python3
"""DHT11 ์จ์ต๋ ์ผ์ ์ฝ๊ธฐ"""
import time
# adafruit-circuitpython-dht ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
# pip install adafruit-circuitpython-dht
# sudo apt install libgpiod2
import adafruit_dht
import board
# DHT11 ์ผ์ ์ด๊ธฐํ (GPIO4)
dht = adafruit_dht.DHT11(board.D4)
def read_dht11():
"""DHT11 ์ผ์ ๋ฐ์ดํฐ ์ฝ๊ธฐ"""
try:
temperature = dht.temperature
humidity = dht.humidity
if humidity is not None and temperature is not None:
return {
"temperature": temperature,
"humidity": humidity,
"status": "ok"
}
else:
return {"status": "error", "message": "Failed to read"}
except RuntimeError as e:
# DHT ์ผ์๋ ๊ฐ๋ ์ฝ๊ธฐ ์คํจํจ (์ ์)
return {"status": "error", "message": str(e)}
def monitor_environment(interval: int = 5):
"""ํ๊ฒฝ ๋ชจ๋ํฐ๋ง"""
print("์จ์ต๋ ๋ชจ๋ํฐ๋ง ์์ (Ctrl+C๋ก ์ข
๋ฃ)")
while True:
data = read_dht11()
if data["status"] == "ok":
print(f"์จ๋: {data['temperature']:.1f}ยฐC, "
f"์ต๋: {data['humidity']:.1f}%")
else:
print(f"์ฝ๊ธฐ ์คํจ: {data.get('message', 'Unknown error')}")
time.sleep(interval)
if __name__ == "__main__":
try:
monitor_environment(3)
except KeyboardInterrupt:
print("\n๋ชจ๋ํฐ๋ง ์ข
๋ฃ")
finally:
dht.exit()
4.2 PIR ๋ชจ์ ์ผ์¶
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PIR ์ผ์ ์ฐ๊ฒฐ๋ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ PIR ํ Raspberry Pi โ
โ โโโโโโโโโโโ โ
โ โ VCC โ โโโโโโโโโ 5V (ํ 2) โ
โ โ OUT โ โโโโโโโโโ GPIO17 (ํ 11) โ
โ โ GND โ โโโโโโโโโ GND (ํ 6) โ
โ โโโโโโโโโโโ โ
โ โ
โ * ๊ฐ๋/์ง์ฐ ์กฐ์ : ์ผ์ ๋ท๋ฉด ๊ฐ๋ณ์ ํญ ์กฐ์ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
#!/usr/bin/env python3
"""PIR ๋ชจ์
์ผ์ (gpiozero)"""
from gpiozero import MotionSensor, LED
from datetime import datetime
from signal import pause
pir = MotionSensor(17)
led = LED(27)
def motion_detected():
"""๋ชจ์
๊ฐ์ง ์ ํธ์ถ"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] ๋ชจ์
๊ฐ์ง!")
led.on()
def motion_ended():
"""๋ชจ์
์ข
๋ฃ ์ ํธ์ถ"""
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] ๋ชจ์
์ข
๋ฃ")
led.off()
pir.when_motion = motion_detected
pir.when_no_motion = motion_ended
print("PIR ๋ชจ์
๊ฐ์ง ์์...")
print("์ผ์ ์์ ํ ๋๊ธฐ ์ค (์ฝ 10์ด)...")
pir.wait_for_no_motion()
print("์ค๋น ์๋ฃ! ๋ชจ์
์ ๊ฐ์งํฉ๋๋ค.")
pause()
4.3 ์ด์ํ ๊ฑฐ๋ฆฌ ์ผ์ (HC-SR04)¶
#!/usr/bin/env python3
"""HC-SR04 ์ด์ํ ๊ฑฐ๋ฆฌ ์ผ์ (gpiozero)"""
from gpiozero import DistanceSensor
from time import sleep
# TRIGGER: GPIO23, ECHO: GPIO24
# ์ฃผ์: ECHO ํ์ 5V ์ถ๋ ฅ์ด๋ฏ๋ก ๋ถ์ ํ๋ก ํ์!
sensor = DistanceSensor(echo=24, trigger=23, max_distance=4)
def measure_distance():
"""๊ฑฐ๋ฆฌ ์ธก์ """
distance_m = sensor.distance
distance_cm = distance_m * 100
return distance_cm
def proximity_monitor(threshold_cm: float = 30):
"""๊ทผ์ ๊ฐ์ง ๋ชจ๋ํฐ๋ง"""
print(f"๊ฑฐ๋ฆฌ ์๊ณ๊ฐ: {threshold_cm}cm")
while True:
distance = measure_distance()
if distance < threshold_cm:
print(f"๊ทผ์ ๊ฐ์ง! ๊ฑฐ๋ฆฌ: {distance:.1f}cm")
else:
print(f"๊ฑฐ๋ฆฌ: {distance:.1f}cm")
sleep(0.5)
if __name__ == "__main__":
try:
proximity_monitor()
except KeyboardInterrupt:
print("\n์ข
๋ฃ")
5. ์ข ํฉ ์์ : ์ผ์ ๋ชจ๋ํฐ๋ง ์์คํ ¶
#!/usr/bin/env python3
"""์ข
ํฉ ์ผ์ ๋ชจ๋ํฐ๋ง ์์คํ
"""
from gpiozero import Button, LED, MotionSensor
from datetime import datetime
import time
import json
class IoTSensorSystem:
"""IoT ์ผ์ ๋ชจ๋ํฐ๋ง ์์คํ
"""
def __init__(self):
# GPIO ์ค์
self.led_status = LED(17)
self.led_alarm = LED(27)
self.button = Button(22, bounce_time=0.2)
self.pir = MotionSensor(23)
# ์ํ
self.is_armed = False
self.motion_count = 0
self.last_motion = None
# ์ฝ๋ฐฑ ์ค์
self.button.when_pressed = self.toggle_arm
self.pir.when_motion = self.on_motion
def toggle_arm(self):
"""์์คํ
ํ์ฑํ/๋นํ์ฑํ ํ ๊ธ"""
self.is_armed = not self.is_armed
self.led_status.value = self.is_armed
status = "ํ์ฑํ" if self.is_armed else "๋นํ์ฑํ"
print(f"[์์คํ
] {status}")
def on_motion(self):
"""๋ชจ์
๊ฐ์ง ํธ๋ค๋ฌ"""
self.last_motion = datetime.now()
self.motion_count += 1
if self.is_armed:
print(f"[๊ฒฝ๊ณ ] ๋ชจ์
๊ฐ์ง! (์ด {self.motion_count}ํ)")
self.trigger_alarm()
else:
print(f"[์ ๋ณด] ๋ชจ์
๊ฐ์ง (์์คํ
๋นํ์ฑ)")
def trigger_alarm(self):
"""์๋ ํธ๋ฆฌ๊ฑฐ"""
# LED ๊น๋นก์
self.led_alarm.blink(on_time=0.1, off_time=0.1, n=10)
def get_status(self) -> dict:
"""ํ์ฌ ์ํ ๋ฐํ"""
return {
"is_armed": self.is_armed,
"motion_count": self.motion_count,
"last_motion": self.last_motion.isoformat() if self.last_motion else None,
"timestamp": datetime.now().isoformat()
}
def run(self):
"""๋ฉ์ธ ๋ฃจํ"""
print("=== IoT ์ผ์ ์์คํ
์์ ===")
print("๋ฒํผ์ ๋๋ฌ ์์คํ
์ ํ์ฑํ/๋นํ์ฑํํฉ๋๋ค.")
try:
while True:
# ์ฃผ๊ธฐ์ ์ผ๋ก ์ํ ์ถ๋ ฅ
status = self.get_status()
print(f"\r์ํ: {json.dumps(status, ensure_ascii=False)}", end="")
time.sleep(5)
except KeyboardInterrupt:
print("\n\n์์คํ
์ข
๋ฃ")
self.cleanup()
def cleanup(self):
"""์ ๋ฆฌ"""
self.led_status.off()
self.led_alarm.off()
if __name__ == "__main__":
system = IoTSensorSystem()
system.run()
6. ์๋ฎฌ๋ ์ด์ (ํ๋์จ์ด ์์ด)¶
6.1 Mock ํ ํฉํ ๋ฆฌ¶
#!/usr/bin/env python3
"""ํ๋์จ์ด ์์ด GPIO ์๋ฎฌ๋ ์ด์
"""
from gpiozero import Device, LED, Button
from gpiozero.pins.mock import MockFactory
# Mock ํ ํฉํ ๋ฆฌ ์ค์
Device.pin_factory = MockFactory()
led = LED(17)
button = Button(27)
# LED ์ ์ด
print(f"LED ์ด๊ธฐ ์ํ: {led.is_lit}")
led.on()
print(f"LED on ํ: {led.is_lit}")
led.off()
print(f"LED off ํ: {led.is_lit}")
# ๋ฒํผ ์๋ฎฌ๋ ์ด์
print(f"\n๋ฒํผ ์ด๊ธฐ ์ํ: {button.is_pressed}")
# ๋ฒํผ ํ์ ์ง์ ์กฐ์ํ์ฌ ๋๋ฆ ์๋ฎฌ๋ ์ด์
button.pin.drive_low()
print(f"๋ฒํผ ๋๋ฆ: {button.is_pressed}")
button.pin.drive_high()
print(f"๋ฒํผ ๋ผ๊ธฐ: {button.is_pressed}")
์ฐ์ต ๋ฌธ์ ¶
๋ฌธ์ 1: ํธ๋ํฝ ๋ผ์ดํธ¶
๋นจ๊ฐ-๋ ธ๋-์ด๋ก LED 3๊ฐ๋ก ์ ํธ๋ฑ์ ๊ตฌํํ์ธ์: - ๋นจ๊ฐ 3์ด โ ๋ ธ๋ 1์ด โ ์ด๋ก 3์ด โ ๋ ธ๋ 1์ด ๋ฐ๋ณต
๋ฌธ์ 2: ๋ฒํผ ์นด์ดํฐ¶
๋ฒํผ์ ๋๋ฅธ ํ์๋ฅผ ์ธ๊ณ , 5ํ๋ง๋ค LED๋ฅผ ๊น๋นก์ด์ธ์.
๋ฌธ์ 3: ํ๊ฒฝ ์๋¶
DHT11 ์ผ์๋ก ์จ๋๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ , 30๋ ์ด์์ด๋ฉด ์๋ LED๋ฅผ ์ผ์ธ์.
๋ค์ ๋จ๊ณ¶
- 04_WiFi_Networking.md: ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๋คํธ์ํฌ๋ก ์ ์ก
- 06_MQTT_Protocol.md: MQTT๋ก ์ค์๊ฐ ์ผ์ ๋ฐ์ดํฐ ๋ฐํ
์ต์ข ์ ๋ฐ์ดํธ: 2026-02-01