print("This is the program for Car Reverse Sensor System")
print("PROJET IoT - ESILV A4 - LEROY MELAINE FABRE LEBOEUF")

import ssd1306 #oled library
import hcsr04 #ultrasonic library
from machine import Pin, I2C, PWM 
from time import sleep



#OLED SCREEN
oled_width = 128
oled_height = 64

i2c = I2C(0, scl=Pin(22), sda=Pin(21))
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)



#BUZZERS
trigg = Pin(19, Pin.IN)
echoo = Pin(18, Pin.OUT)
buzz_Pin_front = Pin(15, Pin.OUT)

trigg_rear = Pin(26, Pin.IN)
echoo_rear = Pin(27, Pin.OUT)
buzz_Pin_rear = Pin(5, Pin.OUT)



#ULTRASONIC SENSORS
ultrasonic_sensor_front=hcsr04.HCSR04(trigger_pin=trigg, echo_pin=echoo)
ultrasonic_sensor_rear=hcsr04.HCSR04(trigger_pin=trigg_rear, echo_pin=echoo_rear)



#LEDs
led3_avant=Pin(16, Pin.OUT)
led2_avant=Pin(0, Pin.OUT)
led1_avant=Pin(2, Pin.OUT)

led3_rear=Pin(14, Pin.OUT)
led2_rear=Pin(12, Pin.OUT)
led1_rear=Pin(13, Pin.OUT)



while True:
    distance_cm=ultrasonic_sensor_front.distance_cm()
    distance_cm_rear=ultrasonic_sensor_rear.distance_cm()

    print('\nCar ahead at :',distance_cm,' cm')
    print('Car behind at :',distance_cm_rear,' cm\n')

# FRONT SENSOR
    oled.fill(0)
    oled.text("The distance", 15 , 10)
    oled.text("with car ahead", 5 , 25)
    cm = ultrasonic_sensor_front.distance_cm()
    cm_string = str("{:.2f}".format(cm))
    oled.text (cm_string + "cm", 30 , 40)
    sleep (0.1)
    oled.show()
    sleep(0.5)

# REAR SENSOR
    oled.fill(0)
    oled.text("The distance", 15 , 10)
    oled.text("with car behind", 2 , 25)
    cm_rear = ultrasonic_sensor_rear.distance_cm()
    cm_string_rear = str("{:.2f}".format(cm_rear))
    oled.text (cm_string_rear + "cm", 30 , 40)
    sleep (0.1)
    oled.show()
    sleep(0.5)

# FRONT LEDs
    if cm >= 250:
        buzzer_front = PWM(buzz_Pin_front,freq = 532, duty = 20)
        sleep(0.1)
        buzzer_front = PWM(buzz_Pin_front,freq = 532, duty = 0)

        led1_avant.on()
        sleep(0.1)
        led1_avant.off()
        sleep(0.1)

    elif 50<cm<250:
        buzzer_front = PWM(buzz_Pin_front,freq = 532, duty = 20)
        sleep(0.01)
        buzzer_front = PWM(buzz_Pin_front,freq = 532, duty = 0)

        led2_avant.on()
        sleep(0.01)
        led2_avant.off()
        sleep(0.01)

    elif cm<50: 
        buzzer_front = PWM(buzz_Pin_front,freq = 532, duty = 20)
        sleep(0.1)
        buzzer_front = PWM(buzz_Pin_front,freq = 532, duty = 80)

        led3_avant.on()
        sleep(0.001)
        led3_avant.off()
        sleep(0.001)


# REAR LEDs
    if cm_rear >= 250:
        buzzer_rear = PWM(buzz_Pin_rear,freq = 532, duty = 20)
        sleep(0.1)
        buzzer_rear = PWM(buzz_Pin_rear,freq = 532, duty = 0)

        led1_rear.on()
        sleep(0.1)
        led1_rear.off()
        sleep(0.1)

    elif 50<cm_rear<250:
        buzzer_rear = PWM(buzz_Pin_rear,freq = 532, duty = 20)
        sleep(0.01)
        buzzer_rear = PWM(buzz_Pin_rear,freq = 532, duty = 0)

        led2_rear.on()
        sleep(0.01)
        led2_rear.off()
        sleep(0.01)

    elif cm_rear<50:
        buzzer_rear = PWM(buzz_Pin_rear,freq = 532, duty = 20)
        sleep(0.1)
        buzzer_rear = PWM(buzz_Pin_rear,freq = 532, duty = 80)

        led3_rear.on()
        sleep(0.001)
        led3_rear.off()
        sleep(0.001)