#Marcelo Portillo
import urequests
import network
import time
import ujson
import ssd1306
from machine import Pin, ADC, I2C
from time import sleep


# ==================  SECCION SIMULACION WIFI ==================================

#Parametros de WiFi
SSID = "Wokwi-GUEST"
PASSWORD = ""

#Conexión a Wifi
def connect_wifi():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(SSID, PASSWORD)

    print('Conectando a la red...')
    while not wlan.isconnected():
        time.sleep(1)
    print('Conectado a la red:', wlan.ifconfig())

#Iniciamos ESP32
connect_wifi()
# ===============================================================================

# ============= Función para enviar un POST a la API ============================
def send_post_request(medicion):
    url = "https://aproximacion-evidencia1.onrender.com/api/gas/data"
    data = {'medicion': medicion }
    json_data = ujson.dumps(data)
 
    # Enviar la solicitud POST
    try:
        print("Enviando solicitud POST a la API...")
        response = urequests.post(url, data=json_data, headers={"Content-Type": "application/json"})

        print("Código de respuesta:", response.status_code)
        print("Respuesta del servidor:", response.text)
        response.close()
    except Exception as e:
        print("Error al enviar la solicitud:", e)
# ===============================================================================

# Configuración del sensor MQ135 (gases)
mq135_pin = ADC(Pin(34))  # MQ135 conectado a GPIO34 (pin analógico)
mq135_pin.atten(ADC.ATTN_11DB)  # Rango de 0 a 3.3V

alto= 64
ancho= 128

# Configuración de la pantalla OLED SSD1306
i2c = I2C(0, scl=Pin(22), sda=Pin(21))  # Conexión I2C (SCL a GPIO22, SDA a GPIO21)
oled = ssd1306.SSD1306_I2C(ancho, alto, i2c)  # Tamaño 128x64 de la pantalla OLED #oled = SSD1306_I2C(ancho, alto, i2c)

# Función para leer el sensor MQ135
def read_mq135():
    gas_value = mq135_pin.read()  # Leer el valor analógico (0 a 4095)
    # Conversión a PPM (ejemplo simple)
    gas_ppm = (gas_value / 4095) * 1200  # Aproximación a PPM (escala de 0 a 1000)
    return gas_ppm

# Función para mostrar los datos en la pantalla OLED
def display_data(gas_ppm, mensaje):
    oled.fill(0)  # Limpiar la pantalla
    oled.text("Calidad del Aire", 0, 0)
    oled.text("Gas: {:.2f} PPM".format(gas_ppm), 0, 20)
    oled.text(mensaje,0,40)
    oled.show()

# Bucle principal
while True:
    gas_ppm = read_mq135()  # Leer el valor del sensor MQ135

    mensaje = ""
    
    if gas_ppm <= 10:
        mensaje = "CO Seguro"
    elif gas_ppm > 10 and gas_ppm <= 50:
        mensaje = "CO Moderado"
    elif gas_ppm > 50 and gas_ppm <= 200:        
        mensaje= "CO Peligroso"
    elif gas_ppm > 200 and gas_ppm <= 1200:
        mensaje= "CO Criticamente Peligroso"

    #Enviar POST
    send_post_request(gas_ppm)

    display_data(gas_ppm, mensaje)    # Mostrar los datos en la pantalla OLED
    print(gas_ppm, "PPM", mensaje)
    sleep(10)  # Esperar 2 segundos entre lecturas