import time
from machine import Pin, ADC, PWM, I2C
import dht
from umqtt.simple import MQTTClient
import ujson
import ssd1306
from ssd1306 import SSD1306_I2C
import network
# Wi-Fi
SSID = 'Wokwi-GUEST'
PASSWORD = ''
# MQTT sem TLS (broker público)
MQTT_BROKER = 'broker.hivemq.com'
MQTT_PORT = 1883
CLIENT_ID = 'gustavoguimaraes061'
TOPIC = b'seguranca/casa/dados/dashboard'
# ====== Sensores ======
pir = Pin(15, Pin.IN)
trigger = Pin(5, Pin.OUT)
echo = Pin(18, Pin.IN)
mq2 = Pin(34, Pin.IN)
dht_sensor = dht.DHT22(Pin(22))
ldr = ADC(Pin(35))
# ====== Atuadores ======
buzzer = PWM(Pin(25), freq=1000, duty=0)
led = Pin(4, Pin.OUT)
rele = Pin(21, Pin.OUT)
servo = PWM(Pin(19), freq=50)
motor_button = Pin(13, Pin.IN, Pin.PULL_DOWN)
# Simulação do Motor DC para fechar/abrir portões automaticamente
motor_in1 = Pin(12, Pin.OUT)
motor_in2 = Pin(14, Pin.OUT)
i2c = I2C(0, scl=Pin(27), sda=Pin(32))
# Cria o display com 128x64 pixels
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# ====== Funções ======
def medir_distancia():
trigger.value(0)
time.sleep_us(2)
trigger.value(1)
time.sleep_us(10)
trigger.value(0)
while echo.value() == 0:
pass
start = time.ticks_us()
while echo.value() == 1:
pass
end = time.ticks_us()
duration = end - start
distance = (duration / 2) / 29.1
return distance
def acionar_buzzer(t):
buzzer.duty(512)
time.sleep(t)
buzzer.duty(0)
def mover_servo(angle):
duty = int((angle / 180) * 102 + 26) # 0-180 graus
servo.duty(duty)
def motor_dc_ligar(sentido='horario'):
if sentido == 'horario':
motor_in1.value(1)
motor_in2.value(0)
else:
motor_in1.value(0)
motor_in2.value(1)
def motor_dc_desligar():
motor_in1.value(0)
motor_in2.value(0)
# ====== Conectar Wi-Fi ======
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(SSID, PASSWORD)
while not wifi.isconnected():
pass
print("Wi-Fi conectado:", wifi.ifconfig())
oled.fill(0)
oled.text("Wi-Fi conectado!", 0, 0)
oled.show()
# ====== Conectar MQTT ======
client = MQTTClient(CLIENT_ID, MQTT_BROKER, port=MQTT_PORT)
client.connect()
oled.fill(0)
oled.text("MQTT conectado!", 0, 0)
oled.show()
# ====== Loop principal ======
while True:
# PIR
print("Loop ativo")
if pir.value():
print("Movimento detectado!")
led.value(1)
acionar_buzzer(0.5)
mover_servo(90) # Tranca aberta
motor_dc_ligar()
time.sleep(2)
motor_dc_desligar()
else:
led.value(0)
mover_servo(0) # Tranca fechada
# Ultrassônico
distancia = medir_distancia()
if distancia < 10:
acionar_buzzer(0.5)
# MQ-2
if mq2.value() == 1:
print("Gás detectado!")
acionar_buzzer(1)
rele.value(1) # Liga exaustor
else:
rele.value(0)
# DHT22
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
print("Temp:", temp, "Hum:", hum)
except OSError as e:
print("Erro ao ler DHT22", e)
temp = None
hum = None
# LDR
luminosidade = ldr.read()
luminosidade_pct = int((luminosidade / 4023) * 100)
if luminosidade < 100:
led.value(1)
print("Ambiente escuro")
else:
led.value(0)
print("Ambiente claro")
# Motor DC simulado com botão
if motor_button.value():
motor_dc_ligar()
else:
motor_dc_desligar()
# OLED - status do motor
oled.fill(0)
oled.text("T: {} C".format(temp if temp is not None else "--"), 0, 0)
oled.text("Movimento: {}".format("SIM" if pir.value() else "NAO"), 0, 10)
oled.text("GAS: {}".format("SIM" if mq2.value() else "NAO"), 0, 20)
oled.text("Dist: {:.0f}cm".format(distancia), 0, 30)
oled.text("Luz: {}%".format(luminosidade_pct), 0, 40)
oled.text("Motor: {}".format("ON" if motor_button.value() else "OFF"), 0, 50)
oled.show()
# Enviar dados MQTT
dados = {
"movimento": "DETECTADO" if pir.value() else "NAO DETECTADO",
"distancia": distancia,
"gas": "SIM" if mq2.value() else "NAO",
"temperatura": temp,
"umidade": hum,
"luz": luminosidade_pct,
"motor_dc": "ON" if motor_button.value() else "OFF"
}
client.publish(TOPIC, ujson.dumps(dados))
time.sleep(2)
Motor DC para abertura automática
PIR - Movimento
LDR - Luz
Ultrassônico - distância
DHT22 - temperatura
MQ2 - Gás
Servo motor
Exaustor
Alarme