# Importa classes e módulos necessários
from machine import ADC, Pin, SoftI2C # Importa ADC para leitura analógica, Pin para controle de pinos GPIO e SoftI2C para comunicação I2C
import time  # Importa módulo de tempo para pausas e delays
import dht  # Importa módulo DHT para sensor de temperatura e umidade
from lcd_api import LcdApi  # Importa a API do LCD para controle do display
from i2c_lcd import I2cLcd  # Importa classe específica para displays LCD conectados via I2C

# Cria um objeto ADC e define as conexões dos componentes
umidade_solo = ADC(Pin(35, Pin.IN))  # Cria um objeto ADC no pino 35 configurado como entrada para leitura do sensor de umidade do solo
motor_bomba = Pin(12, Pin.OUT)  # Define o pino 12 como saída para controlar a bomba d'água
ventilador = Pin(14, Pin.OUT)  # Define o pino 14 como saída para controlar o ventilador e exaustor
LampadaGrow = Pin(27, Pin.OUT)  # Define o pino 5 como saída para controlar o lampada
dht_sensor = dht.DHT22(Pin(13))  # Cria um objeto DHT22 no pino 33 para leitura de temperatura e umidade

# Configurações do display LCD
I2C_ADDR = 0x27  # Define o endereço I2C do display LCD
linhas = 2  # Define o número de linhas do display
colunas = 16  # Define o número de colunas do display
i2c = SoftI2C(scl=Pin(18), sda=Pin(19), freq=10000)  # Inicializa a interface I2C com pinos SCL e SDA e frequência de 10000 Hz
display = I2cLcd(i2c, I2C_ADDR, linhas, colunas)  # Cria um objeto display LCD utilizando a interface I2C configurada

def umidade():
    # Ler um valor analógico bruto no intervalo 0-4095
    umidadeSolo = umidade_solo.read() / 4  # Lê o valor do sensor de umidade do solo e divide por 4 para normalizar para 0-1023
    dht_sensor.measure()  # Realiza uma leitura do sensor DHT22
    temp = dht_sensor.temperature()  # Obtém a temperatura medida
    humi = dht_sensor.humidity()  # Obtém a umidade medida
    print(umidadeSolo)  # Imprime o valor da umidade do solo no console
    print('Temperatura: ',temp)
    print('Umidade: ',humi)
    return temp, humi, umidadeSolo

def web_page():
    temp, humi, umidadeSolo = umidade()
    html="""<!DOCTYPE html>
<html lang="pt-br">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <style>
    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        }
        body {
            width: 100vw;
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
        }
        #DivP {
            width: 340px;
            height: 360px;
            padding: 15px;
            border-radius: 15px;
            border: 5px solid rgb(105, 255, 5);
            box-shadow: 0px 0px 30px green;
            background-color: azure;
        }
        h1 {
            text-align: center;
            margin: 30px 0px;
            text-shadow: 0px 0px 25px rgba(0, 0, 0, 0.842);
            border-radius: 15px;
        }
        h2{
            font-size: 15px;
        }
        .Sensores {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 200px;
            height: 50px;
            border: 3px, solid, rgb(3, 255, 24);
            border-radius: 10px;
            box-shadow: 0px 0px 10px green;
        }
        .organizarDivs {
            display: flex;
            align-items: center;
            justify-content: center;
            margin: 30px 0px ;
        }
        .valorSensor {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 60px;
            height: 50px;
            border: 3px, solid, rgb(3, 255, 24);
            border-radius: 10px;
            box-shadow: 0px 0px 10px green;
            margin-left: 10px;
        }
    </style>
    <title>Estufa</title>
  </head>

  <body>
    <div id="DivP">
      <h1>ESTUFA MMS2AN</h1>

      <div class="organizarDivs">
        <div class="Sensores"><h2>TEMPERATURA DO AR</h2> </div>
        <div class="valorSensor1">""" + str(temp) + """</div>
      </div>

      <div class="organizarDivs">
        <div class="Sensores"><h2> UMIDADE DO AR</h2></div>
        <div class="valorSensor2">""" + str(humi) + """</div>
      </div>

      <div class="organizarDivs">
        <div class="Sensores"><h2> UMIDADE DO SOLO</h2></div>
        <div class="valorSensor3">""" + str(umidadeSolo) + """</div>
      </div>
    </div>
  </body>
</html>
"""


while True:  # Inicia um loop infinito
    temp, humi, umidadeSolo = umidade()
    LampadaGrow.value(1)
    

    #Se a temperatura e umidade do ar estiverem acima do necessário, os ventiladores serão ligados; caso contrário, serão desligados
    display.clear()  # Limpa o display
    display.move_to(0, 0)  # Move o cursor para a linha 0, coluna 0
    display.putstr("Umidade: ")  # Escreve "umidade: " no display
    display.move_to(10, 0)  # Move o cursor para a linha 0, coluna 10
    display.putstr(str(humi))  # Escreve a umidade medida no display
    display.move_to(0, 1)  # Move o cursor para a linha 1, coluna 0
    display.putstr('Temperatura: ')  # Escreve "Temperatura: " no display
    display.move_to(12, 1)  # Move o cursor para a linha 1, coluna 12
    display.putstr(str(temp))  # Escreve a temperatura medida no display
    if temp >= 25.00 and humi >= 41.00:
        ventilador.value(1)
    else:
        ventilador.value(0)

    #Se a umidade do solo estiver acima do adequado para o cultivo, desliga a bomba; caso contrário, liga.
    if umidadeSolo >= 400:
        motor_bomba.value(0)  # Desliga a bomba de água
    else:
       motor_bomba.value(1)  # Liga a bomba de água

    """
    # agora começa a parte da criação do servidor
    try:
        if gc.mem_free() < 102000:
            gc.collect()
        conn, addr = s.accept()
        conn.settimeout(3.0)
        print('Got a connection from %s' % str(addr))
        request = conn.recv(1024)
        conn.settimeout(None)
        request = str(request)
        print('Content = %s' % request)
        response = web_page()
        conn.send('HTTP/1.1 200 OK\n')
        conn.send('Content-Type: text/html\n')
        conn.send('Connection: close\n\n')
        conn.sendall(response)
        conn.close()
    except OSError as e:
        conn.close()
        print('Connection closed')
    # Fim da parte do servidor web
    """
    
    time.sleep(1)  # Espera por 50 milissegundos antes de realizar a próxima leitura
$abcdeabcde151015202530354045505560fghijfghij
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module