import network
from umqtt.simple import MQTTClient
from machine import Pin, ADC, I2C, RTC
import dht
import time
import ujson
import urequests
import ntptime
# --- CONFIGURAÇÕES ---
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASS = ""
MQTT_BROKER = "broker.hivemq.com"
MQTT_TOPIC = b"meteo/estacao/margenetlucas"
GOOGLE_SHEETS_URL = "https://script.google.com/macros/s/AKfycbwj9D-FYatdXHnhDGhlVWtp4fHjk-iIaxM_2gSr8LyFByKzo-NBB5a2wArIZUPhtmy2nA/exec"
# Controle de Médias
lista_temp = []
lista_umid = []
MAX_LEITURAS_RELATORIO = 10
# Pinos
DHT_PIN = 4
LDR_PIN = 32
MQ2_PIN = 33
BUTTON_PIN = 19
def connect_wifi():
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.connect(WIFI_SSID, WIFI_PASS)
while not sta.isconnected():
time.sleep(0.5)
print("Wi-Fi conectado!")
# Sincroniza a hora real via internet
try:
ntptime.settime()
print("Hora sincronizada!")
except:
print("Erro ao sincronizar hora.")
def get_data_hora():
# Ajuste de fuso horário (ex: -3 para Brasília)
UTC_OFFSET = -3 * 3600
t = time.time() + UTC_OFFSET
tm = time.localtime(t)
return "{:02d}/{:02d}/{:04d} {:02d}:{:02d}:{:02d}".format(tm[2], tm[1], tm[0], tm[3], tm[4], tm[5])
def send_to_sheets(t, h, dt):
try:
# Adicionado timestamp na URL para a planilha
url = f"{GOOGLE_SHEETS_URL}?temp={t}&umid={h}×tamp={dt.replace(' ', '%20')}"
res = urequests.get(url)
res.close()
return True
except:
return False
def gerar_relatorio_final():
global lista_temp, lista_umid
if not lista_temp: return
m_t = sum(lista_temp) / len(lista_temp)
m_u = sum(lista_umid) / len(lista_umid)
qtd = len(lista_temp)
data_ref = get_data_hora().split(' ')[0]
print("\n" + "="*30)
print("RELATÓRIO DIÁRIO DE MÉDIAS")
print(f"Data de Referência: {data_ref}")
print(f"Média Temperatura: {m_t:.2f} °C")
print(f"Média Umidade: {m_u:.2f} %")
print(f"Total de Leituras: {qtd}")
print("="*30 + "\n")
# Reset
lista_temp = []
lista_umid = []
# Inicialização
connect_wifi()
client = MQTTClient("esp32_lucas_estacao", MQTT_BROKER)
client.connect()
sensor = dht.DHT22(Pin(DHT_PIN))
ldr = ADC(Pin(LDR_PIN))
gas = ADC(Pin(MQ2_PIN))
while True:
try:
sensor.measure()
t = sensor.temperature()
h = sensor.humidity()
l = ldr.read()
g = gas.read()
dh = get_data_hora()
# 1. Envio MQTT (Node-RED)
payload = ujson.dumps({
"data_hora": dh,
"temp": t,
"umid": h,
"luz": l,
"gas": g
})
client.publish(MQTT_TOPIC, payload)
# 2. Persistência Google Sheets
send_to_sheets(t, h, dh)
# 3. Acúmulo para Médias
lista_temp.append(t)
lista_umid.append(h)
print(f"[{dh}] T:{t}°C H:{h}% | Memória: {len(lista_temp)}/{MAX_LEITURAS_RELATORIO}")
# Verifica se é hora do relatório
if len(lista_temp) >= MAX_LEITURAS_RELATORIO:
gerar_relatorio_final()
time.sleep(10) # 10 segundos para o teste ser dinâmico
except Exception as e:
print("Erro:", e)
time.sleep(5)