본문 바로가기

라즈베리파이 5

라즈베리파이 Python 4 - Delay 없는 LED Blink

반응형

 

라즈베리 파이 – 지연 Delay 업이 LED 깜박임

 

두 가지 작업, 즉 LED를 깜박이고 언제든지 누를 수 있는 버튼의 상태를 모니터링하는 데 Raspberry Pi가 필요하다고 가정해 보겠습니다. time.sleep() 함수(이전 튜토리얼에서 설명한 대로)를 활용하면 Raspberry Pi는 Delay 함수를 실행하는 동안에 버튼 누름을 감지하지 못할 수 있습니다. 즉, 라즈베리파이는 두 번째 작업을 완벽하게 수행할 수 없습니다.

 

 

강의 순서

 

라즈베리파이 Python 9 - 버튼 채터링 방지

라즈베리파이 Python 8 - 버튼

라즈베리파이 python 7 - 교통 신호등

라즈베리파이 python 6 - RGB LED

라즈베리파이 Python 5 - LED Fade 구현

라즈베리파이 Python 4 - Delay 없는 LED Blink

라즈베리파이 Python 3 - LED Blink

라즈베리파이 Python 2 - 파이선 코드 템플릿

라즈베리파이 Python 1 - python 실행

 

 

이 튜토리얼에서는 Raspberry Pi가 LED를 깜박이고 누르는 이벤트를 놓치지 않고 버튼 상태를 모니터링하는 방법을 설명합니다.

 

세 가지 예를 살펴보고 이들 간의 차이점을 비교해 보겠습니다.

  • time.sleep() 함수에 따라 LED가 깜박이는 라즈베리 파이
  • millis() 함수를 사용하여 LED를 깜박이는 Raspberry Pi

이 방법은 LED 깜박임과 버튼 상태 확인에만 해당하지 않습니다. 이를 통해 Raspberry Pi는 서로 간섭하지 않고 여러 작업을 동시에 수행할 수 있습니다. 꼭 기억하세요. 반드시 필요한 테크닉입니다.

 

LED 및 버튼 개요

 

LED 및 버튼(핀아웃, 기능 및 프로그래밍 포함)에 익숙하지 않은 경우 다음 튜토리얼을 통해 도움을 받을 수 있습니다.

- 라즈베리 파이 - LED 튜토리얼

- 라즈베리 파이 버튼 튜토리얼 

 

연결도는 아래 그림과 같습니다. 간답하죠?

 

https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-blink-without-delay

 

 

일단 Delay 함수를 사용하는 라즈베리파이 코드를 살펴보죠.

 

확인할 사항

  • Pi에 Raspbian 또는 기타 Raspberry Pi 호환 운영 체제가 설치되어 있는지 확인하십시오.
  • Raspberry Pi가 PC와 동일한 로컬 네트워크에 연결되어 있는지 확인하세요.
  • 일부 라이브러리를 설치해야 하는 경우 Raspberry Pi가 인터넷에 연결되어 있는지 확인하세요.
  • 라즈베리파이를 처음 사용하는 경우, 라즈베리파이 설정 방법을 확인하세요.
  • Linux 및 macOS의 내장 SSH 클라이언트 또는 Windows의 PuTTY를 사용하여 SSH를 통해 PC를 Raspberry Pi에 연결하세요. SSH를 통해 PC를 Raspberry Pi에 연결하는 방법을 알아보세요.
  • RP1.GPIO 라이브러리가 설치되어 있는지 확인하십시오. 그렇지 않은 경우 다음 명령을 사용하여 설치하십시오.

 

이전 설치된 라이브러리를 제거하고 새로운 라이브러리를 설치합니다.

 

설치 제거 
sudo apt remove python3-rpi.gpio

새로운 라이브러리를 설치합니다.

sudo apt-get update
sudo apt install python3-rpi-lgpio

 

아래 코드는 delay를 사용하는 Blink 코드입니다. ledblink_withdelay.py

 

"""
This Raspberry Pi code was developed by newbiely.com
This Raspberry Pi code is made available for public use without any restriction
For comprehensive instructions and wiring diagrams, please visit:
https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-blink-without-delay
"""


import RPi.GPIO as GPIO
import time

# Constants won't change:
LED_PIN = 18     # the number of the LED pin
BUTTON_PIN = 16  # the number of the button pin

BLINK_INTERVAL = 1  # interval at which to blink LED (seconds)

# Variables will change:
led_state = False   # led_state used to set the LED

prev_button_state = False # will store last time button was updated

GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

try:
    while True:
        # if the LED is off turn it on and vice-versa:
        led_state = not led_state

        # set the LED with the led_state of the variable:
        GPIO.output(LED_PIN, led_state)

        time.sleep(BLINK_INTERVAL)  # If button is pressed during this time, Raspberry Pi CANNOT detect

        button_state = GPIO.input(BUTTON_PIN)

        if button_state != prev_button_state:
            # print out the state of the button:
            print(button_state)

            # save the last state of the button
            prev_button_state = button_state

        # DO OTHER WORKS HERE

except KeyboardInterrupt:
    GPIO.cleanup()

 

실행 명령은 

 

$python3 ledblink_withdelay.py 

 

버튼을 눌러봅니다. 터미널에서는 일부 누르는 시간이 기록되지 않았습니다. 이는 Raspberry Pi가 지연 시간 동안 아무 것도 할 수 없기 때문에 발생하는 이벤트를 감지할 수 없기 때문입니다. 스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 루프로 계속 실행됩니다. 

 

LED가 깜박거리는 것을 확인하고 종료하려면 ctrl-c를 누르세요.

 

아래 코드는 delay 함수를 제거한 Blink 코드입니다.

- 버튼을 4번 누르세요. 1초마다 ON과 OFF가 번갈아 나타나는 LED를 확인하세요.

- 터미널에서 출력을 확인합니다.

 

LED가 깜박이는 동안 눌러진 모든 이벤트가 식별되었습니다. 스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 루프로 계속 실행됩니다. 

 

 

"""
This Raspberry Pi code was developed by newbiely.com
This Raspberry Pi code is made available for public use without any restriction
For comprehensive instructions and wiring diagrams, please visit:
https://newbiely.com/tutorials/raspberry-pi/raspberry-pi-led-blink-without-delay
"""


import RPi.GPIO as GPIO
import time

# Constants won't change
LED_PIN = 18     # The GPIO number of the LED pin
BUTTON_PIN = 16  # The GPIO number of the button pin

BLINK_INTERVAL_MS = 500  # Interval at which to blink LED (milliseconds) - 500 milliseconds

# Variables will change
led_state = GPIO.LOW  # led_state used to set the LED
prev_button_state = GPIO.LOW  # Will store the last time button was updated

# Function to get the current time in milliseconds
def millis():
    return time.perf_counter_ns() // 1000000

# Get the initial time in milliseconds
previousTime = millis()

# Setup GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

try:
    while True:
        # Check if it's time to blink the LED
        currentTime = millis()

        if currentTime - previousTime >= BLINK_INTERVAL_MS:
            # If the LED is off, turn it on, and vice-versa
            led_state = not led_state

            # Set the LED with the led_state variable
            GPIO.output(LED_PIN, led_state)

            # Save the last time you blinked the LED
            previousTime = currentTime

        # Check button state's change
        button_state = GPIO.input(BUTTON_PIN)

        if button_state != prev_button_state:
            # Print out the state of the button
            print(button_state)

            # Save the last state of the button
            prev_button_state = button_state

        # DO OTHER WORKS HERE (IF NEEDED)

except KeyboardInterrupt:
    # Clean up GPIO on keyboard interrupt
    GPIO.cleanup()

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^