'''
# LED, 스위치, 릴레이 제어 프로그램
# > 빨간 LED를 켠 뒤 스위치 입력을 기다리다가 스위치가 눌리면 녹색 LED를 켜고 릴레이를 동작시킵니다.
# >> 그리고 2초 후 다시 스위치를 누르면 빨간 LED를 켠 뒤 3초 후 프로그램을 종료합니다.
#
# 제작 : eleparts / yeon
'''
import RPi.GPIO as GPIO
import time

# GPIO 설정
GPIO.setmode(GPIO.BCM)

# LED가 연결된 GPIO번호
LED_A = 20 # 초록색
LED_B = 21 # 빨간색

# 스위치가 연결된 GPIO번호
SW = 16

# 릴레이보드가 연결된 GPIO번호
RELAY = 18

# LED,릴레이가 연결돤 GPIO 출력 핀으로 설정
GPIO.setup(LED_A, GPIO.OUT)
GPIO.setup(LED_B, GPIO.OUT)
GPIO.setup(RELAY, GPIO.OUT)

# LED A, 릴레이 끄기, LED B 켜기, 
GPIO.output(LED_A , False)
GPIO.output(LED_B , True)
GPIO.output(RELAY , False)

# 스위치가 연결된  GPIO를 입력 핀으로 설정 / 풀다운(기본값 LOW로 설정)
GPIO.setup(SW, GPIO.IN, GPIO.PUD_DOWN)

# 스위치 읽기
read_PIN = GPIO.input(SW)

# SW핀이 눌리지 않은 상태인 경우 스위치가 눌러질때까지 대기하며 0.3초마다 SW정보 읽기
while not read_PIN:

  # 0.3초 대기
  time.sleep(0.3)

  # 스위치 읽기
  read_PIN = GPIO.input(SW)


# LED A, B 켜기
GPIO.output(LED_A , True)
GPIO.output(LED_B , False)
GPIO.output(RELAY , True)

# 2초 대기
time.sleep(2)  # 없으면 아래 스위치 읽기가 너무 빠르게 실행되어 오작동 발생


# 스위치 읽기
read_PIN = GPIO.input(SW)

# SW핀이 눌리지 않은 상태인 경우 스위치가 눌러질때까지 대기하며 0.3초마다 SW정보 읽기
while not read_PIN:

  # 0.3초 대기
  time.sleep(0.3)

  # 스위치 읽기
  read_PIN = GPIO.input(SW)

# LED 끄기
GPIO.output(LED_A , False)
GPIO.output(LED_B , True)
GPIO.output(RELAY , False)

# 3초 대기
time.sleep(3)

# GPIO 설정 초기화
GPIO.cleanup()
