import machine
import time

from machine import Pin, I2C, PWM, ADC
from time import sleep
import ssd1306

"OLED"
#datos del display
i2c=I2C(0, scl=Pin(15), sda=Pin(2))
#tamaño que tiene la pantalla OLED
ancho=128
alto=64
display=ssd1306.SSD1306_I2C(ancho, alto, i2c)

# estado predefinido de la alarma en la pantalla OLED
display.text('Alarma: OFF', 0,0)
display.show()

"PIR"
#recibir datos del sensor de movimiento 
PIR = Pin(12, Pin.IN, Pin.PULL_UP)

"BUZZER"
#datos del buzzer
buzzer = PWM(Pin(13,Pin.OUT))
#buzzer apagado
buzzer.init(freq=1047, duty=0)

"SERVOMOTOR"
# Crear un objeto GPIO p5 regular
p5 = machine.Pin(5, machine.Pin.OUT)
# Crear otro objeto llamado pwm por
# conectar el controlador pwm al pin
pwm = machine.PWM(p5)
# Establecer el pulso cada 20ms
pwm.freq(50)
# Establecer el servicio inicial en 0
# para apagar el pulso
pwm.duty(0)
# Crea una función para mapear los 0 a 180 grados
# a 20 a 120 valores de servicio pwm
def map(x, in_min, in_max, out_min, out_max):
    return int((x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min)
# Crea otra función para girar
# el servo según el ángulo de entrada
def servo(pin, angle):
    pin.duty(map(angle, 0, 180, 20, 120))

    
while True:
  Valor_PIR = PIR.value()
  #si se descomenta la line 26 (la función print) se mostrará en la consola
  #el valor lógico que se obtiene del sensor de movimiento el cual, al ser
  #lógico, solo puede ser 0(si no hay movimiento) y 1(si hay movimiento)
  print(PIR.value())
  if Valor_PIR == 1:
    
    servo(pwm, 90)
    sleep(5)
    servo(pwm, 0)

    display.fill(0)   
    display.show()
    display.text('COMIDA SERVIDA', 0,0)
    display.show()
    
    #activar alarma
    buzzer.init(freq=1047, duty=512)
    #Cuanto timepo se activará la alarma
    sleep(5)
    #apagar alarma
    buzzer.init(freq=1047, duty=0)

    display.fill(0)   
    display.show()
    display.text('...', 0,0)
    display.show()