# 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