# ==========================================================
# Monitor de Qualidade do Ar
# ESP32 + MQ-2 + OLED + Relé
# ==========================================================
from machine import Pin, ADC, SoftI2C
from ssd1306 import SSD1306_I2C
import time
# -----------------------------
# Configuração dos componentes
# -----------------------------
# Sensor MQ-2
mq2_analogico = ADC(Pin(34))
mq2_analogico.atten(ADC.ATTN_11DB)
mq2_digital = Pin(27, Pin.IN)
# Relé
rele = Pin(12, Pin.OUT)
rele.value(0)
# Display OLED
i2c = SoftI2C(sda=Pin(21), scl=Pin(22))
display = SSD1306_I2C(128, 64, i2c)
# Valor limite
LIMITE_GAS = 2000
# -----------------------------
# Função para leitura do sensor
# -----------------------------
def ler_gas():
valor = mq2_analogico.read()
estado = mq2_digital.value()
return valor, estado
# -----------------------------
# Atualiza o display
# -----------------------------
def mostrar_dados(valor, estado, alarme):
display.fill(0)
display.text("Monitor MQ-2", 0, 0)
porcentagem = int((valor / 4095) * 100)
display.text("Gas:", 0, 16)
display.text(str(valor), 45, 16)
display.text("Nivel:", 0, 28)
display.text(str(porcentagem) + "%", 48, 28)
display.text("Sensor:", 0, 40)
if estado == 0:
display.text("ALERTA", 60, 40)
else:
display.text("OK", 60, 40)
if alarme:
display.text("Rele ON", 0, 54)
else:
display.text("Rele OFF", 0, 54)
display.show()
# -----------------------------
# Programa principal
# -----------------------------
print("Sistema iniciado.")
print("Altere o valor de ppm para testar.")
while True:
valor_gas, estado_sensor = ler_gas()
if valor_gas >= LIMITE_GAS or estado_sensor == 0:
alarme = True
else:
alarme = False
# Aciona o relé
rele.value(1 if alarme else 0)
# Atualiza o display
mostrar_dados(valor_gas, estado_sensor, alarme)
# Monitor Serial
print("-----------------------------")
print("AO:", valor_gas)
print("DO:", estado_sensor)
print("Nivel:", int((valor_gas / 4095) * 100), "%")
print("Rele:", "Ligado" if alarme else "Desligado")
time.sleep(1)