스위치를 이용하여 LED의 밝기를 조절할 수 있는 스텐드를 만들어 본다.


<준비물>
- 브레드보드 : 1개
- LED 흰색 : 1개
- 220옴(빨빨갈) 저항 : 1개
- 스위치 : 1개
- 암/수 점퍼케이블 : 4개
- 수/수 점퍼케이블 : 1개


<회로도>



<코드>
from gpiozero import PWMLED,Button
from time import sleep

led_white = PWMLED(12)
swPin = Button(21)

swState = 0

newSw = 0
oldSw = 0

def swOn():
    global newSw
    global oldSw
    newSw = swPin.is_pressed
    
    if newSw != oldSw:
        oldSw = newSw
        if newSw == 1:
            return 1
        
    return 0

try:
    while True:
        if swOn() == 1:
            swState = swState + 1
            if swState >= 4:
                swState = 0
            sleep(0.2)
            
            print(swState)
            
            if swState == 0:
                led_white.value = 0
                print("duty:0")
            elif swState == 1:
                led_white.value = 0.3
                print("duty:30")
            elif swState == 2:
                led_white.value = 0.6
                print("duty:60")
            elif swState == 3:
                led_white.value = 1.0
                print("duty:100")
        
except KeyboardInterrupt:
    pass

led_white.value = 0


<코드설명>
이 코드는 PWM(Pulse Width Modulation)을 이용하여 LED의 밝기를 조절하고, 버튼을 눌러 밝기 단계를 변경하는 프로그램이다. 버튼을 한 번 누를 때마다 LED의 밝기가 0%, 30%, 60%, 100%로 순차적으로 변경된다.

1. 모듈 임포트
from gpiozero import PWMLED, Button
from time import sleep

gpiozero 라이브러리에서 PWMLED(LED 밝기 조절), Button(스위치 제어)을 불러온다.
time.sleep() 함수로 잠깐 대기할 수 있도록 time 모듈에서 sleep 함수를 불러온다.

2. 변수 초기화
led_white = PWMLED(12)
swPin = Button(21)

swState = 0
newSw = 0
oldSw = 0

12번 핀에 연결된 LED를 PWMLED로 선언하고, LED의 밝기를 조절할 수 있게 한다.
21번 핀에 연결된 스위치를 제어하기 위해 Button으로 선언한다.
swState는 버튼이 눌렸을 때 LED의 밝기 단계를 추적하는 변수이고, 0부터 3까지의 값을 가질 수 있다.
newSw와 oldSw는 스위치 상태 변화를 추적하기 위한 변수이고, 버튼이 눌릴 때만 이벤트를 감지하기 위함이다.

3. 스위치 상태를 확인하는 함수
def swOn():
    global newSw
    global oldSw
    newSw = swPin.is_pressed

    if newSw != oldSw:
        oldSw = newSw
        if newSw == 1:
            return 1

    return 0

이 함수는 버튼이 눌렸을 때만 1을 반환하고, 그렇지 않으면 0을 반환한다.
newSw는 현재 스위치 상태를 나타내며, oldSw는 이전 스위치 상태를 저장합니다.
두 상태가 다를 때(즉, 버튼이 눌리거나 떼어질 때) 상태를 업데이트하고, 스위치가 눌렸을 때(1일 때) 1을 반환한다. 그렇지 않으면 0을 반환하여 동작을 처리하지 않는다.

4. 메인 루프
try:
    while True:
        if swOn() == 1:
            swState = swState + 1
            if swState >= 4:
                swState = 0
            sleep(0.2)

swOn() 함수가 1을 반환할 때(즉, 버튼이 눌릴 때), swState 값을 1씩 증가시키고, swState가 4 이상이 되면 다시 0으로 돌아가게 한다.
sleep(0.2)는 버튼이 너무 빠르게 반복해서 눌리는 것을 방지하기 위해 디바운스 효과를 준다(즉, 짧은 시간 동안 버튼이 눌리는 것을 무시함).

5. LED 밝기 조절
if swState == 0:
    led_white.value = 0
elif swState == 1:
    led_white.value = 0.3
elif swState == 2:
    led_white.value = 0.6
elif swState == 3:
    led_white.value = 1.0

swState 값에 따라 LED의 밝기를 변경한다.
swState == 0: LED 밝기를 0%로 설정(꺼짐),
swState == 1: LED 밝기를 30%로 설정.
swState == 2: LED 밝기를 60%로 설정,
swState == 3: LED 밝기를 100%로 설정한다(최대 밝기).

6. 프로그램 종료 시
except KeyboardInterrupt:
    pass

led_white.value = 0

Ctrl + C로 프로그램을 종료할 때, 프로그램이 안전하게 종료되도록 처리한다.
프로그램 종료 시 LED의 밝기를 0%로 설정하여 LED를 끈다.


<요약>
이 프로그램은 버튼을 눌러 LED의 밝기를 4단계로 조절한다. 0%, 30%, 60%, 100%의 밝기로 변하며, 다시 0%로 돌아온다. 스위치를 누를 때만 상태가 변하며, LED는 해당 상태에 맞는 밝기를 유지한다.


<시연영상>

경찰차 지분위에 달린 경관등을 만든다. 스위치를 추가하여 스위치로 경광등을 켜고 끌 수 있게 동작 시킨다.


<준비물>
- 브레드보드 : 1개
- LED 파랑 : 1개
- LED 빨강 : 1개
- 220옴(빨빨갈) 저항 : 2개
- 스위치 : 1개
- 암/수 점퍼케이블 : 5개
- 수/수 점퍼케이블 : 1개


<회로도>



<코드>
from gpiozero import Button
from gpiozero import LED
from time import sleep

ledRed = LED(23)
ledBlue = LED(24)
swPin = Button(21)

swState = 0

try:
    while 1:
        swValue = swPin.is_pressed
        if swValue == True:
            if swState == 0:
                swState = 1
            else:
                swState = 0
            sleep(0.5)
            
        if swState == 1:
            ledRed.on()
            ledBlue.off()
            sleep(0.1)
            ledRed.off()
            ledBlue.on()
            sleep(0.1)
        else:
            ledRed.off()
            ledBlue.off()
    
except KeyboardInterrupt:
    pass

ledRed.off()
ledBlue.off()


<코드설명>
이 코드는 스위치(버튼)를 사용하여 LED 두 개(빨간색과 파란색)를 제어하는 프로그램이다. 스위치가 눌리면 두 개의 LED가 교대로 깜빡이고, 스위치가 눌리지 않으면 LED가 꺼진다. 아래는 코드에 대한 자세한 설명이다.

1. 모듈 임포트
from gpiozero import Button
from gpiozero import LED
from time import sleep

gpiozero 라이브러리에서 Button(스위치 핀 제어)과 LED(LED 제어)를 임포트한다.
time.sleep() 함수를 사용하여 특정 시간 동안 기다릴 수 있도록 time 모듈의 sleep 함수를 불러온다.

2. LED 및 버튼 핀 설정
ledRed = LED(23)
ledBlue = LED(24)
swPin = Button(21)

23번 핀에 빨간색 LED, 24번 핀에 파란색 LED, 21번 핀에 스위치(Button)를 설정한다.

3. 스위치 상태 변수 초기화
swState = 0

swState는 스위치 상태를 나타내는 변수이다. 처음에는 0으로 설정되어 LED가 꺼진 상태로 시작한다.

4. 메인 루프
try:
    while 1:
        swValue = swPin.is_pressed
        if swValue == True:
            if swState == 0:
                swState = 1
            else:
                swState = 0
            sleep(0.5)

이 부분에서는 무한 루프를 사용하여 계속해서 버튼 입력과 LED 상태를 제어한다.
swPin.is_pressed를 통해 버튼이 눌렸는지 확인하고, 눌렸다면 swState가 0일 때는 1로 바꾸고, 1일 때는 0으로 바꿔준다. 이 과정에서 버튼이 눌릴 때마다 상태가 토글된다.
sleep(0.5)는 버튼이 눌렸을 때 잠깐 기다리게 해서, 버튼이 너무 빨리 연속으로 눌리는 것을 방지합니다(디바운싱 효과).

5. LED 깜빡임 및 상태 제어
if swState == 1:
            ledRed.on()
            ledBlue.off()
            sleep(0.1)
            ledRed.off()
            ledBlue.on()
            sleep(0.1)
        else:
            ledRed.off()
            ledBlue.off()

swState가 1일 경우, 빨간색 LED를 켜고, 파란색 LED를 끈다. 그런 다음, 잠깐 대기(sleep(0.1)) 후에 빨간색 LED를 끄고 파란색 LED를 켜는 과정을 반복한다.
이로 인해 두 LED가 교대로 깜빡이는 효과를 준다.
swState가 0일 경우, 두 LED 모두 꺼집니다.

6. 종료 시 LED 끄기
except KeyboardInterrupt:
    pass

ledRed.off()
ledBlue.off()

KeyboardInterrupt 예외 처리는 Ctrl + C로 프로그램을 종료할 때 사용된다.
프로그램이 종료되기 전에 LED가 켜져 있을 수 있으므로, 두 LED 모두 꺼지게 처리한다.


<요약>
이 프로그램은 스위치를 눌렀을 때 두 개의 LED가 교대로 깜빡이는 동작을 수행하며, 스위치를 다시 누르면 LED가 꺼진다.


<시연영상>

LED를 이용하여 신호등을 만든다. 차량용 신호등과 보행자용 신호등을 만들고 서로 연동하여 동작시켜 본다.


<준비물>
- 브레드보드 : 1개
- LED 빨강 : 2개
- LED 노랑 : 1개
- LED 초록 : 2개
- 220옴(빨빨갈) 저항 : 5개
- 암/수 점퍼케이블 : 6개


<회로도>



<코드1>
from gpiozero import LED
from time import sleep

carLedRed = 2
carLedYellow = 3
carLedGreen = 4
humanLedRed = 20
humanLedGreen = 21

carLedRed = LED(2)
carLedYellow = LED(3)
carLedGreen = LED(4)
humanLedRed = LED(20)
humanLedGreen = LED(21)

try:
    while True:
        carLedRed.value = 0
        carLedYellow.value = 0
        carLedGreen.value = 1
        humanLedRed.value = 1
        humanLedGreen.value = 0
        sleep(3.0)
        carLedRed.value = 0
        carLedYellow.value = 1
        carLedGreen.value = 0
        humanLedRed.value = 1
        humanLedGreen.value = 0
        sleep(1.0)
        carLedRed.value = 1
        carLedYellow.value = 0
        carLedGreen.value = 0
        humanLedRed.value = 0
        humanLedGreen.value = 1
        sleep(3.0)
    
except KeyboardInterrupt:
    pass

carLedRed.value = 0
carLedYellow.value = 0
carLedGreen.value = 0
humanLedRed.value = 0
humanLedGreen.value = 0


<코드1 설명>
위 코드는 GPIO 핀을 사용하여 간단한 교통 신호등을 제어하는 파이썬 프로그램이다. 자동차와 사람의 신호등이 있으며, 자동차의 신호등(빨강, 노랑, 초록)과 사람의 신호등(빨강, 초록)이 서로 번갈아가며 켜지는 방식으로 작동한다.

1. 라이브러리 임포트
from gpiozero import LED
from time import sleep

gpiozero : 라즈베리파이의 GPIO 핀을 쉽게 제어할 수 있는 라이브러리이다. 여기서는 LED 클래스를 사용하여 LED를 제어한다.
time.sleep() : 프로그램 실행을 일시 중지시키는 함수로, 신호등 상태 변화 시간 간격을 제어하는 데 사용된다.

2. GPIO 핀 설정
carLedRed = 2
carLedYellow = 3
carLedGreen = 4
humanLedRed = 20
humanLedGreen = 21

자동차와 사람 신호등의 LED 핀 번호를 지정한다
carLedRed: 자동차의 빨간 신호등(GPIO 핀 2)
carLedYellow: 자동차의 노란 신호등(GPIO 핀 3)
carLedGreen: 자동차의 초록 신호등(GPIO 핀 4)
humanLedRed: 사람의 빨간 신호등(GPIO 핀 20)
humanLedGreen: 사람의 초록 신호등(GPIO 핀 21)

3. LED 객체 생성
carLedRed = LED(2)
carLedYellow = LED(3)
carLedGreen = LED(4)
humanLedRed = LED(20)
humanLedGreen = LED(21)

각 GPIO 핀에 연결된 LED를 LED 객체로 생성한다. 이후 LED 객체의 .on()과 .off() 메서드를 통해 LED를 켜고 끌 수 있다.

4. 메인 루프
try:
    while True:
        carLedRed.value = 0
        carLedYellow.value = 0
        carLedGreen.value = 1
        humanLedRed.value = 1
        humanLedGreen.value = 0
        sleep(3.0)

        carLedRed.value = 0
        carLedYellow.value = 1
        carLedGreen.value = 0
        humanLedRed.value = 1
        humanLedGreen.value = 0
        sleep(1.0)

        carLedRed.value = 1
        carLedYellow.value = 0
        carLedGreen.value = 0
        humanLedRed.value = 0
        humanLedGreen.value = 1
        sleep(3.0)

while True : 무한 루프를 사용하여 신호등 상태를 반복한다.

첫 번째 상태 (자동차 초록, 사람 빨강) :
carLedRed.value = 0 : 자동차 빨간 불 꺼짐
carLedYellow.value = 0 : 자동차 노란 불 꺼짐
carLedGreen.value = 1 : 자동차 초록 불 켜짐
humanLedRed.value = 1 : 사람 빨간 불 켜짐
humanLedGreen.value = 0 : 사람 초록 불 꺼짐

sleep(3.0) : 3초간 유지

두 번째 상태 (자동차 노랑, 사람 빨강) :
carLedRed.value = 0 : 자동차 빨간 불 꺼짐
carLedYellow.value = 1 : 자동차 노란 불 켜짐
carLedGreen.value = 0 : 자동차 초록 불 꺼짐
humanLedRed.value = 1 : 사람 빨간 불 켜짐
humanLedGreen.value = 0 : 사람 초록 불 꺼짐

sleep(1.0) : 1초간 유지

세 번째 상태 (자동차 빨강, 사람 초록) :
carLedRed.value = 1 : 자동차 빨간 불 켜짐
carLedYellow.value = 0 : 자동차 노란 불 꺼짐
carLedGreen.value = 0 : 자동차 초록 불 꺼짐
humanLedRed.value = 0 : 사람 빨간 불 꺼짐
humanLedGreen.value = 1 : 사람 초록 불 켜짐

sleep(3.0) : 3초간 유지.

5. 종료 시 LED 끄기
except KeyboardInterrupt:
    pass

carLedRed.value = 0
carLedYellow.value = 0
carLedGreen.value = 0
humanLedRed.value = 0
humanLedGreen.value = 0

KeyboardInterrupt : 사용자가 Ctrl+C로 프로그램을 종료할 때 발생하는 예외를 처리한다.
프로그램이 종료될 때 모든 LED를 꺼서 안전하게 정리한다.


<코드1 요약>
이 코드는 간단한 교통 신호등 시스템을 구현한다.
자동차와 사람의 신호등이 번갈아 가며 켜지고 꺼지며, 신호 변화 간의 대기 시간은 각각 3초 또는 1초이다.
Ctrl + C로 프로그램을 종료할 수 있으며, 종료 시 모든 LED는 꺼진다.


<코드2>
from gpiozero import LEDBoard
from time import sleep

leds = LEDBoard(2,3,4,20,21)

try:
    while True:
        leds.value = (0,0,1,1,0)
        sleep(3.0)
        leds.value = (0,1,0,1,0)
        sleep(1.0)
        leds.value = (1,0,0,0,1)
        sleep(3.0)
    
except KeyboardInterrupt:
    pass

leds.off()


<코드2 설명>
위 코드는 코드1과 같은 결과를 도출한다. LEDBoard 클래스를 이용하여 한 번에 여러 개의 LED를 다루고 있다.
이는 프로그램 간소화에 도움을 준다.

1. 라이브러리 임포트
from gpiozero import LEDBoard
from time import sleep

gpiozero 라이브러리에서 LEDBoard를 사용하여 여러 개의 LED를 제어한다.
time.sleep() 함수를 사용하여 신호 변경 간의 시간을 설정한다.

2. LED 초기화
leds = LEDBoard(2, 3, 4, 20, 21)

LEDBoard 클래스를 사용하여 5개의 GPIO 핀(2, 3, 4, 20, 21)에 연결된 LED를 그룹화한다.
GPIO 2, 3, 4는 자동차 신호등의 LED이고, GPIO 20, 21은 사람 신호등의 LED 이다.

3. 메인 루프
try:
    while True:
        leds.value = (0, 0, 1, 1, 0)
        sleep(3.0)
        leds.value = (0, 1, 0, 1, 0)
        sleep(1.0)
        leds.value = (1, 0, 0, 0, 1)
        sleep(3.0)

while True : 무한 루프를 사용하여 신호등이 계속 반복적으로 작동하게 한다.

첫 번째 상태
leds.value = (0, 0, 1, 1, 0) : 이 코드는 각각의 LED 상태를 나타내며, LEDBoard에 포함된 5개의 LED 중에서 다음과 같은 상태를 설정한다:
첫 번째와 두 번째 LED는 꺼짐 (0)
세 번째와 네 번째 LED는 켜짐 (1)
다섯 번째 LED는 꺼짐 (0)

sleep(3.0): 이 상태를 3초간 유지합니다.

두 번째 상태
leds.value = (0, 1, 0, 1, 0) : 두 번째 상태에서
첫 번째, 세 번째, 다섯 번째 LED는 꺼짐 (0)
두 번째와 네 번째 LED는 켜짐 (1)

sleep(1.0): 이 상태를 1초간 유지합니다.

세 번째 상태
leds.value = (1, 0, 0, 0, 1) : 세 번째 상태에서
첫 번째와 다섯 번째 LED는 켜짐 (1)
나머지 LED는 꺼짐 (0)

sleep(3.0): 이 상태를 3초간 유지합니다.

4. 종료 처리
except KeyboardInterrupt:
    pass

leds.off()

KeyboardInterrupt : 사용자가 Ctrl+C를 눌러 프로그램을 종료할 때 발생하는 예외를 처리한다.
leds.off() : 프로그램이 종료되면 모든 LED를 꺼서 안전하게 마무리한다.


<코드2 요약>
이 코드는 LEDBoard를 사용하여 5개의 LED를 제어하며, 각각의 상태가 설정된 시간 동안 유지된다.
세 가지 상태가 반복되며, 각 상태는 3초 또는 1초 동안 지속된다.
Ctrl+C로 프로그램을 종료할 수 있으며, 종료 시 모든 LED가 꺼진다.
LEDBoard를 사용함으로써 여러 LED를 더 효율적으로 제어할 수 있다.


<시연영상>

빨간색 LED가 깜빡여 위험을 알리는 경광등


<준비물>
- 브레드 보드 : 1개
- LED 빨강 : 3개
- 220옴(빨빨갈) 저항 : 3개
- 암/수 점퍼케이블 : 4개


<회로도>



<코드>
from gpiozero import LED
from time import sleep

led1 = LED(16)
led2 = LED(20)
led3 = LED(21)

try:
    while 1:
        led1.on()
        led2.on()
        led3.on()
        sleep(0.1)
        led1.off()
        led2.off()
        led3.off()
        sleep(0.1)
    
except KeyboardInterrupt:
    pass

led1.off()
led2.off()
led3.off()


<코드설명>
위 코드는 gpiozero 라이브러리를 사용하여 3개의 LED를 제어하는 파이썬 프로그램이다. 간단히 설명하면, 세 개의 LED를 빠르게 깜빡이도록 설정한 코드이다.

1. 라이브러리 임포트
from gpiozero import LED
from time import sleep

gpiozero : 라즈베리파이의 GPIO 핀을 쉽게 제어할 수 있는 라이브러리이다. 여기서는 LED 클래스를 이용하여 LED를 제어한다.
time.sleep() : 프로그램 실행을 일시 중지하기 위한 함수로, LED를 켜고 끄는 시간 간격을 조정하는 데 사용된다.

2. LED 핀 설정
led1 = LED(16)
led2 = LED(20)
led3 = LED(21)

각 LED를 라즈베리파이의 GPIO 핀에 연결하고, LED 객체로 설정한다.
led1 : GPIO 핀 16에 연결
led2 : GPIO 핀 20에 연결
led3 : GPIO 핀 21에 연결

3. 메인 루프
try:
    while True:
        led1.on()
        led2.on()
        led3.on()
        sleep(0.1)
        led1.off()
        led2.off()
        led3.off()
        sleep(0.1)
except KeyboardInterrupt:
    pass

while  True : 무한 루프를 사용하여 LED를 계속 깜빡이게 한다.
led1.on(), led2.on(), led3.on() : 각 LED를 켠다.
sleep(0.1) : 0.1초 동안 LED가 켜진 상태로 유지된다.
led1.off(), led2.off(), led3.off() : 각 LED를 끈다.
sleep(0.1) : 0.1초 동안 LED가 꺼진 상태로 유지된다.
try-except : 프로그램을 실행 중 Ctrl+C로 종료할 때 KeyboardInterrupt 예외를 처리하여 루프를 빠져나가도록 한다.

4. 프로그램 종료 시 LED 끄기
led1.off()
led2.off()
led3.off()

프로그램이 종료될 때 모든 LED를 꺼서 안전하게 정리한다.


<요약>
세 개의 LED를 GPIO 핀 16, 20, 21에 연결하여 0.1초 간격으로 켜고 끄는 동작을 반복한다.
사용자가 Ctrl + C를 누르면 프로그램이 종료되며, 종료 시 모든 LED는 꺼진다.


<시연영상>

+ Recent posts