import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False) 
GPIO.cleanup()
GPIO.setmode(GPIO.BCM)


TRIG = 16
ECHO = 24

GREEN = 4
YELLOW = 27
RED = 26

GPIO.setup(18, GPIO.OUT)
GPIO.setup(13, GPIO.IN, pull_up_down= GPIO.PUD_UP)

GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)

GPIO.setup(GREEN, GPIO.OUT)
GPIO.setup(YELLOW, GPIO.OUT)
GPIO.setup(RED, GPIO.OUT)

p = GPIO.PWM(18, 50)

def green_light():
    GPIO.output(GREEN, GPIO.HIGH)
    GPIO.output(YELLOW, GPIO.LOW)
    GPIO.output(RED, GPIO.LOW)

def yellow_light():
    GPIO.output(GREEN, GPIO.LOW)
    GPIO.output(YELLOW, GPIO.HIGH)
    GPIO.output(RED, GPIO.LOW)

def red_light():
    GPIO.output(GREEN, GPIO.LOW)
    GPIO.output(YELLOW, GPIO.LOW)
    GPIO.output(RED, GPIO.HIGH)



def get_distance():
    GPIO.output(TRIG, True)
    time.sleep(0.0001)
    GPIO.output(TRIG, False)

    while GPIO.input(ECHO) == False:
        start = time.time()


    while GPIO.input(ECHO) == True:
        end = time.time()

    sig_time = end-start

    distance = sig_time / 0.000058

    print('Distance: {} cm'.format(distance))
    return distance

t= 7.5
p.start(t)

while True:
    button_state = GPIO.input(13)
    if button_state == True:
        distance = get_distance()
        time.sleep(0.05)

        if distance >= 9:
            green_light()
        elif 9 > distance  and distance > 6:
            yellow_light()
        elif distance <= 6:
            red_light()
    else:
        print("Button is pressed")
        t =t+10
        p.ChangeDutyCycle(t)
        time.sleep(1)

    
