Mini fazenda inteligente ESP32 (MicroPython)
Os projetos de mini fazendas inteligentes usam a placa ESP32 e o MicroPython. Use o sensor DHT11 para monitorar a temperatura e a umidade para controlar o ventilador com o Auto e use o sensor de umidade do solo para controlar a bomba de água com o Auto. A página da Web pode controlar o ventilador e a bomba de forma automática ou manual.






Código MicroPython – Projeto de mini fazenda inteligente ESP32
from machine import Pin, SoftI2C
from machine import Pin, ADC
from i2c_lcd import I2cLcd
import network
import time
import socket
import _thread
import dht
# FAN
fan = Pin(32, Pin.OUT)
fan.off()
# PUMP
pump = Pin(33, Pin.OUT)
pump.off()
# LCD
i2c = SoftI2C(scl=Pin(22), sda=Pin(21),freq=100000)
lcd = I2cLcd(i2c, 0x27,2,16)
time.sleep(1)
lcd.clear()
# DHT11
d = dht.DHT11(Pin(23))
t = 0
h = 0
def check_temp():
print('Check Temp Starting...')
global t
global h
while True:
try:
d.measure()
time.sleep(2)
t = d.temperature()
h = d.humidity()
temp = 'Temp: {:.0f} C'.format(t)
humid = 'Humidity: {:.0f} %'.format(h)
print('DHT11:', t, h)
time.sleep(5)
except:
pass
# Soil Moisture
soil = ADC(Pin(35))
m = 100
min_moisture=0
max_moisture=4095
soil.atten(ADC.ATTN_11DB) #Full range: 3.3v
soil.width(ADC.WIDTH_12BIT) #range 0 to 4095
def check_moisture():
print('Check Moisture Starting...')
global m
while True:
try:
soil.read()
time.sleep(2)
m = (max_moisture-soil.read())*100/(max_moisture-min_moisture)
moisture = 'Soil Moisture: {:.1f} %'.format(m)
print("Soil Moisture: " + "%.1f" % m +"% (adc: "+str(soil.read())+")")
time.sleep(5)
except:
pass
# START
text = 'Starting...'
lcd.putstr(text)
# WIFI
wifi = 'Your_ssid' # your wifi ssid
password = 'Your_Password' # your wifi password
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
time.sleep(3)
wlan.connect(wifi, password)
time.sleep(5)
status = wlan.isconnected() # True/False
ip ,_ ,_ ,_ = wlan.ifconfig()
if status == True:
lcd.clear()
text = 'IP:{}'.format(ip)
lcd.putstr(text)
time.sleep(2)
lcd.clear()
lcd.putstr('Connected')
else:
lcd.clear()
lcd.putstr('Disconnected')
# HTML
html_fan_on = '''
<!doctype html>
<html lang="en">
<body>
<div class="container">
<form>
<center>
<table>
<tr>
<th><h2 style="background-color:#ffa500; font-family:verdana;">FAN: ON</h2>
<button class="button button1" name="FAN" value="ON" type="submit">ON</button>
<button class="button button2" name="FAN" value="OFF" type="submit">OFF</button>
<button class="button button3" name="FAN" value="AUTO" type="submit">AUTO</button></th>
</tr>
</table><br>
</center>
</form>
</div>
</body>
</html>
'''
html_fan_off = '''
<!doctype html>
<html lang="en">
<body>
<div class="container">
<form>
<center>
<table>
<tr>
<th><h2 style="background-color:#e7e7e7; font-family:verdana;">FAN: OFF</h2>
<button class="button button1" name="FAN" value="ON" type="submit">ON</button>
<button class="button button2" name="FAN" value="OFF" type="submit">OFF</button>
<button class="button button3" name="FAN" value="AUTO" type="submit">AUTO</button></th>
</tr>
</table><br>
</center>
</form>
</div>
</body>
</html>
'''
html_fan_auto = '''
<!doctype html>
<html lang="en">
<body>
<div class="container">
<form>
<center>
<table>
<tr>
<th><h2 style="background-color:#ffa500; font-family:verdana;">FAN: AUTO</h2>
<button class="button button1" name="FAN" value="ON" type="submit">ON</button>
<button class="button button2" name="FAN" value="OFF" type="submit">OFF</button>
<button class="button button3" name="FAN" value="AUTO" type="submit">AUTO</button></th>
</tr>
</table><br>
</center>
</form>
</div>
</body>
</html>
'''
html_pump_on = '''
<!doctype html>
<html lang="en">
<body>
<div class="container">
<form>
<center>
<table>
<tr>
<th><h2 style="background-color:#ffa500; font-family:verdana;">PUMP: ON</h2>
<button class="button button1" name="PUMP" value="ON" type="submit">ON</button>
<button class="button button2" name="PUMP" value="OFF" type="submit">OFF</button>
<button class="button button3" name="PUMP" value="AUTO" type="submit">AUTO</button></th>
</tr>
</table><br>
</center>
</form>
</div>
</body>
</html>
'''
html_pump_off = '''
<!doctype html>
<html lang="en">
<body>
<div class="container">
<form>
<center>
<table>
<tr>
<th><h2 style="background-color:#e7e7e7; font-family:verdana;">PUMP: OFF</h2>
<button class="button button1" name="PUMP" value="ON" type="submit">ON</button>
<button class="button button2" name="PUMP" value="OFF" type="submit">OFF</button>
<button class="button button3" name="PUMP" value="AUTO" type="submit">AUTO</button></th>
</tr>
</table><br>
</center>
</form>
</div>
</body>
</html>
'''
html_pump_auto = '''
<!doctype html>
<html lang="en">
<body>
<div class="container">
<form>
<center>
<table>
<tr>
<th><h2 style="background-color:#ffa500; font-family:verdana;">PUMP: AUTO</h2>
<button class="button button1" name="PUMP" value="ON" type="submit">ON</button>
<button class="button button2" name="PUMP" value="OFF" type="submit">OFF</button>
<button class="button button3" name="PUMP" value="AUTO" type="submit">AUTO</button></th>
</tr>
</table><br>
</center>
</form>
</div>
</body>
</html>
'''
html1 = '''
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<title>ESP32 - Status</title>
<style>
.button {
border: none;
border-radius: 4px;
color: white;
padding: 7px 12px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 1px 1px;
cursor: pointer;
}
.button1 {background-color: #0d6efd;} /* Blue */
.button2 {background-color: #dc3545;} /* Red */
.button3 {background-color: #198754;} /* Green */
</style>
</head>
<body style="font-family:verdana;">
<div class="container">
<form>
<center>
<h2><b>ESP32 Mini Smart Farm<b></h2>
<h2>
'''
html2 = '''
</h2><br>
</center>
</form>
</div>
</body>
</html>
'''
html_br = '''
<br>
'''
# RUN
global fan_status
global pump_status
fan_status = 'OFF'
pump_status = 'OFF'
def runserver():
global fan_status
global pump_status
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = ''
port = 80
s.bind((host,port))
s.listen(5)
while True:
client, addr = s.accept()
print('Connection from: ', addr)
data = client.recv(1024).decode('utf-8')
print([data])
try:
check = data.split()[1].replace('/','').replace('?','')
print('CHECK:',check)
temp = 'Temp: {:.0f} C'.format(t)
humid = 'Humidity: {:.0f} %'.format(h)
moisture = 'Soil Moisture: {:.1f} %'.format(m)
if check != '':
device_name, device_value = check.split('=')
if device_name == 'FAN' and device_value == 'ON':
fan.on()
fan_status = 'ON'
elif device_name == 'FAN' and device_value == 'OFF':
fan.off()
fan_status = 'OFF'
elif device_name == 'FAN' and device_value == 'AUTO':
fan_status = 'AUTO'
elif device_name == 'PUMP' and device_value == 'ON':
pump.on()
pump_status = 'ON'
elif device_name == 'PUMP' and device_value == 'OFF':
pump.off()
pump_status = 'OFF'
elif device_name == 'PUMP' and device_value == 'AUTO':
pump_status = 'AUTO'
else:
pass
if fan_status == 'OFF' and pump_status == 'OFF':
client.send(html1 + temp + html_br + humid + html_br + moisture + html2 + html_fan_off + html_pump_off)
client.close()
elif fan_status == 'ON' and pump_status == 'OFF':
client.send(html1 + temp + html_br + humid + html_br + moisture + html2 + html_fan_on + html_pump_off)
client.close()
elif fan_status == 'OFF' and pump_status == 'ON':
client.send(html1 + temp + html_br + humid + html_br + moisture + html2 + html_fan_off + html_pump_on)
client.close()
elif fan_status == 'ON' and pump_status == 'ON':
client.send(html1 + temp + html_br + humid + html_br + moisture + html2 + html_fan_on + html_pump_on)
client.close()
elif fan_status == 'AUTO' and pump_status == 'OFF':
client.send(html1 + temp + html_br + humid + html_br + moisture + html2 + html_fan_auto + html_pump_off)
client.close()
elif fan_status == 'AUTO' and pump_status == 'ON':
client.send(html1 + temp + html_br + humid + html_br + moisture + html2 + html_fan_auto + html_pump_on)
client.close()
elif fan_status == 'OFF' and pump_status == 'AUTO':
client.send(html1 + temp + html_br + humid + html_br + moisture + html2 + html_fan_off + html_pump_auto)
client.close()
elif fan_status == 'ON' and pump_status == 'AUTO':
client.send(html1 + temp + html_br + humid + html_br + moisture + html2 + html_fan_on + html_pump_auto)
client.close()
elif fan_status == 'AUTO' and pump_status == 'AUTO':
client.send(html1 + temp + html_br + humid + html_br + moisture + html2 + html_fan_auto + html_pump_auto)
client.close()
else:
pass
global fan_status
global pump_status
except:
pass
def show_lcd():
while True:
try:
temp = 'Temp: {:.0f} C'.format(t)
humid = 'Humidity: {:.0f} %'.format(h)
moisture = 'Moisture: {:.1f} %'.format(m)
fan_s = 'FAN : {:}'.format(fan_status)
pump_s = 'PUMP: {:}'.format(pump_status)
lcd.clear()
lcd.putstr(fan_s)
lcd.move_to(0,1)
lcd.putstr(pump_s)
time.sleep(2)
lcd.clear()
lcd.putstr(temp)
lcd.move_to(0,1)
lcd.putstr(humid)
time.sleep(2)
lcd.clear()
lcd.putstr(moisture)
time.sleep(2)
except:
pass
def auto_pump():
global pump_status
while True:
if m < 20 and pump_status == 'AUTO':
time.sleep(1)
pump.on()
pump_status = 'ON (AUTO)'
time.sleep(5) # TURN ON PUMP 5 sec
pump.off()
pump_status = 'OFF (AUTO)'
pump_status = 'AUTO'
time.sleep(10)
else:
pass
def auto_fan():
global fan_status
while True:
if t > 30 and fan_status == 'AUTO':
time.sleep(1)
fan.on()
fan_status = 'ON (AUTO)'
time.sleep(10) # TURN ON FAN 10 sec
fan.off()
fan_status = 'OFF (AUTO)'
fan_status = 'AUTO'
time.sleep(10)
else:
pass
_thread.start_new_thread(runserver,())
_thread.start_new_thread(check_temp,())
_thread.start_new_thread(check_moisture,())
_thread.start_new_thread(show_lcd,())
_thread.start_new_thread(auto_pump,())
_thread.start_new_thread(auto_fan,())
Código disponível no GitHub (Aqui)
Please follow and like us: