"""
MicroPython IoT Weather Station Example for Wokwi.com
To view the data:
1. Go to http://www.hivemq.com/demos/websocket-client/
2. Click "Connect"
3. Under Subscriptions, click "Add New Topic Subscription"
4. In the Topic field, type "wokwi-weather" then click "Subscribe"
Now click on the DHT22 sensor in the simulation,
change the temperature/humidity, and you should see
the message appear on the MQTT Broker, in the "Messages" pane.
Copyright (C) 2022, Uri Shaked
https://wokwi.com/arduino/projects/322577683855704658
"""
"""
Sistema de irrigação inteligente IoT baseado em LoRa com ESP8266
Adaptado do exemplo original de estação meteorológica em MicroPython para Wokwi.com
"""
import network
import time
from machine import Pin
import dht
import ujson
from umqtt.simple import MQTTClient
# Parâmetros do Servidor MQTT
MQTT_CLIENT_ID = "micropython-weather-demo"
MQTT_BROKER = "broker.mqttdashboard.com"
MQTT_USER = ""
MQTT_PASSWORD = ""
MQTT_TOPIC = "wokwi-weather"
# Configuração dos pinos
sensor_ambiente = dht.DHT22(Pin(15)) # Sensor de temperatura e umidade do ambiente no pino 15
sensor_solo = dht.DHT22(Pin(0)) # Sensor de temperatura e umidade do solo no pino 0
bomba_solo = Pin(2, Pin.OUT) # Relé para irrigação do solo no pino 2
bomba_ambiente = Pin(4, Pin.OUT) # Segundo relé para controle da umidade do ambiente no pino 4
# Variáveis para armazenar os valores anteriores
prev_temp_ambiente = None
prev_humidity_ambiente = None
prev_temp_solo = None
prev_humidity_solo = None
bomba_solo_status = "Desligado"
bomba_ambiente_status = "Desligado"
# Conexão à rede Wi-Fi
print("Conectando ao WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '') # SSID e senha da rede Wi-Fi
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Conectado!")
# Conexão ao servidor MQTT
print("Conectando ao servidor MQTT... ", end="")
client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER, user=MQTT_USER, password=MQTT_PASSWORD)
client.connect()
print("Conectado!")
while True:
# Medição das condições do ambiente
sensor_ambiente.measure()
temp_ambiente = sensor_ambiente.temperature()
humidity_ambiente = sensor_ambiente.humidity()
# Medição das condições do solo
sensor_solo.measure()
temp_solo = sensor_solo.temperature()
humidity_solo = sensor_solo.humidity()
# Verifica se houve mudança nos valores de temperatura ou umidade do ambiente
if (temp_ambiente != prev_temp_ambiente) or (humidity_ambiente != prev_humidity_ambiente):
print("Condições do ambiente:")
print(" - Temperatura: {:.1f} ºC".format(temp_ambiente))
print(" - Umidade: {:.1f} %".format(humidity_ambiente))
prev_temp_ambiente = temp_ambiente
prev_humidity_ambiente = humidity_ambiente
# Envia os dados para o servidor MQTT apenas quando houver mudanças
message = ujson.dumps({
"condicoes_ambiente": {
"temperatura": temp_ambiente,
"umidade": humidity_ambiente
},
"bomba_solo_status": bomba_solo_status,
"bomba_ambiente_status": bomba_ambiente_status
})
print("Reportando para o tópico MQTT {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)
# Verifica a umidade do ambiente e aciona a bomba do ambiente se estiver abaixo de 80%
if humidity_ambiente < 80:
print("Umidade do ambiente abaixo de 80%. Ligando a bomba do ambiente.")
bomba_ambiente.value(1)
bomba_ambiente_status = "Ligado"
else:
print("Umidade do ambiente acima de 80%. Desligando a bomba do ambiente.")
bomba_ambiente.value(0)
bomba_ambiente_status = "Desligado"
# Verifica se houve mudança nos valores de temperatura ou umidade do solo
if (temp_solo != prev_temp_solo) or (humidity_solo != prev_humidity_solo):
print("Condições do solo:")
print(" - Temperatura: {:.1f} ºC".format(temp_solo))
print(" - Umidade: {:.1f} %".format(humidity_solo))
prev_temp_solo = temp_solo
prev_humidity_solo = humidity_solo
# Verifica se a umidade do solo está abaixo de 65%
if humidity_solo < 65:
print("Umidade do solo abaixo de 65%. Ligando a bomba do solo.")
bomba_solo.value(1)
bomba_solo_status = "Ligado"
else:
print("Umidade do solo acima de 65%. Desligando a bomba do solo.")
bomba_solo.value(0)
bomba_solo_status = "Desligado"
# Envia os dados para o servidor MQTT
message = ujson.dumps({
"condicoes_ambiente": {
"temperatura": temp_ambiente,
"umidade": humidity_ambiente
},
"condicoes_solo": {
"temperatura": temp_solo,
"umidade": humidity_solo
},
"bomba_solo_status": bomba_solo_status,
"bomba_ambiente_status": bomba_ambiente_status
})
print("Reportando para o tópico MQTT {}: {}".format(MQTT_TOPIC, message))
client.publish(MQTT_TOPIC, message)
# Aguarda um segundo antes de fazer a próxima leitura
time.sleep(1)