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.

Diagrama de ligação do projeto de mini fazenda inteligente ESP32
Diagrama de ligação do projeto de mini fazenda inteligente ESP32
Placa de controle de mini fazenda inteligente com ESP32
Placa de controle de mini fazenda inteligente com ESP32
Monitore a temperatura e a umidade com o ESP32 e a tela LCD
Monitore a temperatura e a umidade com o ESP32 e a tela LCD
Monitore o nível de umidade do solo com ESP32 e tela LCD
Monitore o nível de umidade do solo com ESP32 e tela LCD
Monitore o status do ventilador e da bomba com o ESP32
Monitore o status do ventilador e da bomba com o ESP32
Monitoramento e controle da mini fazenda inteligente na Web (servidor Web MicroPython)
Monitoramento e controle da mini fazenda inteligente na Web (servidor Web MicroPython)

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:
error0
fb-share-icon
Tweet 20
fb-share-icon20